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