多表古典密码统计分析

我们以VigenereVigenere密码为例来说明多表古典密码的分析方法。确定密钥字长度的方法有**KasiskiKasiski测试法**KasiskiTest(Kasiski Test)重合指数法indexofcoincidence)(index of coincidence).


1.Kasiski测试法:

寻找密文中相同的片段(一般长度大于三)对,计算每对相同密文片段对之间的距离,不妨记为d1,d2,,did_1,d_2,…,d_i,若令密钥字的长度为mm,则m=gcd(d1,d2,,di)m=gcd(d_1,d_2,…,d_i)

2.重合指数法:

X=x1x2xnX=x_1x_2…x_n是一个长度为n的英文字母串,则x中任意选取两个字母相同的概率定义为重合指数,用 Ic(x)I_c(x) 表示。
设英文字母AB,ZA,B,…,ZXX中出现的次数分别为:f0,f1,,f25f_0,f_1,…,f_{25}则从X中任意选取两个字母相同的概率为
这里写图片描述

下表为26个英文字母的出现频率:

这里写图片描述

已知每个英文字母出现的期望概率,分别记为p0,p1,,p25p_0,p_1,…,p_{25},那么X中两个元素相同的概率为:
这里写图片描述
约等于 0.0650.065,否则均匀分布约等于0.0380.038

3.问题描述:

设某一段明文经过VigenereVigenere密码加密后密文为
CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBWCHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW
RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAKRVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK
LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELXLXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX
VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHRVRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR
ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJTZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT
AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBIAMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI
PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHPPEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP
WQAIIWXNRMGWOIIFKEEWQAIIWXNRMGWOIIFKEE
通过两种分析方法计算出此密码的密钥。

4.问题解决:

(1)
密文片段CHR一共出现了5次,每次开始位置分别为11662362762861,166,236,276,286,第一次出现到各次出现的距离did_i分别为165235275285165,235,275,285,所以m=gcd(165235275285)=5m=gcd(165,235,275,285) = 5

(2)
根据KasiskiKasiski测试法得到的mvmv,可以将密文Yv按照下列形式排列:
YY排列成mmn/mn/m列的形式,形如:
这里写图片描述

设f0,f1,…,f25分别表示串yi中英文字母A,B,…,Z出现的次数,令n’=n/m表示串yi的长度,则26个英文字母在yi的概率分布为:

这里写图片描述

考虑到VigenereVigenere密码子串yiy_i是有对应的明文子集中的字母移动KiK_i个位置所得,因此,移动后的概率分布为:

这里写图片描述

这里写图片描述
每一行计算每一种字母的MgM_g值(gg代表0250-25aza-z),若gg对应的MgM_g
值与0.0650.065接近,那么gg则为密钥

5.编程:

程序比较简单,但是代码比较长,我只把结果贴出来比对一下:

这里写图片描述