问题:
利用古典密码学知识根据如下密文分析出明文和密钥。密文为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。出题人应该是柯南的粉丝。