信息网络安全实验
实验一、DES RSA MD5
一、实验目的
1. 通过对DES算法的代码编写,了解分组密码算法的设计思想和分组密码算法工作模式;
2. 掌握RSA算法的基本原理以及素数判定中的Rabin-Miller测试原理、Montgomery快速模乘(模幂)算法,了解公钥加密体制的优缺点及其常见应用方式;
3. 掌握MD5算法的基本原理,了解其主要应用方法。
二、实验内容
1. DES编程实验
2. RSA编程实验
3. MD5编程实验
三、实验环境
主机:
操作系统:windows11 专业工作站版,64位
cpu: AMD Ryzen 5 4500U
Ram: 16GB
虚拟机: 无
网络连接: 无
四、实验过程
(一)、DES编程实验
(1). DES_EDE2算法程序实现框图:
程序使用说明(Python代码见附录部分):
1. 打开main.py;
2. 给3个参数m(明文)、prok1(DES密钥1)、prok2(DES密钥2)分别赋值;
3. 点击运行即可。
本部分源程序清单:
1. Deslib.py;
2. main.py
3. des.py
4. testCode.py
加解密测试:
1、 DES加密,密钥为112b全0,明文为ff ff ff ff ff ff ff ff,加密结果:
0x35 55 50 b2 15 0e 24 51
2、 DES解密,密钥为112b全0,密文为35 55 50 b2 15 0e 24 51,解密结果:
0xff ff ff ff ff ff ff ff
相关代码:
实机运行截图:
(2). 算法加密速度测试结果:
硬件配置:
cpu:
ram:
测试结果:
实验说明: 使用spdtst1.txt, spdtst2.txt, hand.jpg, castle.png, paper.pdf等5个文件测试DES算法的速度。文件大小以及对应的加密用时分别为:
运行时截图:
(3)、使用CBC方式加密一段64B 自选数据,改变初始向量值,比较加密结果。
64B自选数据:
1sgeiurhn49t340853fiehjgosieurhOIUHRETNBG23456789D!@#$%&*%#@y@
初始向量1:12345678——加密结果1:
qGC4As87+swa1A97AEcR/+UqHKUWN2RsX2rf0m7BfgE3XLOvzkqlzbfBy6rsOu5CHYr8CX65rH5OQ9FNv3dg9zueu7u5kvw8
初始向量2:abcdefgh——加密结果2:
xUhViFWAge1RJZpSKVw5579MFFsv9aDxr8Zt/jS0PvvdfKCXCLWDCQ0cbJKbNR5juP7H5FIRXKqg+bT709pr/vyZQoLxo8Ci
(二)、RSA编程实验
1、RSA算法实现
2、混合加密实验
3、自行编程实现RSA加解密算法
实现框图:
1、密钥生成算法:
2、加密算法:
3、解密算法:
源程序清单:rsa.py
加、解密实例:
明文:m = 125
加密后:167129
解密结果:125
4、RSA签名算法
运行结果:
(三)、MD5编程实验
1、实现自己的MD5算法代码。代码见附录部分。
测试:
message(消息): This is a md5 test.
hash(哈希值): 327d5ac107081f08a3424170232e82d6
2、构造一个长度为1KB左右的文本文件,以MD5算法对文件计算Hash值。
文本文件: md5.txt
内容:The Tower Mansion, 29 Melbury Road, is a late-Victorian townhouse in the Holland Park district of Kensington and Chelsea, London, built by the architect and designer William Burges as his home. Designed between 1875 and 1881, in the French Gothic Revival style, it was described by the architectural historian J. Mordaunt Crook as “the most complete example of a medieval secular interior produced by the Gothic Revival, and the last”.[2] The house is built of red brick, with Bath stone dressings and green roof slates from Cumbria, and has a distinctive cylindrical tower and conical roof. The ground floor contains a drawing room, a dining room and a library, while the first floor has two bedrooms and an armoury. Its exterior and the interior echo elements of Burges’s earlier work, particularly the McConnochie House in Cardiff and Castell Coch. It was designated a Grade I listed building in 1949.
Burges bought the lease on the plot of land in 1875. The house was built by the Ashby Brothers, with interior decoration by members of Burges’s long-standing team of craftsmen such as Thomas Nicholls and Henry Stacy Marks.
Hash值:f0723c283cb89be033889ee35ed34e78
转换成2进制:
11110000011100100011110000101000001111001011100010011011111000000011001110001000100111101110001101011110110100110100111001111000
(3)、修改构造的文本文件(修改字母或增删内容),再次计算Hash值,与步骤(2)中Hash值进行比较,看看多少bit发生改变。
修改:将The Tower House改成The Tower Mansion
新的Hash值:f44f1d2fc44b3037bf3b771259aeb213
转换成2进制:
11110100010011110001110100101111110001000100101100110000001101111011111100111011011101110001001001011001101011101011001000010011
不同的位数:71.
(4)、测试MD5算法的速度。
硬件配置:
cpu:
ram:
实验说明:使用spdtst1.txt, spdtst2.txt, icons.txt, tensorflow.whl, userdata.img等5个文件测试MD5算法的速度。文件大小以及对应散列用时分别为:
运行时截图:
五、实验结论
(一)、DES编程实验
在DES加密算法中,若使用CBC工作模式,且初始向量不同,则加密结果也不同。
(二)、RSA编程实验
加密数据(明文)的数值大小对RSA加密速度的影响:
程序运行截图:
对称密码、非对称密码体制的对比:
(三)、MD5编程实验
算法流程:
MD5是输入不定长度信息,输出固定长度128位的算法。经过程序流程,生成4个32位数据,最后联合起来成为一个128位的散列值。基本方式为:求余、取余、调整长度、与链接变量进行循环运算,得出结果。
运算方式:
图示:
算法流程描述:
(1)、填充:首先将输入信息的长度进行填充,使得位数%512 == 448;
(2)、记录信息长度:用64位来存储填充前信息长度;
(3)、装入4个标准幻数;
(4)、四轮循环运算。
六、实验涉及到的算法
(1)、DES加解密算法、MD5散列算法;
(2)、rsa加解密算法、rsa数字签名算法、Miller-Rabin素数检测法、Montgomery算法.
附录:实验Python源代码
(一)、DES编程实验
Deslib.py:
def eBox(m):return m[31] + m[0] + m[1] + m[2] + m[3] + m[4] + \m[3] + m[4] + m[5] + m[6] + m[7] + m[8] + \m[7] + m[8] + m[9] + m[10] + m[11] + m[12] + \m[11] + m[12] + m[13] + m[14] + m[15] + m[16] + \m[15] + m[16] + m[17] + m[18] + m[19] + m[20] + \m[19] + m[20] + m[21] + m[22] + m[23] + m[24] + \m[23] + m[24] + m[25] + m[26] + m[27] + m[28] + \m[27] + m[28] + m[29] + m[30] + m[31] + m[0]def ipBox(m, reverse=False):if reverse:return m[39] + m[7] + m[47] + m[15] + m[55] + m[23] + m[63] + m[31] + \m[38] + m[6] + m[46] + m[14] + m[54] + m[22] + m[62] + m[30] + \m[37] + m[5] + m[45] + m[13] + m[53] + m[21] + m[61] + m[29] + \m[36] + m[4] + m[44] + m[12] + m[52] + m[20] + m[60] + m[28] + \m[35] + m[3] + m[43] + m[11] + m[51] + m[19] + m[59] + m[27] + \m[34] + m[2] + m[42] + m[10] + m[50] + m[18] + m[58] + m[26] + \m[33] + m[1] + m[41] + m[9] + m[49] + m[17] + m[57] + m[25] + \m[32] + m[0] + m[40] + m[8] + m[48] + m[16] + m[56] + m[24]else:return m[57] + m[49] + m[41] + m[33] + m[25] + m[17] + m[9] + m[1] + \m[59] + m[51] + m[43] + m[35] + m[27] + m[19] + m[11] + m[3] + \m[61] + m[53] + m[45] + m[37] + m[29] + m[21] + m[13] + m[5] + \m[63] + m[55] + m[47] + m[39] + m[31] + m[23] + m[15] + m[7] + \m[56] + m[48] + m[40] + m[32] + m[24] + m[16] + m[8] + m[0] + \m[58] + m[50] + m[42] + m[34] + m[26] + m[18] + m[10] + m[2] + \m[60] + m[52] + m[44] + m[36] + m[28] + m[20] + m[12] + m[4] + \m[62] + m[54] + m[46] + m[38] + m[30] + m[22] + m[14] + m[6]def pBox(m):return m[15] + m[6] + m[19] + m[20] + m[28] + m[11] + m[27] + m[16] + \m[0] + m[14] + m[22] + m[25] + m[4] + m[17] + m[30] + m[9] + \m[1] + m[7] + m[23] + m[13] + m[31] + m[26] + m[2] + m[8] + \m[18]