古典密码实现与分析

古典密码实现与分析实验报告


实验目的:

通过实验掌握维吉尼亚密码,希尔密码的算法以及分析,加深对其认识

实验内容:

1. 编程实现并分析书上1.21(b)维吉尼亚密码的密文

密文如下:

KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXRGUDDKOTFMBPVGEGLTGCKQRACQCWDNAWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJVAJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGSFRLSWCWSJTBHAFSIASPRJAHKJRJUMVGKMITZHFPDISPZLVLGWTFPLKKEBDPGCEBSHCTJRWXBAFSPEZQNRWXCVYCGAONWDDKACKAWBBIKFTIOVKCGGHJVLNHIFFSQESVYCLACNVRWBBIREPBBVFEXOSCDYGZWPFDTKFQIYCWHJVLNHIQIBTKHJVNPIST

分析过程:

1.首先我们使用Kaisiski测试法来大致猜测一下密钥的长度。
在这里插入图片描述在这里插入图片描述在这里插入图片描述发现HJV出现了5次,kf出现了4次,相同子串间的距离为12,故猜测密钥的长度可能是3,6,或者12.

2.再利用重合指数法来确认这一个猜测,这时就需要进行编程了

古典密码实现与分析_第1张图片在这里插入图片描述
根据上述重合指数计算公式,编写一个getkeylength函数用来获取密钥的长度,实现的思路是对密钥长度从1开始遍历,并且计算重合指数,直到密钥长度为某一个值的时候,重合指数averageIC大于0.06,这个时候我们就认为这个值就是密钥的长度。

确认密钥的长度以后,接下来就要考虑怎样求出具体的密钥了

古典密码实现与分析_第2张图片在这里我们编写一个getKey函数,用来获取密钥字符串的值,并且直接打印到屏幕上

首先导入26个英文字母的频率表,然后计算明文字符移动了多少位变成的密文字符,判断mg如果大于0.055我们就认为此时的移位k是密钥的其中一位

最后把密钥每一位确定,转化成相应的字母,就能得到完整的密钥了

当我们得到密钥以后,最后我们只需要编写一个维吉尼亚密码的解密函数就可以求出明文了
代码如下:
古典密码实现与分析_第3张图片
输入key的值就可以进行解密了,原理就是维吉尼亚密码解密的原理

实验结果

main函数:
古典密码实现与分析_第4张图片结果中没有输出密钥的长度,而是代入到了getkey函数中直接求密钥了
在这里插入图片描述以上就是解密得到的明文

2.编程实现1.24仿射希尔密码

要求:已知明文,密文,m=3,求出密钥
明文:adisplayedequation
密文:dsrmsioplxljbzullm

分析思路:

明文和密文的长度都为18,故可以分为两组,每一组的长度为9,可以构成一个3*3的方阵
明文矩阵记为X1,X2
密文矩阵记为Y1,Y2

于是有,Y1=X1*L+b,Y2=X2 *L+b
两式做差,消去b,有Y1-Y2=(X1-X2)*L
求出X1-X2的逆矩阵,然后×Y1-Y2就能求出密钥L了。

根据L,就能通过矩阵某一行, 求出密钥b了。

实现代码:
古典密码实现与分析_第5张图片
古典密码实现与分析_第6张图片上述main函数里就是实现了刚才分析的内容,进行了矩阵的计算从而求得结果,但是对于其中的矩阵求逆函数getmatrixInverse,要考虑到模运算下的矩阵求逆,我实现了一个求行列式以及伴随矩阵的函数来辅助进行矩阵的求逆运算。
实现代码如下:
古典密码实现与分析_第7张图片古典密码实现与分析_第8张图片古典密码实现与分析_第9张图片注意一定要记得把结果模26

实验结果:

古典密码实现与分析_第10张图片
至此,两个密钥就都求解完成了

程序清单

古典密码实现与分析_第11张图片

心得体会

这次实验的难度和代码量不是很大,通过本次古典密码学的实验,意识到了密钥对于加密和解密来说是十分重要和不可或缺的部分,知道了密钥,什么密文都可以轻松破解。但是很多时候,密钥的破解不是轻松的,需要词频统计、重合指数分析、甚至通过已知密文攻击等手段才可以得到。这次是密码学入门的第一次实验吧,我也认识到了求密钥是比如何加密解密更重要的过程。

你可能感兴趣的:(古典密码实现与分析)