攻防世界-密码学-shanghai

1. 题目信息

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

2. 分析

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

3. 解题

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

$ 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
#接下来,进行已知明文攻击
#密文中有一段: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}。

原文地址:https://www.cnblogs.com/coming1890/p/13526085.html