维吉尼亚密码的破解

一、引言

  上一章我们介绍了维吉尼亚密码的原理,是通过移位替换的加密方法进行加密,但是因为概率论的出现这种简单的移位或替换就容易破解了,其原理很简单,英文中字母出现的频率是不一样的。比如字母 e 是出现频率最高的,占12.7%;其次是t9.1%;然后是aoin等,最少的是z,只占0.1%

具体概率表

除了英语,其他语言也有相关统计(图片来源)

二、一般破解的方法

1. 穷举密钥搜索

  只适用于与小的密钥空间,而像维吉尼亚密码的 Z 26 n Z^n_{26} Z26n​ 是 26 的 n 次方的空间,当 n 很大时,计算量是相当大的。

2. 频率统计

单表代换

移位密码: 相同的明文字母总是对应相同的密文字母,因此,尽管字母的外形改变了,他出现的概率还是不变的,只要根据足够多的样例来进行统计,最终密文字母的出现概率总是近似于明文字母的出现概率,并且与之一一对应。

多表代换

维吉尼亚密码: 相同的明文字母可能对应不同的密文字母,这里讲的维吉尼亚密码的破解也是根据字母出现的频率的蛛丝马迹进行破解。

三、维吉尼亚密码的破解

1. 确定密钥长度

方法一:Kasiski测试法

原理:密文中出现两个相同字母组,它们所对应的明文字母相同的可能性很大,这样的两个密文字母组之间的距离可能为密钥长度的整数倍。

  尽管在维吉尼亚密码中相同的明文可能对应不同的密文,但是若连续出现相同的密文,那么用同样的密钥加密的概率会大大增加。这里密文 Z B ZB ZB 都是用 H I HI HI 加密,计算两者之间的距离为 5 5 5,因此可推断出来密钥长度为 5. 5. 5.

方法二:重合指数法

原理:自然语言(以英语为例)的重合指数约为 0.065,而且单标代换不会改变该值。
重合指数定义:

设 x = x 1 x 2 . . . x n x=x_1x_2...x_n x=x1​x2​...xn​ 是含有 n n n 个字母的串,则在 x x x 中随机选择两个元素且这两个元素相同的概率为:

定义: f i f_i fi​ 为 26 个字母中第 i i i 个字母在 x x x 中出现的次数

[例如: x = A A Z Z Z , n = 5 , f 0 = 2 , f 25 = 3 x=AAZZZ,n=5,f_0=2,f_{25}=3 x=AAZZZ,n=5,f0​=2,f25​=3,第一次取出 A 的概率为 f 0 n \frac {f_0}{n} nf0​​,第二次再取出 A 的概率为 f 0 n ∗ f 0 − 1 n − 1 \frac {f_0}{n} * \frac {f_0-1}{n-1} nf0​​∗n−1f0​−1​]

当我们把 26 个字母的概率全部相加,得到的总的概率就是重合指数
I c ( x ) = ∑ i = 0 25 f i ( f i − 1 ) n ( n − 1 ) I_c(x)={\frac {\displaystyle\sum_{i=0}^{25}f_i(f_i-1)}{n(n-1)}} Ic​(x)=n(n−1)i=0∑25​fi​(fi​−1)​
当计算的数量很大时,我们将 n ( n − 1 ) n(n-1) n(n−1) 近似为 n 2 n^2 n2,将 f i ( f i − 1 ) f_i(f_i-1) fi​(fi​−1) 近似为 f i 2 f_i^2 fi2​

因此
I c ( x ) ≈ ∑ i = 0 25 p i 2 ≈ 0.065 I_c(x) \approx \displaystyle\sum_{i=0}^{25}{p_i^2} \approx0.065 Ic​(x)≈i=0∑25​pi2​≈0.065
这里的 p i p_i pi​ 表示第 i i i 个字母在英语语言中出现的概率,就是在引言中列出的数值。
这个数值非常重要。

注意:在单表代换中,不会改变该值,也就是用相同密钥字加密应服从相同的重合指数。

猜测密钥长度

  假设密钥长度为 d d d,提取相同密钥字加密的密文,测试其重合指数。
  如果猜测正确,则重合指数接近 0.065 0.065 0.065,否则字符串表现得更加随机一般在 0.038 ( 1 / 26 ) ∼ 0.065 0.038(1/26) \thicksim 0.065 0.038(1/26)∼0.065 之间。

  在这里,我们先猜测密钥长度为 5,然后将密文按照 5 进行分组,分别提取出用密钥 k 1 , k 2 , k 3 , k 4 , k 5 k_1,k_2,k_3,k_4,k_5 k1​,k2​,k3​,k4​,k5​ 加密的密文,组成集合 C 1 , C 2 , C 3 , C 4 , C 5 C_1,C_2,C_3,C_4,C_5 C1​,C2​,C3​,C4​,C5​,这样就把多表代换转化成了单表代换。
这里 C 1 = { Z , P , L , W , Z } , C 2 = { P , A , Z , Z , N } , C 3 = { D , Z , B , B , M } , C 4 = { X , H , H , K } , C 5 = { V , S , I , M } C_1=\{Z,P,L,W,Z\},C_2=\{P,A,Z,Z,N\},C_3=\{D,Z,B,B,M\},C_4=\{X,H,H,K\},C_5=\{V,S,I,M\} C1​={Z,P,L,W,Z},C2​={P,A,Z,Z,N},C3​={D,Z,B,B,M},C4​={X,H,H,K},C5​={V,S,I,M}

以一个例子为例:

   C H R CHR CHR 这三个字符出现频率较高,因此我们将其位置记录下来,测算他们之间的距离,并取最大公因数 5,猜测 5 便是密钥长度。这很有可能是相同的明文被相同的密文加密了。其实很容易猜到,这很可能是英语当中的定冠词 the.

我们在用重合指数法进行测试,分别测试 d = 1 , 2 , 3 , 4 , 5 d=1,2,3,4,5 d=1,2,3,4,5 (过程略)

d d d 重合指数
1 1 1 [ 0.045 ] [0.045] [0.045]
2 2 2 [ 0.046 , 0.041 ] [0.046,0.041] [0.046,0.041]
3 3 3 [ 0.043 , 0050 , 0.047 ] [0.043,0050,0.047] [0.043,0050,0.047]
4 4 4 [ 0.042 , 0.039 , 0.046 , 0.040 ] [0.042,0.039,0.046,0.040] [0.042,0.039,0.046,0.040]
5 5 5 [ 0.063 , 0.068 , 0.069 , 0.061 , 0.072 ] [0.063,0.068,0.069,0.061,0.072] [0.063,0.068,0.069,0.061,0.072]

  观察发现,只有当 d = 5 d=5 d=5 的时候,重合指数接近 0.065 0.065 0.065,因此刚刚的猜测 d = 5 d=5 d=5 是正确的,这时通过穷举密钥的复杂度为 2 6 5 26^5 265,但是仍然比较大。

2. 确定密钥字相对位移

密钥字的相对位移实际上就是确定密钥之间的相互关系。
这里引入一个定义:

重合互指数:
  设 x = x 1 , x 2 , . . . , x n , y = y 1 , y 2 , . . . , y n ′ x=x_1,x_2,...,x_n,y=y_1,y_2,...,y_{n'} x=x1​,x2​,...,xn​,y=y1​,y2​,...,yn′​,分别为长度为 n n n 和 n ′ n' n′ 的串,其重合互指数为从 x x x 和 y y y 中分别随机选出一个元素且两个元素相同的概率。

计算方法和刚刚的计算方法类似:
M I c ( x , y ) = ∑ i = 0 25 f i f i ′ n n ′ MI_c(x,y)=\frac{\displaystyle\sum_{i=0}^{25}f_if'_i}{nn'} MIc​(x,y)=nn′i=0∑25​fi​fi′​​
具体不再阐述。

  考虑不同密钥字加密后密文串的重合互指数,设密钥字为 k = k 1 k 2 . . . k d k=k_1k_2...k_d k=k1​k2​...kd​, C i C_i Ci​ 中的一个字母与 C j C_j Cj​ 中的一个字母都是 A A A 的概率为 p 0 − k i p 0 − k j p_{0-k_i}p_{0-k_j} p0−ki​​p0−kj​​.

其中 p 0 − k i p_{0-k_i} p0−ki​​ 为密文 A A A 所对应明文字母的出现概率。同理可以计算 B , C , D , . . . , Z B,C,D,...,Z B,C,D,...,Z,因此:
M I c ( C i , C j ) ≈ ∑ l = 0 25 p l − k i p l − k j = ∑ l = 0 25 p l p l + k i − k j = ∑ l = 0 25 p l − k i + k j p l MI_c(C_i,C_j) \approx \displaystyle\sum_{l=0}^{25}p_{l-k_i}p_{l-k_j}= \displaystyle\sum_{l=0}^{25}p_lp_{l+k_i-k_j}=\displaystyle\sum_{l=0}^{25}p_{l-k_i+k_j}p_l MIc​(Ci​,Cj​)≈l=0∑25​pl−ki​​pl−kj​​=l=0∑25​pl​pl+ki​−kj​​=l=0∑25​pl−ki​+kj​​pl​
这里的下标是需要对 26 取模的,可以观察到: M i c Mi_c Mic​ 取决于相对位移 k i − k j k_i-k_j ki​−kj​.

移位表如下:

观察这里当相对距离为0时,重合互指数为 0.065 0.065 0.065,在之前提到的自然语言的重合互指数也是 0.065 0.065 0.065,这并不是巧合。当相对位移位 0 时,其实就是 C 1 , C 2 C_1,C_2 C1​,C2​ 的集合是用同一种密文加密得到,这也就是单表代换这样,并不会改变重合指数。

这里其实并不需要列举从 0 到 25 的所有值。

猜测不同密钥字的相对位移s(猜测范围0~25)

M I c ( C i , C j ) = ∑ t = 0 25 f i , t f j , t − s n i n j MI_c(C_i,C_j)=\frac{\displaystyle\sum_{t=0}^{25}f_{i,t}f_{j,t-s}}{n_in_j} MIc​(Ci​,Cj​)=ni​nj​t=0∑25​fi,t​fj,t−s​​
  这里 n i n_i ni​ 是指集合 C i C_i Ci​ 中字符个数,这里 n j n_j nj​ 是指集合 C j C_j Cj​ 中字符个数, f i , t f_{i,t} fi,t​ 表示在集合 C i C_i Ci​ 中, t t t 这个密文字符出现的次数, f j , t − s f_{j,t-s} fj,t−s​ 表示在集合 C j C_j Cj​ 中, t − s t-s t−s 这个密文字符出现的次数。

  如果猜对 s s s,那么 M I c MI_c MIc​ 应该接近 0.065 0.065 0.065,这意味着找到了不同密钥字加密的相同的明文字母,这也就找到了密钥字之间的相对位移,也就转化成了单表代换。
这里用 m m m 表示明文字母, c , c ′ c,c' c,c′ 分别表示 C i , C j C_i,C_j Ci​,Cj​ 中 m m m 对应的密文字母,那么:
m = c − k i ( m o d 26 ) m = c ′ − k j ( m o d 26 ) m=c-k_i \pmod{26} \\ m=c'-k_j \pmod{26} m=c−ki​(mod26)m=c′−kj​(mod26)
  实际上,在维吉尼亚密码中,并没有很好的隐藏密钥和密文之间的相互关系,密钥之间的相互差距会体现在密文之间的相互关系。

  我们计算上面例子中的集合 C 1 , C 2 , C 3 , C 4 , C 5 C_1,C_2,C_3,C_4,C_5 C1​,C2​,C3​,C4​,C5​ 两两之间的重合互指数:

  这里的 i , j i,j i,j 表示当取到不同集合的时候,后面的值表示当猜测的相对位移 s s s 取不同值的时候重合互指数的结果。

  我们观察结果,当 i = 1 , j = 2 , s = 9 i=1,j=2,s=9 i=1,j=2,s=9 时,重合互指数达到了 0.068 0.068 0.068,因此可以得到 k 1 − k 2 = 9 k_1-k_2=9 k1​−k2​=9.
  但是当 i = 1 , j = 3 ; i = 1 , j = 4 i=1,j=3;i=1,j=4 i=1,j=3;i=1,j=4 时,没有合适的相对位移,那么我们先暂时跳过,观察其他结果,发现当 i = 1 , j = 5 , s = 16 i=1,j=5,s=16 i=1,j=5,s=16 时,重合互指数达到 0.070 0.070 0.070, i = 2 , j = 3 , s = 13 i=2,j=3,s=13 i=2,j=3,s=13 的时候,重合互指数达到了 0.067 0.067 0.067.

我们列举完剩下的结果,得到:
k 1 − k 2 = 9 k 1 − k 5 = 16 k 2 − k 3 = 13 k 2 − k 5 = 7 k 3 − k 5 = 20 k 4 − k 5 = 11 k_1-k_2=9 \\ k_1-k_5=16 \\ k_2-k_3=13 \\ k_2-k_5=7 \\ k_3-k_5=20 \\ k_4-k_5=11 k1​−k2​=9k1​−k5​=16k2​−k3​=13k2​−k5​=7k3​−k5​=20k4​−k5​=11

3. 穷举搜索密钥字

  根据上述的结果,在确定密钥字之间关系式的基础上,只要穷举 26 26 26 中可能性就可以了。因为当猜测 k 1 k_1 k1​ 的时候, k 2 k_2 k2​ 也就确定下来了,以此类推,剩下的几个密钥也就确定下来了,只要从 A − Z A-Z A−Z 进行穷举即可。

四、总结

  一个好的密码加密方案(或者说是算法),应该要很好的隐藏密钥和密文之间的联系,通过更复杂的算法或者在更大的密钥空间中,可以有效避免穷举搜索破解。如何设计加密算法以及如何选择合适的密钥空间,将在今后继续学习。

密码学(二):古典密码之维吉尼亚密码的破解相关推荐

  1. python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)

    各位白嫖-漂亮大哥哥姐姐们好,在下菜鸡一枚,主要想在这和大家一起探讨学习之道,一起愉快的学习密码学基础.总所周知,密码学学的好,头发掉的少... 直接进入正题,今天我就主要讲三个密码,而且都是古典密码 ...

  2. Vigenere密码(维吉尼亚密码)c语言实现

    Vigenere密码(维吉尼亚密码)c语言实现 简介 Vigenere密码是基于关键词的加密系统. 算法解释 Vigenere密码技术使用一个词组作为密钥,词组中的每一个字母都作为移位替换密码的密钥并 ...

  3. 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

    题目: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码"BLOCKCIPHERDESIGNPRINCIPLE", 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过 ...

  4. 古典密码之维吉尼亚密码实验

    学习目标: 维吉尼亚密码是古典密码中非常具有代表的例子.本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序,通过本实验可以加深理解维吉尼亚密码原理. 预备知识: 人们在单一恺撒密码的基 ...

  5. 古典密码之“维吉尼亚密码”

    简述 维吉尼亚密码是在代换密码(即单表代换)基础上,衍生出来的多表代换密码. 与单表代换相同,维吉尼亚密码也采用明文字母与密钥字母(即26字母表)间建立一一对应关系. 但是不同的是,单表代换密码中一旦 ...

  6. Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密

    文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...

  7. MTALAB实现多表代替密码(维吉尼亚密码)

    维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式. 设d为一固定的正整数,d个位移代换表π=(π1,π2,-,πd),由密钥序列K=(k1,k2 ...

  8. 古典密码之维吉尼亚密码破解思路

    首先要说一句,这是我第一次用python coding,所以很多地方都不太懂,吐槽自己竟然用sum当变量名,之后有用sum()函数,然后报了错还不知道为什么.不知道用ascii码要做chr()转化,等 ...

  9. java维吉尼亚密码_维吉尼亚密码java完整版

    package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...

最新文章

  1. Flash气泡回弹效果
  2. java instanceof 报错_java instanceof方法
  3. javascript中有关this的使用
  4. 如何生成java_如何生成JavaAPI doc
  5. android源码分析之JNI调用与回调
  6. boost::process::windows相关的测试程序
  7. Excel列数和列字母的转换(column number 和 column letters 互转)
  8. 线程的run()方法带参情况
  9. [Leedcode][JAVA][面试题 08.11][硬币][动态规划]
  10. SLAM中的marginalization 和 Schur complement
  11. 图片生成html_markdown 生成头条文章的一个实现
  12. Python pandas学习总结
  13. skype 无法连接
  14. Android Studio升级到3.5之后xml格式化问题
  15. 全国最大孔雀养殖基地在哪里???
  16. openfiler服务器打不开web管理页面
  17. 【Proteus仿真】51单片机+直流电机PWM调速实验
  18. python matplotlib x轴日期显示问题。matplotlib 坐标轴设置文本间隔,matplotlib 坐标轴过于密集、无法实现其他功能。
  19. Android逆向去掉某功能,逆向教程之-反编译apk完全精简删除菜单功能(二)
  20. 汇编实验三:三个有符号数比较大小

热门文章

  1. 滴滴打车如何通过积分商城提升用户活跃度?
  2. 如何使用Python plt像MATLAB一样绘图
  3. HyperWorks案例学习加安装包
  4. mssql保留两位小数
  5. 计算机考研水区旱区名单,2020考研水旱区有哪些呢-考研经验
  6. Linux Ubuntu常用终端命令
  7. 世界之最!史上最烂的开发项目:苦撑12年,600多万行代码…
  8. 关于2PC(二阶段提交)和3PC(三阶段提交)的理解
  9. U3D物体范围内随机运动
  10. 如何才能能够提升个人自信