破解维吉尼亚密码
一、摘要
项目 | 维吉尼亚密码破解 |
---|---|
破解方法及大体思路 | 1、确定密钥长度:首先利用Kasiski测试法,确定密钥长度范围,然后再使用重合指数法,利用统计学中英语自然语言重合指数约为0.065的规律进一步确定密钥长度。 |
2、确定密钥字相对位移:利用英语自然语言中重合互指数约为0.065的统计学规律确定密钥字相对位移。 | |
3、穷举搜索密钥字:利用2中所得到的方程组,穷举26种可能,判断具体的密钥。 | |
运行环境 | PyCharm Community Edition 2020.1.1;IDLE(python 3.7 64-bit) |
密文:krkpewxvftksopztecxvbuhfvycgxouflihoffptrcwffwhkcevxhiuzfposdvccyctpmjtbfymllctiwxtacsmjmoncwdnawjrwtjgjsuystvbxgvcmgczbqecllttfkjlacpfttjgeegtbvkfpmhjzqaxhvvpgxoeychrcwumchhyigixhqdciawunmjerefkekcozqttznfdjlopuyqhjgrjawcpfrgxhwiljgrgiycrqkiajfgvrlrxgkkghdbqnliaovzrltgafslacjvjexrwjrdzsvruprttfkwxfgrlstznnmjerdvjdlhkwwdngjfsawgjfunhitjcaykgrptzicibtwrcpycwbkxfibrqemivotvwdnotvldmvgicshbqkztmfqlzaxrqekntqefscmbqkfxguyzjaaorgccmcovrwxbckgdgonrqhxadcclbznjfdpzgegtgqawygxkgcjiasofqiecxvbdyageztjikvrxymqlapghcbcrtfgfdnhitjcaytqiknlsnwgrtbpfrlkwvvycraqicqnhpfrwbbizliasyfpawqqljslhqgktmccumgxmqlsemcvycsxovy
密钥:crypto
明文:iamaliveheremybelovedforthereasontoadoreyouohhowanxiousihavebeenforyouandhowsorryiamaboutallyoumusthavesufferedinhavingnonewsfromusmayheavengrantthatthisletterreachesyoudonotwritetomethiswouldcompromiseallofusandabovealldonotreturnunderanycircumstancesitisknownthatitwasyouwhohelpedustogetawayfromhereandallwouldbelostifyoushouldshowyourselfweareguardeddayandnightidonotcareyouarenotheredonotbetroubledonmyaccountnothingwillhappentomethenationalassemblewillshowleniencyfarewellthemostlovedofmenbequietifyoucantakecareofyourselfformyselficannotwriteanymorebutnothingintheworldcouldstopmetoadoreyouuptothedeath
二、正文
(一)确定密钥长度
【Kasiski测试法】
原理:
密文中出现两个相同字母组,它们对应的明文字母相同的可能性很大,这样的两个明文字母组之间的距离可能为密钥长度的整数倍。
在本题中,我们通过编写程序,找到了相邻3个字母在密文中出现次数大于等于3的所有小的字母组合,分别为:
1)pfr:出现于第222位,第540位,第558位,相减后得到318,336;
2)wdn:出现于第92位,第320位,第374位,相减后得到228,282;
3)vyc:出现于第24位,第547位,第600位,相减后得到523,576。
由于第3)组数据中523为素数,可以猜测这个数可能并不符合我们原理中的要求,删除该数字。然后经过观察与计算可以得到这几个数的最大公因数为6。
可以猜测密钥长度即为6。
【重合指数法】
原理:
英语自然语言的重合指数约为0.065,且单表代换不会改变该值。
重合指数定义:
在一段字符串中,任意取两个字母,这两个字母相同的概率。
假设f_0,f_1,f_2…f_25分别为一个字符串中a,b,c…z的个数,字符串的总长度为n,然后结合以上定义我们就可以得出计算一个字符串的重合互指数的公式,即为:
自然语言中I_C (x)的值约为0.065。
在本题中,我们通过将密钥长度为6时的情况代入,即将该字符串分为6段字符串,分别保存在Lista[0]、Lista[1]…Lista[5]中,其中Lista[0]中存有字符串中索引值为0,6,12…的字母,Lista[1]中存有索引值为1,7,13…的字母,以此类推。这样我们就可以保证这6个字符串分别由6个密钥加密而成,且每一个字符串的密钥相同。
通过计算可得6个字符串的重合指数分别为0.06387109299165211,0.07124830130071831,0.05683168316831684,0.05821782178217823, 0.06356435643564357, 0.06158415841584159。
平均值为0.06255290234905843,与0.065非常接近,即可进一步确定密钥长度为6。
(二)确定密钥字相对位移
思想:利用英语自然语言中重合互指数约为0.065的统计学规律确定密钥字的相对位移。
主要利用方法:重合互指数计算
【步骤一:分组】
已知密钥长度为6,首先将原有密文分为六组,以确保每一组由同一个密钥字加密,即保证每一组为单表代换的加密方式
第一组:kxoxvufwcudtftcnwgtcqtcgvjvewyqueonpgpwgkvkqvajwvtgndkjjtgcckqttgqqqeqyrocndngagoxgkqcgtqnpvqpiyqqcqvv
第二组:
rvpvyfffezvpyiscjjvmefpekzvyuidnfzfurfiiirknzfvjrfrnvwffjripxevviklefkzgvkrcjewcfvevlbfjiwfvifzflgulyy
第三组:
kfzbclpfvfcmmwmwrsbgckfefqpcmgcmkqdyjrlyalglrsjruklmjwsucpbyfmwlczzksfjcrgqcfgyjqbzracdckgrycrlpjkmsc
第四组:
pttugitwxpcjlxjdwuxcljtgpaghciijetjqagjcjrhilledpwsjddanattciiddstancxacwdhldtgiidtxprnanrlcqwiastges
第五组:
ekehxhrhhoytltmntygzllttmxxrhxaektlhwxgrfxdataxzrxtelnwhyzwwbvnmhmxtmgamxgxbpgxaeyjygthyltkrnbawlmxmx
第六组:
wscfoockiscbcaoajsvbtajbhhochhwrczojchrqggbogcrstfzrhggikirbroovbfrqbuocboazzqkscaimhfitsbwahbsqhcmco
分组之后,通过计算任意两组重合互指数的方式,从而确定密钥字相对位移
【方法:重合互指数计算】
重合互指数定义:
设x=x1,x2,…,xn;y=y1,y2,…,yn’,分别为长度为n和n’的串,其重合互指数为从 x 和 y 中分别随机选出一个元素且两个元素相同的概率。
计算方法与重合指数类似:
假设计算第Ci组与第Cj组的重合互指数,设密钥字为k=k2,k2,…,kd
那么Ci中的一个元素(假设密文A所对应的明文字母)出现的概率为p0-ki
Cj中的相同元素(同样为密文A所对应的明文字母)出现的概率为p0-kj
相同字母出现(即都为密文A)的概率:p0-ki*p0-kj
重合互指数为:
即Mic=AA+BB+…+Z*Z
当重合互指数等于0.065时,说明两个元素相同
通过重合互指数的公式可以发现,实际上重合互指数取决于相对位移ki-kj
所以需要求出相对位移ki-kj
移位表:
当相对位移为0时,两组密文由同一种密钥加密得到,即单表代换,因此不改变重合指数,所以重合互指数为0.065.
所以,当MIc(Ci,Cj)=0.065时,说明ki-kj的相对位移正确,即ki和kj可以相互表示为ki=kj+s,
将用不同密钥字加密的两组密文转换成了单表代换的加密方式
【步骤二:确定密钥字的相对位移】
假设密钥字的相对位移为s(s=ki-kj):
由于密钥串中字母不同,所以在计算重合互指数时需要考虑到密钥字的相对位移
因为同一组中加密方式为单表代换,即相同明文经过不同密钥字加密,形成的密文不同
ci=m+ki mod 26
cj=m+kj mod 26
所以ci-cj=ki-kj mod 26
即对应的密文相对位移即为密钥字的相对位移
在重合互指数的计算时,要加上密钥字的相对位移s
即将fi变为fi,t;fj变为fj,t-s(t为密文字符个数)
公式变为:
即当s改变时,对应出现的字母概率相乘发生改变
例如:
当s=1时,
MIc为AZ+BA+CB+…+ZY
当s=2时,
MIc为AY+BZ+CA+…+ZX
假如猜对了相对位移s,那么就找到了不同密钥字加密的相同明文字母,s即为密钥字间的相对位移,也就将二维的维吉尼亚密码转化成了整个的一维的单表代换
任意的ki和kj都可以由s进行相互表示,最终只需要求得一个k,就能够解出整个密钥
计算重合互指数 |
---|
(0, 1):0.0355, 0, 0.0473, 1, 0.0317, 2, 0.0260, 3, 0.0377, 4, 0.0398, 5, 0.0320, 6, 0.0403, 7, 0.0457, 8, 0.0298, 9, 0.0341, 10, 0.0717, 11, 0.0338, 12, 0.0277, 13, 0.0415, 14, 0.0444, 15, 0.0313, 16, 0.0408, 17, 0.0391, 18, 0.0355, 19, 0.0347, 20, 0.0425, 21, 0.0317, 22, 0.0397, 23, 0.0476, 24, 0.0368, 25 |
(0, 2): 0.0396, 0, 0.0391, 1, 0.0281, 2, 0.0339, 3, 0.0627, 4, 0.0380, 5, 0.0326, 6, 0.0386, 7, 0.0371, 8, 0.0290, 9, 0.0434, 10, 0.0487, 11, 0.0360, 12, 0.0324, 13, 0.0487, 14, 0.0353, 15, 0.0335, 16, 0.0449, 17, 0.0397, 18, 0.0389, 19, 0.0400, 20, 0.0334, 21, 0.0351, 22, 0.0384, 23, 0.0355, 24, 0.0363, 25 |
(0, 3): 0.0437, 0, 0.0338, 1, 0.0426, 2, 0.0383, 3, 0.0363, 4, 0.0334, 5, 0.0405, 6, 0.0374, 7, 0.0376, 8, 0.0343, 9, 0.0459, 10, 0.0330, 11, 0.0351, 12, 0.0638, 13, 0.0359, 14, 0.0297, 15, 0.0390, 16, 0.0420, 17, 0.0252, 18, 0.0457, 19, 0.0397, 20, 0.0370, 21, 0.0332, 22, 0.0447, 23, 0.0379, 24, 0.0331, 25 |
(0, 4): 0.0339, 0, 0.0241, 1, 0.0428, 2, 0.0368, 3, 0.0379, 4, 0.0406, 5, 0.0369, 6, 0.0333, 7, 0.0318, 8, 0 |