[关闭]
@DingCao-HJJ 2015-10-31T21:52:03.000000Z 字数 862 阅读 4815

MD5算法原理和流程

MD5


原理

将输入信息text的位数按照特定的方法填充至512的整数倍,然后每512位为一个分组M[i]进行处理。
每个分组又将分为16个32位的子分组,经过一系列循环后将产4个32位的散列值a, b, c, d,作为下一个分组的输入。
最终,将a, b, c, d组合起来即可得到text的MD5值。

流程

MD5流程

详细操作步骤

主流程

Created with Raphaël 2.1.2Start初始化变量(全局的a,b,c,d)输入信息填充信息分组处理数据输出MD5值End

填充信息

Created with Raphaël 2.1.2获得数据填充1位长n满足 n%512==448?填充64位长度信息返回填充好的数据填充0yesno

分组处理数据

Created with Raphaël 2.1.2获得填充好的数据分成n组i=0i < n?用分组M[i], a, b, c, d进行主循环获得新的a, b, c, d 返回MD5值yesno

主循环

Created with Raphaël 2.1.2获得分组M, 和变量a, b, c, d分组M分成16个子分组N[16]每个分组4个字节atemp = a, btemp = bctemp = c, dtemp = d子分组计数j = 0j < 64j < 16 ?fun = F(b, c, d)index = ja = (a + fun + k[j] + N[index]) << s[j]a, b, c, d 向右轮换j < 32 ?fun = G(b, c, d)index = (1+5*j)%16j < 48 ?fun = H(b, c, d)index = (5+3*j)%16fun = I(b, c, d)index = (7*j)%16a += atemp, b += btempc += ctemp, d += dtemp返回新的a, b, c, dyesnoyesnoyesnoyesno

其中,FGHI操作分别是:
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) )

语句
a = (a + fun + k[j] + N[index]) << s[j]
中的<<操作表示循环左移位。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注