MD5加密

90 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

接着介绍MD5加密的原理,从而解释为什么MD5加密是不可逆的。再稍微延伸一下为什么有一些网站可以实现类似“可逆”的效果。

上次写到了标准的幻数的(物理顺序) 如果在程序中(小端模式)定义应该是:

A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

然后需要用到 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));
(&是与, |是或, ~是非, ^是异或)

然后是 4 种操作

FF(a,b,c,d,Mi,s,tj) 表示a=b+((a+(F(b,c,d)+Mi+tj)<<< s)
GG(a,b,c,d,Mi,s,tj) 表示 a=b+((a+(G(b,c,d)+Mi+tj)<<< s)
HH(a,b,c,d,Mi,s,tj) 表示 a=b+((a+(H(b,c,d)+Mi+tj)<<< s)
II(a,b,c,d,Mi,s,tj) 表示a=b+((a+(I(b,c,d)+Mi+tj)<<< s)

其中 Mi 表示消息的第 i 个子分组(从 0 到 15,共 16 个),<<< s 表示循环左移 s 位
常数 tj 为: 在第 j 步中,tj 是 4294967296*abs(sin(j)) 的整数部分,i的单位是弧度。 (4294967296是2的32次方)
亦可用 0x100000000UL * abs(sin((double)j)) 计算

x 循环左移 s 位:
( s << x ) | ( s >> (32 - x) )

4.MD5运算:

由类似的64次循环构成,分成 4 轮,每轮 16 次。每轮使用 FF,GG,HH,II 中的一种操作;
一轮中,a,b,c,d 的使用顺序轮转;
例如第一轮:
第一次计算
FF(a,b,c,d,M0,s,t1)
a = a+(F(b,c,d)+M0+t1);
a = ( s <<a ) | ( s >> (32 - a) );
a = a + b;

第二次计算
FF(b,c,d,a,M1,s,t2)
b = b+(F(c,d,a)+M1+t2);
b = ( s <<b ) | ( s >> (32 - b) );
b = b + c;

这 4 轮共 64 步是:
(初次使用的 a,b,c,d 为 A,B,C,D 的值,而 Mi,s,tj 根据下面的数值进行使用,可认为是常量。)

第一轮

FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0×242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0×4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0×698098d8)
FF(d,a,b,c,M9,12,0×8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0×895cd7be)
FF(a,b,c,d,M12,7,0×6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0×49b40821)

第二轮

GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0×265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0×02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0×21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0×455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0×676f02d9)
GG(b,c,d,a,M12,20,0×8d2a4c8a)

第三轮

HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0×8771f681)
HH(c,d,a,b,M11,16,0×6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0×4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0×289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0×04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0×1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0×432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0×655b59c3)
II(d,a,b,c,M3,10,0×8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0×85845dd1)
II(a,b,c,d,M8,6,0×6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0×4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0×2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)

消息分以 512 位为一分组进行处理,每一个分组进行上述 4 轮共 64 次计算后,将 A,B,C,D 分别加上计算得到的 a,b,c,d。当做新的 A,B,C,D,并将这 4 个变量赋值给 a,b,c,d 再进行下一分组的运算。由于填充后的消息长度为 (N+1)*512,则共需计算 N+1 个分组。计算所有数据分组后,这 4 个变量为最后的结果,即 MD5 值。

有点眩晕 :) 下次继续
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!