Python 解密凯撒密码

问题:

利用古典密码学知识根据如下密文分析出明文和密钥。密文为​qrgrpgvir pbana。已知明文为英文。

分析:

没有密钥,结合密文中字母的分布(r、a)初步猜测​为单表代换密码。单表代换密码指明文消息中相同的字母,在加密时都使用同一固定的字母来代换。这里应该是移位密码。

思路:

穷举k值,共25个,每次输出q+k、r+k等,找出可读的结果。

鉴于我的Python知识不是很熟,这里使用两个字典,字典d保存每个字母的字母表序号,取出序号后加k值,在保存序号对应字母的字典id中取出字母。

整体代码如下:

>>> s = 'qrgrpgvir pbana' 
>>> d = {} 
>>> nnn = 'abcdefghijklmnopqrstuvwxyz'
>>> for i in range(len(nnn)): 
...     d[nnn[i]] = i 
... 
>>> d 
{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14, 'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25} 
>>> id = {} 
>>> for i in range(len(nnn)): 
...     id[i] = nnn[i] 
... 
>>> id 
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z'} 
>>> for i in range(26): 
...     for j in range(len(s)): 
...             if s[j]==' ': 
...                     print(s[j], end='') 
...             else: 
...                     print(id[(d[s[j]] + i) % 26], end='') 
...     print('\t' + str(i)) 
...​ 
qrgrpgvir pbana 0 
rshsqhwjs qcbob 1 
stitrixkt rdcpc 2 
tujusjylu sedqd 3 
uvkvtkzmv tfere 4 
vwlwulanw ugfsf 5 
wxmxvmbox vhgtg 6 
xynywncpy wihuh 7 
yzozxodqz xjivi 8 
zapaypera ykjwj 9 
abqbzqfsb zlkxk 10 
bcrcargtc amlyl 11 
cdsdbshud bnmzm 12 
detective conan 13 
efufdujwf dpobo 14 
fgvgevkxg eqpcp 15 
ghwhfwlyh frqdq 16 
hixigxmzi gsrer 17 
ijyjhynaj htsfs 18 
jkzkizobk iutgt 19 
klaljapcl jvuhu 20​ 
lmbmkbqdm kwviv 21 
mncnlcren lxwjw 22 
nodomdsfo myxkx 23 
opepnetgp nzyly 24 
pqfqofuhq oazmz 25

​输出结果中可以看见,只有k = 13时是可读的,故密钥是13,明文是detective conan。出题人应该是柯南的粉丝。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据