[TABLE]
: p: d8 o- P8 Z7 O/ I 0 T9 ]! U7 J6 f9 U+ {) V
+ O1 t0 H& }5 k
; i; i* @+ H2 `" h4 a: x
: j4 K$ r* s% b9 b" f8 c& \. a
7 d; i9 O3 l7 p' P
: t, o& O, K `4 H - f3 v' V2 `) m$ o1 w
[TR]
. q+ J/ ?+ |7 M0 q
9 F* }; M2 K# J0 f 6 R( h1 Z' `. U5 I; d% q* p9 P
" G9 k7 F$ ]/ o3 J; c
[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
z5 z! J4 H+ C首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
9 j0 e8 h4 } s( ~四个32位变量初始化为:
7 C1 r' Z6 w1 gA=0x01234567 3 l! _: |! h; c" g+ C" Q4 r' y0 l
B=0x89abcdef 6 A1 C& M. t0 t! r0 m L9 L
C=0xfedcba98 ) \- _( v# {8 h- E3 u
D=0x76543210 , d: j4 i2 K; |$ o/ s ~
它们称为链接变量(chaining variable) : ]7 `/ c) _% x
接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 - w) J. k" O# G$ o) t7 M* C
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 - T% G9 R( N3 `: _, n2 `) [
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
& Z/ A& S) N! h) [1 m以一下是每次操作中用到的四个非线性函数(每轮一个)。
" @+ C3 `2 \2 w7 ZF(X,Y,Z)=(X&Y)|((~X)&Z) ) J$ C& [+ x+ Q6 @ [8 q
G(X,Y,Z)=(X&Z)|(Y&(~Z)) # V6 P. M+ u* e6 k( }
H(X,Y,Z)=X^Y^Z . n9 O- W+ j3 W
I(X,Y,Z)=Y^(X|(~Z)) 6 E( |3 T2 j& ]
(&是与,|是或,~是非,^是异或)
, c4 m0 b3 R+ r4 v4 B& f3 P这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
2 j, m- b3 S# |9 I7 u+ t1 o函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 4 ]6 w, r; e9 C- Q& G
设Mj表示消息的第j个子分组(从0到15),<<6 y. z- O6 N" z2 e# u
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<9 V0 y9 E, U: I9 @& C
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<* h! _+ L4 w* z$ k% h6 l
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<2 I( c$ `2 l. r& e2 M/ `, A9 @1 B
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
) O0 N: [0 c1 R' h这四轮(64步)是:
6 n3 l" ]0 h: m第一轮
7 l4 J6 b" x. ]3 G* P/ wFF(a,b,c,d,M0,7,0xd76aa478) # Q8 w3 }, V* p1 x: f7 P
FF(d,a,b,c,M1,12,0xe8c7b756) # d6 \3 ^! u+ ~, x3 d- H
FF(c,d,a,b,M2,17,0x242070db) ! i( s0 }( g! g1 z( _% c
FF(b,c,d,a,M3,22,0xc1bdceee)
; O7 r! } [# `( {! WFF(a,b,c,d,M4,7,0xf57c0faf) % N! R) N! p+ Q5 e- i$ @
FF(d,a,b,c,M5,12,0x4787c62a)
- K. m' \, M8 { t" QFF(c,d,a,b,M6,17,0xa8304613) 9 m( a, ^4 W- {. _, k& m! L5 b
FF(b,c,d,a,M7,22,0xfd469501)
4 U/ f @$ s0 P0 [8 o8 D8 GFF(a,b,c,d,M8,7,0x698098d8)
- f+ }, L( h+ V/ }# |7 Z* A5 AFF(d,a,b,c,M9,12,0x8b44f7af) 9 @; K4 a& ], y& y3 o4 s5 J
FF(c,d,a,b,M10,17,0xffff5bb1)
8 R7 l4 u/ K4 Z/ k k$ qFF(b,c,d,a,M11,22,0x895cd7be) 8 |# n( k( {8 W6 v( a
FF(a,b,c,d,M12,7,0x6b901122) & ?: l7 Q* E/ S- V: O2 L/ X
FF(d,a,b,c,M13,12,0xfd987193)
1 {) F" m; V9 ?2 k! j6 cFF(c,d,a,b,M14,17,0xa679438e)
) m5 F/ E( ~) IFF(b,c,d,a,M15,22,0x49b40821) : n6 y- M" y! C% c: H1 W
第二轮
7 ~$ R# s; c( r% M# c xGG(a,b,c,d,M1,5,0xf61e2562) ( q. ^6 Z9 {: A r( ~
GG(d,a,b,c,M6,9,0xc040b340)
, |# x6 |1 U& }* [" ~8 t/ TGG(c,d,a,b,M11,14,0x265e5a51) ' m6 N0 ?' Q/ d
GG(b,c,d,a,M0,20,0xe9b6c7aa)
6 H7 J. q" M# ]8 M; VGG(a,b,c,d,M5,5,0xd62f105d) & L, q$ o* Z- ~" ?
GG(d,a,b,c,M10,9,0x02441453)
1 `& ]2 R1 d9 v" W# ?9 v/ ^GG(c,d,a,b,M15,14,0xd8a1e681)
1 G5 h- T8 |' _! w0 c$ I* OGG(b,c,d,a,M4,20,0xe7d3fbc8) 9 M. }6 F7 [1 F
GG(a,b,c,d,M9,5,0x21e1cde6)
1 i( y5 N& i. L, j2 U' g; b) BGG(d,a,b,c,M14,9,0xc33707d6)
3 y+ C$ ?6 h) Z4 \GG(c,d,a,b,M3,14,0xf4d50d87) ' ^" E4 N0 h; b% V) I
GG(b,c,d,a,M8,20,0x455a14ed)
, j9 A6 m! A# P Y9 G( n! X( E" cGG(a,b,c,d,M13,5,0xa9e3e905) : k: v# h3 G+ p% }& ^$ b, H4 y
GG(d,a,b,c,M2,9,0xfcefa3f8) 9 @9 x8 M7 p( V% I, `
GG(c,d,a,b,M7,14,0x676f02d9) 0 _# B, q* w/ P3 U! O7 ]5 G
GG(b,c,d,a,M12,20,0x8d2a4c8a)
. t4 q+ h3 a+ P第三轮
7 h9 d9 t1 }% f8 SHH(a,b,c,d,M5,4,0xfffa3942)
9 k& m- g0 ^- c& B8 EHH(d,a,b,c,M8,11,0x8771f681) 5 Y4 |5 U9 O8 d" Q; s; t
HH(c,d,a,b,M11,16,0x6d9d6122)
( V& V! _( R$ U# P( ~% fHH(b,c,d,a,M14,23,0xfde5380c)
# h$ C$ {/ G' O. [9 c/ GHH(a,b,c,d,M1,4,0xa4beea44)
& h# G5 @9 d9 V% THH(d,a,b,c,M4,11,0x4bdecfa9) 9 U# l* c; t- h( \) a5 j1 g
HH(c,d,a,b,M7,16,0xf6bb4b60)
& z; X6 Q1 V. F5 z/ H5 zHH(b,c,d,a,M10,23,0xbebfbc70)
+ z" T8 J% h$ z7 T" |7 M3 xHH(a,b,c,d,M13,4,0x289b7ec6)
. U: w# @. O: l9 S* ]2 l# iHH(d,a,b,c,M0,11,0xeaa127fa)
5 n" i' s" G6 \6 x" s H: iHH(c,d,a,b,M3,16,0xd4ef3085) / T s, N% x7 }) L' K1 ?) Q
HH(b,c,d,a,M6,23,0x04881d05)
9 G& ~3 F2 p) ~1 K6 ZHH(a,b,c,d,M9,4,0xd9d4d039) 6 Z4 A' A y3 z( T, ~, ?+ i" Q
HH(d,a,b,c,M12,11,0xe6db99e5) 1 n$ `1 |2 Y7 |6 s. d+ G; H9 n
HH(c,d,a,b,M15,16,0x1fa27cf8)
9 r6 [1 ^8 ~2 j7 w6 [HH(b,c,d,a,M2,23,0xc4ac5665)
4 [/ G. e {& Z5 G# B5 B1 n第四轮 " Z) G+ F7 P) z. g( R
II(a,b,c,d,M0,6,0xf4292244) 7 K, v5 z, z8 K) x) P
II(d,a,b,c,M7,10,0x432aff97)
& S/ @5 }$ d' |4 q0 @II(c,d,a,b,M14,15,0xab9423a7)
$ {' h; h" z! M) Y; n. Q2 R q5 UII(b,c,d,a,M5,21,0xfc93a039)
1 ]# K. f2 x0 @. C0 B( VII(a,b,c,d,M12,6,0x655b59c3)
/ X; i# p6 }- s; t* J. @% {II(d,a,b,c,M3,10,0x8f0ccc92)
* g6 l; g& s( KII(c,d,a,b,M10,15,0xffeff47d)
) r, M$ n( Y) f8 ~II(b,c,d,a,M1,21,0x85845dd1) 6 T& X1 ?) y+ Q) D/ H
II(a,b,c,d,M8,6,0x6fa87e4f)
' E, l; C0 Y, SII(d,a,b,c,M15,10,0xfe2ce6e0) % c) S1 B; j3 d( L2 \. {
II(c,d,a,b,M6,15,0xa3014314)
9 W! K' _* z' S" h' rII(b,c,d,a,M13,21,0x4e0811a1)
6 ?; u& a8 W$ L% u1 A$ a" PII(a,b,c,d,M4,6,0xf7537e82) $ k- {- @2 p6 A3 C W( T6 i3 e8 T! A
II(d,a,b,c,M11,10,0xbd3af235) ; Y- d2 }0 O! m: O6 I$ J( s
II(c,d,a,b,M2,15,0x2ad7d2bb) ; _( e3 }, D( }4 J- l' c/ q
II(b,c,d,a,M9,21,0xeb86d391) 1 g. g0 \ r9 @' j4 {
常数ti可以如下选择:
2 r; Z* h2 N2 |, h U在第i步中,ti是4294967296*abs(sin(i))的 |