题目信息

题目给出提示“维吉利亚密码”,密文在附件中。

分析

由于维吉利亚密码加密时密钥重用,导致可通过分析密文进行破解;由于明文中存在一些出现频率很高的单词:the,and,for,with等等,因此很有可能这些单词再次被同样的密钥加密,从而生成同样的密文,其间隔一定是密钥长度的倍数,因此可通过对密文进行分析得到密钥的长度;另外,由于这些密文对应着那些出现频率高的明文,因此可破解出密钥;自己写了一个工具来求解这类问题。

解题

如下是我使用工具的解题过程,注释是我自己加的,并非程序的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
$ python solve.py shanghai.txt
# 先寻找密文中多次出现(本程序设定的至少3次)的词汇,并计算它们之间的距离,这有助于分析出密钥的长度
word: bju
distance: [1078, 2222, 154, 814, 132, 264]
the minimum distance: 132

word: glv
distance: [660, 408, 186, 374, 88, 66, 836, 44, 649, 110, 880, 88, 209, 66]
the minimum distance: 44

word: vxz
distance: [1936, 154, 264, 253, 121, 517, 154, 440, 11, 220, 66]
the minimum distance: 11

word: bni
distance: [22, 979, 2002, 583, 165, 132, 22]
the minimum distance: 22

word: xpg
distance: [11, 396, 660, 2409, 11, 374, 37, 51, 572]
the minimum distance: 11

word: jcm
distance: [1595, 88, 99, 297, 781, 11, 22, 110, 66, 231, 627]
the minimum distance: 11

word: zlr
distance: [286, 583, 583, 154, 22, 154, 22, 407, 55, 396, 1155]
the minimum distance: 22

word: klm
distance: [594, 308, 605, 2145, 231, 297, 44, 44, 198]
the minimum distance: 44

word: mfr
distance: [44, 99, 99, 715, 1884, 536]
the minimum distance: 44

word: gvtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: vtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: tyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: yiz
distance: [165, 968, 550, 275, 220, 2167, 246, 106]
the minimum distance: 106

word: opk
distance: [66, 1342, 385, 11, 1771, 583, 374]
the minimum distance: 11

word: tyi
distance: [165, 968, 488, 62, 275, 220, 37, 1639, 491, 352]
the minimum distance: 37

word: gvtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: vtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: pkv
distance: [297, 33, 407, 1221, 572, 88]
the minimum distance: 33

word: gvtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: vtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: xui
distance: [638, 682, 77, 154, 55, 649, 363, 143]
the minimum distance: 55

word: tui
distance: [55, 1628, 154, 286, 787, 797]
the minimum distance: 55

word: gvtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165

word: vtyiz
distance: [165, 968, 550, 275, 220, 2167, 352]
the minimum distance: 165
#到此我们应该也能看出,密钥的长度为11
#接下来,进行已知明文攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#密文中有一段:frxnimp 1914 qil 1940,猜测是between 1914 and 1940
plaintext:betweenand
cipher:frxnimpqil
possible key:enereicqvi len:10
#如果需要更多的明-密文对分析,则输入y;否则,已计算出密钥,则可以进行解密你需要解密的内容
try more plain-cipher(y) or start decrypt(n)y
plaintext:the
cipher:opk
possible key:vig len:3
try more plain-cipher(y) or start decrypt(n)n
key:enereicqvig
cipher:jtcw, '{' vvj 'zvkvrmtudabiecveaaxpp' grq '}'
fgyf, '{' rnh 'jacpnzpdzszsjupanwglh' ebv '}'
dpps, '{' erb 'xfpnligqmwtgohnywntyl' ypa '}'
bnyj, '{' ref 'rtuajgphzjxacmawuwkly' cjo '}'
olws, '{' irs 'vnifwenqqwkewafjsutcl' pni '}'
tyuq, '{' rif 'irctbrloznxrautofsrlc' cam '}'
hdho, '{' prw 'vegnpwymxwoenynckfpjl' tnz '}'
brmb, '{' npf 'mrtrjkdzvuxvalrwykchj' cem '}'
flag, '{' and 'vigenereisveryeasyhuh' and '}'
spuu, '{' fab 'trxrailsnftcaprnwsvzu' ylm '}'
fcyo, '{' tfo 'rpginvpmbkgayyiajwpnz' ljk '}'
wpls, '{' ntt 'enereicqvylnwwrrwjthn' qwi '}'

解出flag为flag{vigenereisveryeasyhuh}。