多表古典密码统计分析

一、前言

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=x1x2xn是一个长度为n的英文字母串,则x中任意选取两个字母相同的概率定义为重合指数,用 Ic(x)I_c(x)Ic(x) 表示。
设英文字母A,B,…,ZA,B,…,ZAB,ZXXX中出现的次数分别为: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(n1)i=025fi(fi1)
下表为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=025pi2
结果约等于 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(165235275285)=5
2. 根据Kasiski测试法得到的mvmvmv,可以将密文YvYvYv按照下列形式排列:
YYY排列成mmmn/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} k1k2k3kmy1y2y3ymym+1ym+2ym+3y2mynm+1ynm+2ynm+3yn
设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}}nfki,nf1+ki,nf2+ki,,nf25+ki

Mg=∑i=025pifi+gn′M_{g}=\sum_{i=0}^{25} \frac{p_{i} f_{i+g}}{n^{\prime}}Mg=i=025npifi+g

每一行计算每一种字母的MgM_gMg值(ggg代表0-25即a−za-zaz),若ggg对应的MgM_gMg 值与0.065接近,那么ggg则为密钥

四、编程

1. 代码
2. 运行结果

程序比较简单,但是代码比较长,我只把结果贴出来比对一下:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值