Caesar(凯撒密码)
原理
凯撒密码(Caesar)加密时会将明文中的 每个字母 都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文。例如,当偏移量是左移 3 的时候(解密时的密钥就是 3):
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ
例题
已知密文为vzsx,位移量为3,求明文?
解:第一步,写出密文中字母对应的位置(下标),比如说a在字母表中为第一位,就记作1(记作0也可以,最后一个字母z = 25)
所以我们可以写出v = 22,z = 26,s = 19,x = 24
第二步,因为位移量为3,所以我们将以上数字都减3,即19,23,16,21
第三步,将以上数字还原为字母,19对应s,23对应w,16对应p,21对应u,我们就解出了明文swpu.
加解密脚本
from string import ascii_letters
def encrypt(plaintext, key):
if key < 0:
raise Exception
res = ''
key = key % 26
for s in plaintext:
if s in ascii_letters in ascii_letters:
if chr(ord(s) + key) in ascii_letters:
res += ''.join(chr(ord(s) + key))
else:
res += ''.join(chr(ord(s) + key - 26))
else:
res += ''.join(s)
return res
def decrypt(plaintext, key):
if key < 0:
raise Exception
res = ''
key = key % 26
for s in plaintext:
if s in ascii_letters in ascii_letters:
if chr(ord(s) - key) in ascii_letters:
res += ''.join(chr(ord(s) - key))
else:
res += ''.join(chr(ord(s) - key + 26))
else:
res += ''.join(s)
return res
def attack(plaintext):
for key in range(0, 27):
res = ''
for s in plaintext:
if s in ascii_letters in ascii_letters:
if chr(ord(s) - key) in ascii_letters:
res += ''.join(chr(ord(s) - key))
else:
res += ''.join(chr(ord(s) - key + 26))
else:
res += ''.join(s)
res = 'key为' + str(key) + '时:' + res
print(res)
plaintext = 'QVVFWI{wklv_lv_d_whvw_iodj}'
attack(plaintext)