Hash函数 MD5
MD5算法描述
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位 子分组,经过了一系列的处理后,算法的输出由四个32位分组组成, 将这四个32位分组级联后将生成一个128位散列值。
填充位 L× 512 bit=N× 32 bit K bit 消息 100…0
64 消息长度(K mod 2 )
抗碰撞性攻击 由于Hash函数具有压缩的性质,所以必 然存在多个消息串对应同一Hash值的可能, 这就是所说的碰撞的出现
抗第一原像攻击
对于任意一个消息串a,容易得到它的Hash值 h(a);但是从它的Hash值h(a)很难推出相应 的消息串a,此时消息串a称之为h(a)的原像。
抗第二原像攻击
对于某一给定的消息串a,很难找到另一不 同的消息串b,使得h(a)=h(b)。抗第二原像 攻击使得Hash函数可以应用于数字签名和 身份认证领域。
HH(a,b,c,d,Mi,s,ti)表示 a=b+((a+(H(b,c,d)+Mi+ti)<<<s)
II(a,b,c,d,Mi,s,ti)表示 a=b+((a+(I(b,c,d)+Mi+ti)<<<s)
MD5算法描述
这四轮中的第1步进行不同处理,其他步骤是相同的。
---每一轮有16个输入子块X[0],X[1],„,X[15],或表示为X[i],其 中i为1~15。每个子块为32位。 ---T是个常量数组,包含64个元素,每个元素为32位。我们把数组t的 元素表示为T[1],T[2],„,T[64],或T[i],其中i为1~64。由于有 四轮,因此每一轮用64个T值中的16个。
MD5算法描述
在MD5算法中,明文字的顺序表(X[i])有如下定义:
即每次所取的X[i]顺序如下:
MD5算法描述
其中移位S的定义如下:
MD5算法描述
第一次循环: FF(a,b,c,d,M0,7,0xd76aa478) FF(d,a,b,c,M1,12,0xe8c7b756) FF(c,d,a,b,M2,17,0x242070db) FF(b,c,d,a,M3,22,0xc1bdceee) FF(a,b,c,d,M4,7,0xf57c0faf) FF(d,a,b,c,M5,12,0x4787c62a) FF(c,d,a,b,M6,17,0xa8304613) FF(b,c,d,a,M7,22,0xfd469501) FF(a,b,c,d,M8,7,0x698098d8) FF(d,a,b,c,M9,12,0x8b44f7af) FF(c,d,a,b,M10,17,0xffff5bb1) FF(b,c,d,a,M11,22,0x895cd7be) FF(a,b,c,d,M12,7,0x6b901122) FF(d,a,b,c,M13,12,0xfd987193) FF(c,d,a,b,M14,17,0xa679438e) FF(b,c,d,a,M15,22,0x49b40821) 第二次循环: GG(a,b,c,d,M1,5,0xf61e2562) GG(d,a,b,c,M6,9,0xc040b340) GG(c,d,a,b,M11,14,0x265e5a51) GG(b,c,d,a,M0,20,0xe9b6c7aa) GG(a,b,c,d,M5,5,0xd62f105d) GG(d,a,b,c,M10,9,0x02441453) GG(c,d,a,b,M15,14,0xd8a1e681) GG(b,c,d,a,M4,20,0xe7d3fbc8) GG(a,b,c,d,M9,5,0x21e1cde6) GG(d,a,b,c,M14,9,0xc33707d6) GG(c,d,a,b,M3,14,0xf4d50d87) GG(b,c,d,a,M8,20,0x455a14ed) GG(a,b,c,d,M13,5,0xa9e3e905) GG(d,a,b,c,M2,9,0xfcefa3f8) GG(c,d,a,b,M7,14,0x676f02d9) GG(b,c,d,a,M12,20,0x8d2a4c8a)
MD5算法描述
步骤四:处理 512 比特 报文分组序列
算法的核心是一个 包含四个“循环”的压 缩函数,右图为单个 512比特分组MD5处理过 程:
MD5算法描述
步骤五:输出 所有L个512比特的分组处理完成后,第L阶段产生的输出便是128 比特的报文摘要。说明:最后的输出是A,B,C和D的级联。最后得到 的A,B,C,D就是输出结果,A是低位,D为高位,DCBA组成128位输出 结果。
Hash函数类别
Hash函数有上述三个安全特性,由于这些特性,Hash 函数在公钥密码、数字签名、完整性检验、身份认证 等领域中有着广泛的应用。
MD4 MDx系列 MD5 NAVAL RIPEND SHA-0
SHA系列
SHA-1 SHA-256 SHA是Message-Digest Algorithm 5(信息 -摘要算法),在90年代初由Mit Laboratory For Computer Science 和 Rsa Data Security Inc 的 Ronaldl.rivest开发出来,经md2、md3和md4发展 而来。它的作用是让大容量信息在用数字签名软 件签署私人密钥前被“压缩”成一种保密的格式。
MD5算法
2004年8月17日的美国加州圣巴巴拉的国际密码学会议上,山东大学的 王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,提 出了一套新的针对MDx系列的Hash函数的分析技术,同时给出了得到满 足差分路线的充分条件的方法,以及如何使用明文修改技术来提高碰 撞攻击的成功概率。公布了MD系列算法的破解结果,标志着MD5加密算 法不再是一种安全的加密算法。
512 bit Y0 512 IV HMD5 CV 1 128
512 bit Y1 512 HMD5 … CV L-1 128 …
512 bit YL-1 512 HMD5 128位消息摘要
128
MD5算法描述
步骤一:附加填充位 对报文填充使报文的长度(比特数)与448模512同余。即填充比 特使长度为512的整数倍减去64。
Hash函数MD5算法
Hash函数
“Hash函数"一词最初来源于计算机科学,表 示可以将任意长度的字符串压缩成固定长度 的字符串的函数,Hash函数的输出结果,称 为Hash值,又称为消息摘要、指纹等。
Hash函数设计原则
Hash函数的算法是公开的,实际应用中,安全的Hash函数 必须符合以下三个设计原则:
MD5算法描述
第三次循环: HH(a,b,c,d,M5,4,0xfffa3942) HH(d,a,b,c,M8,11,0x8771f681) HH(c,d,a,b,M11,16,0x6d9d6122) HH(b,c,d,a,M14,23,0xfde5380c) HH(a,b,c,d,M1,4,0xa4beea44) HH(d,a,b,c,M4,11,0x4bdecfa9) HH(c,d,a,b,M7,16,0xf6bb4b60) HH(b,c,d,a,M10,23,0xbebfbc70) HH(a,b,c,d,M13,4,0x289b7ec6) HH(d,a,b,c,M0,11,0xeaa127fa) HH(c,d,a,b,M3,16,0xd4ef3085) HH(b,c,d,a,M6,23,0x04881d05) HH(a,b,c,d,M9,4,0xd9d4d039) HH(d,a,b,c,M12,11,0xe6db99e5) HH(c,d,a,b,M15,16,0x1fa27cf8) HH(b,c,d,a,M2,23,0xc4ac5665) 第四次循环: II(a,b,c,d,M0,6,0xf4292244) II(d,a,b,c,M7,10,0x432aff97) II(c,d,a,b,M14,15,0xab9423a7) II(b,c,d,a,M5,21,0xfc93a039) II(a,b,c,d,M12,6,0x655b59c3) II(d,a,b,c,M3,10,0x8f0ccc92) II(c,d,a,b,M10,15,0xffeff47d) II(b,c,d,a,M1,21,0x85845dd1) II(a,b,c,d,M8,6,0x6fa87e4f) II(d,a,b,c,M15,10,0xfe2ce6e0) II(c,d,a,b,M6,15,0xa3014314) II(b,c,d,a,M13,21,0x4e0811a1) II(a,b,c,d,M4,6,0xf7537e82) II(d,a,b,c,M11,10,0xbd3af235) II(c,d,a,b,M2,15,0x2ad7d2bb) II(b,c,d,a,M9,21,0xeb86d391)
MD5算法描述
每轮运算用到了4个基本逻辑函数: F(X,Y,Z) =(X&Y)|((~X)&Z) G(X,Y,Z) =(X&Z)|(Y&(~Z)) H(X,Y,Z) =X^Y^Z I(X,Y,Z)=Y^(X|(~Z)) (&代表与,|代表或,~代表非,^代表异或)
MD5算法描述
MD5单步操作 设Xi表示消息的第i个子分组(从0到15);<<<S表示循环左移S位,则四 种操作为: FF(a,b,c,d,Mi,s,ti)表示 a=b+((a+(F(b,c,d)+Mi+ti)<<<s) GG(a,b,c,d,Mi,s,ti)表示 a=b+((a+(G(b,c,d)+Mi+ti)<<<s)
MD5算法描述
步骤四中,四个循环有相似的结构,但每次循环使用不同的原始逻辑 函数,说明中表示为FGHI。每一循环都以当前的正在处理的512比特分 组(Yq)和128比特的缓存值ABCD为输入,然后更新缓存的内容。