在密碼學(xué)中腺阳,愷撒密碼是一種最簡單且最廣為人知的加密技術(shù)。它是一種替換加密的技術(shù),明文中的所有字母都在字母表上向后(或向前)按照一個(gè)固定數(shù)目進(jìn)行偏移后被替換成密文。
加密過程
1.從1到25決定一個(gè)數(shù)字為密鑰污它。保持這個(gè)密鑰的秘密!
2.找到明文字母的號碼庶弃。
3.添加密鑰數(shù)字到明文字母的號碼衫贬,生成一個(gè)數(shù)字。
4.如果這個(gè)數(shù)字大于26歇攻,減去26固惯。
5.找到你計(jì)算的數(shù)字對應(yīng)的字母。這就是密文缴守。
6.對明文中的每個(gè)字母重復(fù)步驟2
下圖描述了如何使用密鑰13加密“Hello. How are you?”葬毫。每個(gè)行都顯示了將左邊的明文字母轉(zhuǎn)到右側(cè)的密文的步驟。
解密屡穗,減去密鑰數(shù)字贴捡,而不是添加它。對于密文B村砂,數(shù)字是1烂斋。減去1 - 13得到- 12。像我們的“減法26”加密規(guī)則础废,當(dāng)我們解密和結(jié)果是小于0汛骂,我們有一個(gè)“添加26”規(guī)則。- 12 + 26是14评腺。所以密文字母B解密回字母O帘瞭。
雙強(qiáng)度加密
如果我們對“KITTEN”3鍵,得到的密文就是“nlwwhq”蒿讥。如果我們對“nlwwhq”4鍵蝶念,得到的密文,將“rpaalu”芋绸。但這與我們用“7”鍵一次加密“小貓”一詞是完全一樣的媒殉。我們的“雙”加密和普通加密是一樣的,所以它沒有更強(qiáng)的侥钳。
對于大多數(shù)加密算法适袜,加密一次以上不提供額外的密碼強(qiáng)度。事實(shí)上舷夺,如果你用兩個(gè)加起來等于26的密鑰加密一些明文苦酱,你最終得到的密文和原來的明文是一樣的!
代碼實(shí)現(xiàn)
import string
# 凱撒加密
def encrypt(your_str, key):
C = string.ascii_letters
# 生成符號映射
lc = [chr((i - 97) % 26 + 97) for i in range(97 + key, 123 + key)]
uc = [chr((i - 65) % 26 + 65) for i in range(65 + key, 91 + key)]
R = ''.join(lc) + ''.join(uc)
# python3.2之前的maketrans使用string調(diào)用给猾,從3.2之后發(fā)生改變
return your_str.translate(str.maketrans(C, R))
# 凱撒解密
def decrypt(your_str, key):
C = string.ascii_letters
# 生成符號映射
lc = [chr((i - 97) % 26 + 97) for i in range(97 + key, 123 + key)]
uc = [chr((i - 65) % 26 + 65) for i in range(65 + key, 91 + key)]
R = ''.join(lc) + ''.join(uc)
return your_str.translate(str.maketrans(R, C))
if __name__ == '__main__':
plainText = 'hello world!'
cipherText = encrypt(plainText, 7)
print(cipherText)
plainText = decrypt(cipherText, 7)
print(plainText)
反密碼
反向密碼通過反向打印來加密消息疫萤。所以“Hello world!” 加密到“!dlrow olleH”。要解密敢伸,只需反轉(zhuǎn)反向消息即可得到原始消息扯饶。加密和解密步驟相同。這是一種非常脆弱的密碼。只要看它的密文尾序,你可以發(fā)現(xiàn)它只是相反的順序钓丰。 .syas ti tahw tuo erugif llits ylbaborp nac uoy ,detpyrcne si siht hguoht neve ,elpmaxe roF。
# Reverse Cipher
message = 'Three can keep a secret, if two of them are dead.'
translated = ''
i = len(message) - 1
while i >= 0:
print(translated)
translated = translated + message[i]
i = i - 1
這樣寫其實(shí)很不符合Python優(yōu)雅的特性每币,對代碼進(jìn)行大改造:
# Reverse Cipher
message = 'Three can keep a secret, if two of them are dead.'
def reverseDecrypt(str):
return ''.join(reversed(message))