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_lettersdef encrypt(plaintext, key):if key < 0:raise Exceptionres = ''key = key % 26for 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 resdef decrypt(plaintext, key):if key < 0:raise Exceptionres = ''key = key % 26for 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 resdef 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) + '时:' + resprint(res)plaintext = 'QVVFWI{wklv_lv_d_whvw_iodj}'
attack(plaintext)