一、前言
1. 多表古典密码分析
我们以Vigenere密码为例来说明多表古典密码的分析方法。确定密钥字长度的方法有Kasiski测试法(Kasiski Test)和重合指数法(index of coincidence).
2. Vigenere密码
- Vigenere(维吉尼亚)密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
- 凯撒密码:一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
二、Vigenere密码分析
1. Kasiski测试法
寻找密文中相同的片段对(一般长度大于三),计算每对相同密文片段对之间的距离,不妨记为d1,d2,…,did_1,d_2,…,d_id1,d2,…,di,若令密钥字的长度为mmm,则m=gcd(d1,d2,…,di)m=gcd(d_1,d_2,…,d_i)m=gcd(d1,d2,…,di)
2. 重合指数法
设X=x1x2…xnX=x_1x_2…x_nX=x1x2…xn是一个长度为n的英文字母串,则x中任意选取两个字母相同的概率定义为重合指数,用 Ic(x)I_c(x)Ic(x) 表示。
设英文字母A,B,…,ZA,B,…,ZA,B,…,Z在XXX中出现的次数分别为:f0,f1,…,f25f_0,f_1,…,f_{25}f0,f1,…,f25则从XXX中任意选取两个字母相同的概率为
Ic(X)=∑i=025fi(fi−1)n(n−1)
I_{c}(X)=\frac{\sum_{i=0}^{25} f_{i}\left(f_{i}-1\right)}{n(n-1)}
Ic(X)=n(n−1)∑i=025fi(fi−1)
下表为26个英文字母的出现频率:
已知每个英文字母出现的期望概率,分别记为p0,p1,…,p25p_0,p_1,…,p_{25}p0,p1,…,p25,那么X中两个元素相同的概率计算为
Ic(X)≈∑i=025pi2I_{c}(X) \approx \sum_{i=0}^{25} p_{i}^{2}Ic(X)≈i=0∑25pi2
结果约等于 0.065,若是均匀分布,则值约等于0.038。
三、实际密码分析
1. 问题描述
设某一段明文经过VigenereVigenereVigenere密码加密后密文为
CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBWCHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBWCHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW
RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAKRVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAKRVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK
LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELXLXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELXLXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX
VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHRVRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHRVRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR
ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJTZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJTZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT
AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBIAMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBIAMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI
PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHPPEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHPPEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP
WQAIIWXNRMGWOIIFKEEWQAIIWXNRMGWOIIFKEEWQAIIWXNRMGWOIIFKEE
通过两种分析方法计算出此密码的密钥。
2. 问题解决
1. 密文片段CHR一共出现了5次,每次开始位置分别为1,166,236,276,286,第一次出现到各次出现的距离did_idi分别为165,235,275,285,所以m=gcd(165,235,275,285)=5m=gcd(165,235,275,285) = 5m=gcd(165,235,275,285)=5
2. 根据Kasiski测试法得到的mvmvmv,可以将密文YvYvYv按照下列形式排列:
将YYY排列成mmm行n/mn/mn/m列的形式,形如:
k1y1ym+1⋯yn−m+1k2y2ym+2⋯yn−m+2k3y3ym+3⋯yn−m+3⋮⋮⋮⋮⋮kmymy2m⋯yn
\begin{array}{ccccc}
k_{1} & y_{1} & y_{m+1} & \cdots & y_{n-m+1} \\
k_{2} & y_{2} & y_{m+2} & \cdots & y_{n-m+2} \\
k_{3} & y_{3} & y_{m+3} & \cdots & y_{n-m+3} \\
\vdots & \vdots & \vdots & \vdots & \vdots \\
k_{m} & y_{m} & y_{2 m} & \cdots & y_{n}
\end{array}
k1k2k3⋮kmy1y2y3⋮ymym+1ym+2ym+3⋮y2m⋯⋯⋯⋮⋯yn−m+1yn−m+2yn−m+3⋮yn
设f0,f1,…,f25分别表示串yi中英文字母A,B,…,Z出现的次数,令n’=n/m表示串yi的长度,则26个英文字母在yi的概率分布为:
f0n,f1n,f2n,……..f25n
\frac{f_{0}}{n}, \frac{f_{1}}{n}, \frac{f_{2}}{n}, \ldots \ldots . . \frac{f_{25}}{n}
nf0,nf1,nf2,……..nf25
考虑到VigenereVigenereVigenere密码子串yiy_iyi是有对应的明文子集中的字母移动KiK_iKi个位置所得,因此,移动后的概率分布为:
fkin′,f1+kin′,f2+kin′,………,f25+kin′\frac{f_{k i}}{n^{\prime}}, \frac{f_{1+k i}}{n^{\prime}}, \frac{f_{2+k i}}{n^{\prime}}, \ldots \ldots \ldots, \frac{f_{25+k i}}{n^{\prime}}n′fki,n′f1+ki,n′f2+ki,………,n′f25+ki
Mg=∑i=025pifi+gn′M_{g}=\sum_{i=0}^{25} \frac{p_{i} f_{i+g}}{n^{\prime}}Mg=i=0∑25n′pifi+g
每一行计算每一种字母的MgM_gMg值(ggg代表0-25即a−za-za−z),若ggg对应的MgM_gMg 值与0.065接近,那么ggg则为密钥
四、编程
1. 代码
2. 运行结果
程序比较简单,但是代码比较长,我只把结果贴出来比对一下: