1. 程式人生 > >Python實現凱撒密碼的加密與解密

Python實現凱撒密碼的加密與解密

在密碼學中,我們把想要加密的訊息叫做明文(plain text)。把明文轉換成加密後的訊息叫做對明文加密(encrypting),明文加密後變成(cipher text)。

凱撒密碼的金鑰是1到26之間的一個數字。除非知道這個鍵(即用於加密訊息的數字),否則無法對這個保密的程式碼進行解密。凱撒密碼是人類最早發明的密碼之一,原理是獲取訊息中的每個字母,並用一個“移位後的”字母來代替它,如果把字母A移動1格,就會得到字母B,移動兩格,就會得到字母C。

程式一共有3種模式,分別是加密模式、解密模式和暴力破解。暴力破解(brute force)是對每一種可能的祕鑰進行嘗試,直到找到正確的金鑰的一種技術。因為只有26種可能的金鑰,用每種可能的金鑰進行破解,這是一件很容易的事。

# Caesar Cipher

MAX_KEY_SIZE = 26

def getMode():
    while True:
        print('請選擇加密或解密模式,或者選擇暴力破解:')
        print('加密:encrypt(e)')
        print('解密:decrypt(d)')
        print('暴力破解:brute(b)')
        mode = input().lower()
        if mode in 'encrypt e decrypt d brute b'.split():
            return
mode else: print('請輸入"encrypt"或"e"或"decrypt"或"d"或"brute"或"b"!') def getMessage(): print('請輸入你的資訊:') return input() def getKey(): key = 0 while True: print('請輸入金鑰數字(1-%s)' % (MAX_KEY_SIZE)) key = int(input()) if (key >=1 and key <= MAX_KEY_SIZE): return
key def getTranslatedMessage(mode, message, key): if mode[0] == 'd': key = -key translated = '' for symbol in message: if symbol.isalpha(): num = ord(symbol) num += key if symbol.isupper(): if num > ord('Z'): num -= 26 elif num < ord('A'): num += 26 elif symbol.islower(): if num > ord('z'): num -= 26 elif num < ord('a'): num += 26 translated += chr(num) else: translated += symbol return translated mode = getMode() message = getMessage() if mode[0] != 'b': key = getKey() print('你要翻譯的資訊是:') if mode[0] != 'b': print(getTranslatedMessage(mode, message, key)) else: for key in range(1, MAX_KEY_SIZE + 1): print(key, getTranslatedMessage('decrypt', message, key))

加密執行示例:

請選擇加密或解密模式:
加密:encrypt(e)
解密:decrypt(d)
encrypt
請輸入你的資訊:
The sky above the port was the color of television, tuned to a dead channel.
請輸入金鑰數字(1-26)
13
你要翻譯的資訊是:
Gur fxl nobir gur cbeg jnf gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.

解密執行示例:

請選擇加密或解密模式:
加密:encrypt(e)
解密:decrypt(d)
decrypt
請輸入你的資訊:
Gur fxl nobir gur cbeg jnf gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
請輸入金鑰數字(1-26)
13
你要翻譯的資訊是:
The sky above the port was the color of television, tuned to a dead channel.

暴力破解示例:

請選擇加密或解密模式,或者選擇暴力破解:
加密:encrypt(e)
解密:decrypt(d)
暴力破解:brute(b)
brute
請輸入你的資訊:
Lwcjba uig vwb jm xtmiaivb, jcb kmzbiqvbg qa ijaczl.
你要翻譯的資訊是:
1 Kvbiaz thf uva il wslhzhua, iba jlyahpuaf pz hizbyk.
2 Juahzy sge tuz hk vrkgygtz, haz ikxzgotze oy ghyaxj.
3 Itzgyx rfd sty gj uqjfxfsy, gzy hjwyfnsyd nx fgxzwi.
4 Hsyfxw qec rsx fi tpiewerx, fyx givxemrxc mw efwyvh.
5 Grxewv pdb qrw eh sohdvdqw, exw fhuwdlqwb lv devxug.
6 Fqwdvu oca pqv dg rngcucpv, dwv egtvckpva ku cduwtf.
7 Epvcut nbz opu cf qmfbtbou, cvu dfsubjouz jt bctvse.
8 Doubts may not be pleasant, but certainty is absurd.
9 Cntasr lzx mns ad okdzrzms, ats bdqszhmsx hr zartqc.
10 Bmszrq kyw lmr zc njcyqylr, zsr acpryglrw gq yzqspb.
11 Alryqp jxv klq yb mibxpxkq, yrq zboqxfkqv fp xyproa.
12 Zkqxpo iwu jkp xa lhawowjp, xqp yanpwejpu eo wxoqnz.
13 Yjpwon hvt ijo wz kgzvnvio, wpo xzmovdiot dn vwnpmy.
14 Xiovnm gus hin vy jfyumuhn, von wylnuchns cm uvmolx.
15 Whnuml ftr ghm ux iextltgm, unm vxkmtbgmr bl tulnkw.
16 Vgmtlk esq fgl tw hdwsksfl, tml uwjlsaflq ak stkmjv.
17 Uflskj drp efk sv gcvrjrek, slk tvikrzekp zj rsjliu.
18 Tekrji cqo dej ru fbuqiqdj, rkj suhjqydjo yi qrikht.
19 Sdjqih bpn cdi qt eatphpci, qji rtgipxcin xh pqhjgs.
20 Rciphg aom bch ps dzsogobh, pih qsfhowbhm wg opgifr.
21 Qbhogf znl abg or cyrnfnag, ohg pregnvagl vf nofheq.
22 Pagnfe ymk zaf nq bxqmemzf, ngf oqdfmuzfk ue mnegdp.
23 Ozfmed xlj yze mp awpldlye, mfe npceltyej td lmdfco.
24 Nyeldc wki xyd lo zvokckxd, led mobdksxdi sc klcebn.
25 Mxdkcb vjh wxc kn yunjbjwc, kdc lnacjrwch rb jkbdam.
26 Lwcjba uig vwb jm xtmiaivb, jcb kmzbiqvbg qa ijaczl.

第8條資訊就是我們暴力破解得到的原密碼!