当前位置:
文档之家› 实验1-4 HASH算法 MD5-5
实验1-4 HASH算法 MD5-5
二
轮 GG(A,B,C,D,M[9],5,0x21e1cde6) GG(D,A,B,C,M[14],9,0xc33707d6) GG(C,D,A,B,M[3],14,0xf4d50d87) GG(B,C,D,A,M[8],20,0x455a14ed) GG(A,B,C,D,M[13],5,0xa9e3e905) GG(D,A,B,C,M[2],9,0xfcefa3f8) GG(C,D,A,B,M[7],14,0x676f02d9) GG(B,C,D,A,M[12],20,0x8d2a4c8a)
易的。 2.单向性:对于任意一个输出值 y,希望反向推出输入值 x,使得 y=H(x),是非常困难的。 3.无碰撞性:对任意给定的数据块 x,希望找到一个 y,满足 H(x) =H(y),且 x≠y,具
有计算不可行性。 哈希函数可用于数字签名、消息的完整性检测、消息的起源认证检测等。现在常用的
哈希算法有 MD5,SHA 等。我们下面从 MD5 入手来介绍 HASH 算法的实现机制。 MD 系列单向散列函数是由 Ron Rivest 设计,MD5 算法对任意长度的输入值处理后产
实验 1-4 HASH 算法 MD5
一.实验目的 通过实际编程了解 MD5 算法的加密和解密过程,加深对 HASH 算法的认识。
二.实验原理 哈希(Hash)函数是将任意长的数字串转换成一个较短的定长输出数字串的函数,输出的
结果称为哈希值。哈希函数具有如下特点: 1.快速性:对于任意一个输入值 x,由哈希函数 H,计算哈希值 y,即 y=H(x)是非常容
生 128 位的输出值。MD5 算法的实现步骤如下:
Yq 512 bit 128bit
128bit
128 bit
128 bit
MDq 128bit
A B C D 32bit F,T[1…16],M[] 16步 AB CD G,T[17…32],M[] 16步 AB CD H,T[33…48], M[] 16步 AB CD I,T[49…64], M[] 16步
GG(A,B,C,D,M[1],5,0xf61e2562) GG(D,A,B,C,M[6],9,0xc040b340) GG(C,D,A,B,M[11],14,0x265e5a51) GG(B,C,D,A,M[0],20,0xe9b6c7aa) GG(A,B,C,D,M[5],5,0xd62f105d) GG(D,A,B,C,M[10],9,0x02441453) GG(C,D,A,B,M[15],14,0xd8a1e681) 第 GG(B,C,D,A,M[4],20,0xe7d3fbc8)
三
轮 HH(A,B,C,D,M[13],4,0x289b7ec6) HH(D,A,B,C,M[0],11,0xeaa127fa) HH(C,D,A,B,M[3],16,0xd4ef3085) HH(B,C,D,A,M[6],23,0x04881d05) HH(A,B,C,D,M[9],4,0xd9d4d039) HH(D,A,B,C,M[12],11,0xe6db99e5) HH(C,D,A,B,M[15],16,0x1fa27cf8) HH(B,C,D,A,M[2],23,0xc4ac5665)
typedef struct md5_state { ulong64 length; ulong32 state[4], curlen; unsigned char buf[64];
}md5_state; length 记录已经处理过的比特数,curlen 记录已经处理过的字节数,数组 state 存储上面 所说的四个链接变量,buf 作为处理过程中的缓存。
+
+
+
+
“+”代表 mod 232
128bit
图 1-4 MD5 算法的实现步骤在 MD5 算法中,M首Dq先+1 需要对信息进行填充,使其字节长度与
448 模 512 同余。即使信息的字节长度扩展至 n*512+448, n 为一个正整数。填充的方法如
下,在信息的后面填充第一位为 1,其余各位均为 0,直到满足上面的条件时才停止用 0 对 信息的填充。然后,再在这个结果后面附加一个以 64 位二进制表示的填充前信息长度。经 过这两步的处理,现在的信息字节长度为 n*512+448+64=(n+1)*512,即长度恰好是 512 的 整数倍,这样做的原因是为满足后面处理中对信息长度的要求。n 个分组中第 q 个分组表示 为 Yq。
表 1-4 四轮主循环中每轮的详细操作步骤
FF(A,B,C,D,M[O],7,0xd76aa478) FF(D,A,B,D,M[1],12,0xe8c7b756) FF(C,D,A,B,M[2],17,0x242070db) FF(B,C,D,A,M[3],22,0xc1bdceee) FF(A,B,C,D,M[4],7,0xf57c0faf) FF(D,A,B,C,M[5],12,0x4787c62a) FF(C,D,A,B,M[6],17ቤተ መጻሕፍቲ ባይዱ0xa8304613) 第 FF(B,C,D,A,M[7],22,0xfd469501)
HH(A,B,C,D,M[5],4,0xfffa3942) HH(D,A,B,C,M[8],11,0x8771f681) HH(C,D,A,B,M[11],16,0x6d9d6122) HH(B,C,D,A,M[14],23,0xfde5380c) HH((A,B,C,D,M[1],4,0xa4beea44) HH(D,A,B,C,M[4],11,0x4bdecfa9) HH(C,D,A,B,M[7],16,0xf6bb4b60) 第 HH(B,C,D,A,M[10],23,0xbebfbc70)
四
轮 II(A,B,C,D,M[8],6,0x6fa87e4f) II(D,A,B,C,M[15],10,0xfe2ce6e0) II(C,D,A,B,M[6],15,0xa3014314) II(B,C,D,A,M[13],21,0x4e0811a1) II(A,B,C,D,M[4],6,0xf7537e82) II(D,A,B,C,M[11],10,0xbd3af235) II(C,D,A,B,M[2],15,0x2ad7d2bb) II(B,C,D,A,M[9],21,0xeb86d391)
MD5 中有 A、B、C、D 四个 32 位被称作链接变量的整数参数,他们的初始值分别为:
A=01234567, B=89abcdef, C=fedcba98, D=76543210
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中 512 位信息分组的数目。
首先将上面四个链接变量首先复制到另外四个变量中:A 到 AA,B 到 BB,C 到 CC,D 到 DD,以备后面进行的处理。
一
轮 FF(A,B,C,D,M[8],7,0x698098d8) FF(D,A,B,C,M[9],12,0x8b44f7af) FF(C,D,A,B,M[10],17,0xffff5bb1) FF(B,C,D,A,M[11],22,0x895cd7be) FF(A,B,C,D,M[12],7,0x6b901122) FF(D,A,B,C,M[13],12,0xfd987193) FF(C,D,A,B,M[14],17,0xa679438e) FF(B,C,D,A,M[15],22,0x49b40821)
程序中用到的函数介绍如下: 1) void md5_init(md5_state * md) 函数名称:初始化函数: 参数说明: md 指向一个上面所提到到结构体变量。初始化时把 curlen 和 length 置为 0,并把四个 链接变量储存到 state 中。 2) int md5_process (md5_state * md, const unsigned char *buf, unsigned long len) 函数名称:处理函数 参数说明: md 指向经过初始化函数处理过的一个结构体变量 buf 指向待处理的信息 len 是 buf 中信息的长度,以字节为单位 这个函数对待处理的信息以 512bit 为单位进行压缩,不足的部分存储在结构体的 buf 中,并且用 len 来指示信息的末尾。这样下次调用时会接着上一次的结果进行。 3) int md5_done(md5_state * md, unsigned char *hash) 函数名称:完成函数 参数说明:md 指向上面所处理过的结构体 hash 指向存储结果的缓冲区 这个函数对未完成的信息先进行 padding 操作,然后处理,并把最终结果存在 hash 指 向的缓冲区中。 4) int md5_test(void) 函数名称:测试函数 这个函数对上面的三个函数进行测试。函数内部定义了一组信息和 hash 结果一一对应 的数组。通过调用上面的三个函数,并把结果和正确结果相比较,可以说明程序正确与否。 2.使用实例分析 下面的程序实现了对“hello,world”进行 MD5 处理的功能,可以作为调用 MD5 函数接 口的参考。 #include "md5.h"
以下是每次操作中用到的四个非线性函数(每轮一个)。
F(B,C,D) =(B ∧ C) ∨ (B ∧ D)
G(B,C,D)= (B ∧ D) ∨ (C ∧ D) H(B,C,D)=B ⊕ C ⊕ D
I(B,C,D)=C ⊕ (B ∨ D)
( ∧ 是与, ∨ 是或, 是非, ⊕ 是异或)
下面为每一轮 16 步操作中的 4 次操作,16 步操作按照一定次序顺序进行。 FF(A,B,C,D,M[j],S,T[i]) 表示 a=b+((a+(F(B,C,D)+M[j]+T[i])<<<S) GG(A,B,C,D,M[j],S,T[i]) 表示 a=b+((a+(G(B,C,D)+M[j]+T[i])<<<S) HH(A,B,C,D,M[j],S,T[i]) 表示 a=b+((a+(H(B,C,D)+M[j]+T[i])<<<S) II(A,B,C,D,M[j],S,T[i]) 表示 a=b+((a+(I(B,C,D)+M[j]+T[i])<<<S) (注:“+”定义为 mod 232 的模运算。) M[j]表示在第 q 个 512 位数据块中的第 j 个 32 位子分组,0≤j≤15。 常数 T[i]可以如下选择,在第 i 步中,T[i]是 4294967296*abs(sin(i))的整数部分(注: 4294967296=232),i 的单位是弧度。在这里,T[i]是 32bit 的随机数源,它消除了输入数据 中任何规律性的特征。 表说明了四轮主循环中每轮 16 步操作的具体步骤: 所有这些完成之后,将 A、B、C、D 分别加上 AA、BB、CC、DD。然后用下一分组 数据继续运行算法,最后的输出是 A、B、C 和 D 的级联。 需要额外说明的一点是,在 2004 年 8 月,在 Crypto’2004 国际密码学会议上,来自山 东大学王小云教授的研究成果证实了 MD5 算法存在碰撞性,即不同的输入值经过 MD5 转 换可以产生的相同的输出值。这一发现意味着采用 MD5 算法的数字签名、完整性检验等信 息安全应用系统将不再安全了,这将促使信息安全系统的设计者尽快去寻找和探索新的哈希 算法。 三.实验环境 运行 windows 或 linux 操作系统的 PC 机,具有 gcc(linux)、VC(windows)等 C 语言 编译环境。 四.实验内容和步骤 1.算法分析 在光盘中附加了有关 MD5 算法的头文件 md5.h 和实现文件 md5.c,根据所提供的文件 分析 MD5 算法的实现过程。 下面简单介绍所用到的结构体变量和函数。程序中用到的结构体变量: