《计算机信息安全》实验指导书
实验三 Hash函数加密解密实验
实验学时:2学时 实验类型:设计 实验要求:必修 一 实验目的
1、了解MD5算法的基本原理;
2、熟悉MD5消息摘要算法的编程实现方法;
3、通过用MD5算法对随机产生的数据进行哈希来深刻了解MD5的运行原理。
二 实验内容
1、根据MD5算法原理,用Turbo C2.0或Visual C++6.0设计编写符合MD5算法思想的消息摘要生成程序。
三 实验环境
1、操作系统:Windows9x/NT/2000/XP 2、编程软件:Turbo C2.0或Visual C++6.0
四 实验原理
1、MD5算法的作用是把一个任意长度的消息进行变化产生一个128bit的消息摘 要。
2、MD5算法除了要能够满足完成完整性验证必需的要求外,还要求运算效率要 高。因此,MD5将消息分成若干个512bit的分组(大块)来处理输入的消息, 且每一个分组又被划分成16个32bit的子分组(子块),经过一系列变换后, 算法的输出由4个32bit分组构成,将这4个32bit分组连接后生成一个 128bit的消息摘要。
3、MD5算法以32位字运算为基础,加密算法有4轮,每一轮要进行16次迭代 运算。
●整个算法分为五个步骤。
9
《计算机信息安全》实验指导书
步骤1: 增加填充位
在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448,即信息的字节长度扩展至N×512+448,N为一个正整数。填充的方法是:第一位为1,后面各位全为0。 步骤2: 附加消息长度值
然后,再在填充后的报文后面附加一个64位的长度值,该长度值来源于填充前的原始报文长度。
经过上述两步处理,当前报文的比特长度=N×512+448+64=(N+1)×512,即长度恰好是512的整数倍。
按照512的长度为单位,将报文分割成Y0,Y1,?YN-1,每一个分组又可以表示成16个32位的字。 步骤3: 初始化MD缓冲区
MD5有A,B,C,D四个32位的寄存器用作缓冲区,它们的初始值分别为 A=01 23 45 67,B=89 ab cd ef,C=fe dc ba 98,D=76 54 32 10。 步骤4: 以512位的分组为单位处理消息
从分组Y0开始,到最后一个分组YN-1,依次进行HMD5压缩运算。每个HMD5有两个输入(一个是128位的CV0,另一个是512位的分组Yi)和一个128位的输出。最开始的128位输入为4个32位寄存器的初始值,以后每个HMD5的输出作为下一个128位的输入。 步骤5: 输出
最后一次进行HMD5后输出的128位值,即为所求的消息摘要MD。如图所示。
512位512位N′512位L位填充位原始消息长度(64位)消息100...00L512位512位
IV128Y0512128CV1Y1512?Yi512128CVi?YN-1512HMD5HMD5?HMD5?128CVN-1HMD5128位的散列值D5压缩函数HMD5的处理过程
10
《计算机信息安全》实验指导书
●HMD5算法
HMD5算法是MD5的关键函数,它是一个4轮循环,如图所示。
HMD5算法
(1)运算一开始,先将4个寄存器的初始值复制到另外4个变量中, A=a,B=b,C=c,D=d。
(2)注循环右4轮,每一轮结构都很相似。在每一轮中进行16次迭代操作。每次 操作对a,b,c,d中的3个做一次非线性函数运算。然后将所得结果加上第4 个变量以及报文的一个子分组和一个常数T[i]。再将所得结果循环左移一个 不定的数,并加上a,b,c,d中之一。即a=b+((a+g(b,c,d)+X[k]+T[i])<<
(4)下面为每一轮16次操作中的4次操作,16次操作按照一定顺序进行。 FF(a,b,c,d,M[j],S,T[i])表示a=b+(a+(F(b,c,d)+M[j]+T[i])<<
11
《计算机信息安全》实验指导书
GG(a,b,c,d,M[j],S,T[i])表示a=b+(a+(G(b,c,d)+M[j]+T[i])<<
这里,“+”定义为mod 232的模运算。M[j]表示在第n个512位数据块的第j个32位子分组,0≤j≤15。在第i步中,T[i]是32位的随机数源,它消除了输入数据中任何规律性的特征。
五 实验步骤
本实验为一个设计性实验,要求学生自己根据实验原理,自行设计实验步骤,编程实现MD5算法。并利用该程序对一个文件或字符串进行处理,计算其Hash值。
六 程序清单
1、头文件
typedef struct {
UINT4 state[4]; /* 数组state[4]用来存储MD5的四个寄存器A,B,C,D值*/
UINT4 count[2]; /* count[0]用来记录已经处理过的位数,count[1]用来记录已经处理 过的字节数 */
unsigned char buffer[64]; /* buffer作为输入过程中的缓存 */ } MD5_CTX;
2、主循环
/*MD5的四个基本逻辑函数F,G,H,I*/ #define F(x,y,z) (((x)&(y))|((~x)&(z))) #define G(x,y,z) (((x)&(z))|((y)&(~z))) #define H(x,y,z) ((x)^(y)^(z)) #define I(x,y,z) ((y)^((x)|(~z)))
/*第一轮中每一次迭代运算所输入的内容由函数FF表示*/ #define FF(a, b, c, d, x, s, ac) { \\
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \\ (a) = ROTATE_LEFT ((a), (s)); \\
12