多表古典密码统计分析

一、前言

1. 多表古典密码分析

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

2. Vigenere密码

  • Vigenere(维吉尼亚)密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
  • 凯撒密码:一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。

二、Vigenere密码分析

1. Kasiski测试法

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

2. 重合指数法

X = x 1 x 2 … x n X=x_1x_2…x_n X=x1x2xn是一个长度为n的英文字母串,则x中任意选取两个字母相同的概率定义为重合指数,用 I c ( x ) I_c(x) Ic(x) 表示。
设英文字母 A , B , … , Z A,B,…,Z AB,Z X X X中出现的次数分别为: f 0 , f 1 , … , f 25 f_0,f_1,…,f_{25} f0,f1,,f25则从 X X X中任意选取两个字母相同的概率为
I c ( X ) = ∑ i = 0 25 f i ( f i − 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个英文字母的出现频率:
这里写图片描述
已知每个英文字母出现的期望概率,分别记为 p 0 , p 1 , … , p 25 p_0,p_1,…,p_{25} p0,p1,,p25,那么X中两个元素相同的概率计算为
I c ( X ) ≈ ∑ i = 0 25 p i 2 I_{c}(X) \approx \sum_{i=0}^{25} p_{i}^{2} Ic(X)i=025pi2
结果约等于 0.065,若是均匀分布,则值约等于0.038

三、实际密码分析

1. 问题描述

设某一段明文经过 V i g e n e r e Vigenere Vigenere密码加密后密文为
C H R E E V O A H M A E R A T B I A X X W T N X B E E O P H B S B Q M Q E Q E R B W CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW
R V X U O A K X A O S X X W E A H B W G J M M Q M N K G R F V G X W T R Z X W I A K RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK
L X F P S K A U T E M N D C M G T S X M X B T U I A D N G M G P S R E L X N J E L X LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX
V R V P R T U L H D N Q W T W D T Y G B P H X T F A L J H A S V B F X N G L L C H R VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR
Z B W E L E K M S J I K N B H W R J G N M G J S G L X F E Y P H A G N R B I E Q J T ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT
A M R V L C R R E M N D G L X R R I M G N S N R W C H R Q H A E Y E V T A Q E B B I AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI
P E E W E V K A K O E W A D R E M X M T B J J C H R T K D N V R Z C H R C L Q O H P PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP
W Q A I I W X N R M G W O I I F K E E WQAIIWXNRMGWOIIFKEE WQAIIWXNRMGWOIIFKEE
通过两种分析方法计算出此密码的密钥。

2. 问题解决

1. 密文片段CHR一共出现了5次,每次开始位置分别为1,166,236,276,286,第一次出现到各次出现的距离 d i d_i di分别为165,235,275,285,所以 m = g c d ( 165 , 235 , 275 , 285 ) = 5 m=gcd(165,235,275,285) = 5 m=gcd(165235275285)=5
2. 根据Kasiski测试法得到的 m v mv mv,可以将密文 Y v Yv Yv按照下列形式排列:
Y Y Y排列成 m m m n / m n/m n/m列的形式,形如:
k 1 y 1 y m + 1 ⋯ y n − m + 1 k 2 y 2 y m + 2 ⋯ y n − m + 2 k 3 y 3 y m + 3 ⋯ y n − m + 3 ⋮ ⋮ ⋮ ⋮ ⋮ k m y m y 2 m ⋯ y n \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的概率分布为:
f 0 n , f 1 n , f 2 n , … … . . f 25 n \frac{f_{0}}{n}, \frac{f_{1}}{n}, \frac{f_{2}}{n}, \ldots \ldots . . \frac{f_{25}}{n} nf0,nf1,nf2,..nf25

考虑到 V i g e n e r e Vigenere Vigenere密码子串 y i y_i yi是有对应的明文子集中的字母移动 K i K_i Ki个位置所得,因此,移动后的概率分布为:
f k i n ′ , f 1 + k i n ′ , f 2 + k i n ′ , … … … , f 25 + k i n ′ \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

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

每一行计算每一种字母的 M g M_g Mg值( g g g代表0-25即 a − z a-z az),若 g g g对应的 M g M_g Mg 值与0.065接近,那么 g g g则为密钥

四、编程

1. 代码
2. 运行结果

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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值