多表古典密码统计分析
我们以Vigenere密码为例来说明多表古典密码的分析方法。确定密钥字长度的方法有**Kasiski测试法**(KasiskiTest)和重合指数法(indexofcoincidence).
1.Kasiski测试法:
寻找密文中相同的片段(一般长度大于三)对,计算每对相同密文片段对之间的距离,不妨记为d1,d2,…,di,若令密钥字的长度为m,则m=gcd(d1,d2,…,di)
2.重合指数法:
设X=x1x2…xn是一个长度为n的英文字母串,则x中任意选取两个字母相同的概率定义为重合指数,用 Ic(x) 表示。
设英文字母A,B,…,Z在X中出现的次数分别为:f0,f1,…,f25则从X中任意选取两个字母相同的概率为
下表为26个英文字母的出现频率:
已知每个英文字母出现的期望概率,分别记为p0,p1,…,p25,那么X中两个元素相同的概率为:
约等于 0.065,否则均匀分布约等于0.038
3.问题描述:
设某一段明文经过Vigenere密码加密后密文为
CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW
RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK
LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX
VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR
ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT
AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI
PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP
WQAIIWXNRMGWOIIFKEE
通过两种分析方法计算出此密码的密钥。
4.问题解决:
(1)
密文片段CHR一共出现了5次,每次开始位置分别为1,166,236,276,286,第一次出现到各次出现的距离di分别为165,235,275,285,所以m=gcd(165,235,275,285)=5
(2)
根据Kasiski测试法得到的mv,可以将密文Yv按照下列形式排列:
将Y排列成m行n/m列的形式,形如:
设f0,f1,…,f25分别表示串yi中英文字母A,B,…,Z出现的次数,令n’=n/m表示串yi的长度,则26个英文字母在yi的概率分布为:
考虑到Vigenere密码子串yi是有对应的明文子集中的字母移动Ki个位置所得,因此,移动后的概率分布为:
每一行计算每一种字母的Mg值(g代表0−25即a−z),若g对应的Mg
值与0.065接近,那么g则为密钥
5.编程:
程序比较简单,但是代码比较长,我只把结果贴出来比对一下: