[TABLE]
, h( S8 G$ b* a" b8 ]% V1 S ( G* O2 y$ j# ]& X2 T
$ Q/ m# l. m+ L, F+ M( q / q7 v$ R$ e, A6 y( w/ e! }/ d d
2 L& L- K% |" W' _0 j% d( s
) h9 ^# e4 v& E
( O# @ ~$ X. T! ~6 X$ t: G 9 u, C/ @8 O8 c, v
[TR] |" u; |+ G7 @+ s' J9 t
3 ]2 @ G( M o; |0 V% I: n& f
4 T# r, c$ w# Q# S
0 d& H$ d: A2 Q" r/ N8 S[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
9 n4 x. K! u* ^" s首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
( N7 q$ l; Z G. w0 n四个32位变量初始化为:
0 i+ K+ m2 F$ s* t; L" dA=0x01234567 # W x$ D: L; H' @: v4 ]
B=0x89abcdef
' T+ P" U3 k7 gC=0xfedcba98
X6 Z6 w3 D2 ]D=0x76543210
% N# ^' y, g) @' J2 k- U它们称为链接变量(chaining variable)
- u3 y1 P' y2 K3 y% F接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 8 V1 y7 v6 w3 o: I. K! f
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 / K! n* p/ ~" y. m% G
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
$ m( D8 l& u$ o& y1 v以一下是每次操作中用到的四个非线性函数(每轮一个)。 . {4 S2 }, ?: X, N/ T
F(X,Y,Z)=(X&Y)|((~X)&Z) " c5 c, S% W/ Q6 q2 [) p; J
G(X,Y,Z)=(X&Z)|(Y&(~Z))
8 K, B/ [3 s' e& y# X# SH(X,Y,Z)=X^Y^Z 5 K5 o. i0 \/ ?% O Z. V5 `
I(X,Y,Z)=Y^(X|(~Z))
- k. _. z9 Q( B(&是与,|是或,~是非,^是异或)
6 m! ^) R% u; t' O这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
% g+ t, u# f2 ?. _3 d/ V; v6 g/ q d函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 + b0 x1 F3 a# v* y
设Mj表示消息的第j个子分组(从0到15),<<
/ I5 e y+ f Q& u) _* BFF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<
( M3 p) U/ `8 v$ g/ U: X# iGG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<
9 r i5 w- k {HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<4 r: y5 a7 T$ b) ]. l1 K' m
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<$ b! c- z; {4 r7 f. P" E
这四轮(64步)是: 2 ^- D7 f+ S2 y
第一轮
; z3 k2 C! }2 R1 w' r+ jFF(a,b,c,d,M0,7,0xd76aa478) 8 [3 [0 O) X' H: w7 [5 u
FF(d,a,b,c,M1,12,0xe8c7b756)
* u( t/ n) v4 o% n# B5 P- oFF(c,d,a,b,M2,17,0x242070db) . i. C ^* X( O9 E5 ~4 x! G' \
FF(b,c,d,a,M3,22,0xc1bdceee) : ?( _+ Q$ W% L
FF(a,b,c,d,M4,7,0xf57c0faf) , i" X' Y* d5 k- u& ~5 v
FF(d,a,b,c,M5,12,0x4787c62a)
8 C# q$ [; q; p0 NFF(c,d,a,b,M6,17,0xa8304613)
9 T' _; F) O* x- y3 k IFF(b,c,d,a,M7,22,0xfd469501) - m& w& P. A5 R' e& V c, R9 t+ ?% T- }8 S
FF(a,b,c,d,M8,7,0x698098d8) ' M( {4 o) r& D) q
FF(d,a,b,c,M9,12,0x8b44f7af) 5 b* A0 o$ F! Y8 y! U) V
FF(c,d,a,b,M10,17,0xffff5bb1)
$ S6 |7 F7 q% F, D8 LFF(b,c,d,a,M11,22,0x895cd7be)
) o, ?. h3 a- d% v3 {9 FFF(a,b,c,d,M12,7,0x6b901122) 6 p" X+ u4 `! M: Z; N4 U% T
FF(d,a,b,c,M13,12,0xfd987193) , ^6 y0 A: W7 J0 B& H8 l
FF(c,d,a,b,M14,17,0xa679438e) ' s+ G( t' G1 `
FF(b,c,d,a,M15,22,0x49b40821)
/ Z) M c0 E3 S7 l- p/ [第二轮 - R: ]' m" {& Q
GG(a,b,c,d,M1,5,0xf61e2562)
% D w. l3 \! K4 n J- T% H+ gGG(d,a,b,c,M6,9,0xc040b340)
D7 N+ `4 U9 L7 y* U8 q% ]/ @GG(c,d,a,b,M11,14,0x265e5a51) ; P' |, [6 t1 \: v% ?
GG(b,c,d,a,M0,20,0xe9b6c7aa)
% | v0 c. k) [) s- {: {GG(a,b,c,d,M5,5,0xd62f105d)
7 [1 h q3 |9 E8 ?* w0 ]4 IGG(d,a,b,c,M10,9,0x02441453)
/ [" [' r2 o/ x# ?' l0 x/ fGG(c,d,a,b,M15,14,0xd8a1e681)
) ^1 ^/ X! i" g' T8 ]8 [% MGG(b,c,d,a,M4,20,0xe7d3fbc8)
" b& g; f) u# \" _GG(a,b,c,d,M9,5,0x21e1cde6) 2 m% Y. N! W7 } N n% B; h# Q6 l
GG(d,a,b,c,M14,9,0xc33707d6)
# Z; ?& [ B8 }& q+ }7 R& nGG(c,d,a,b,M3,14,0xf4d50d87) ) `2 J1 N! `4 |! t# L' i* a) {
GG(b,c,d,a,M8,20,0x455a14ed) 9 q! w M, G. ]( |
GG(a,b,c,d,M13,5,0xa9e3e905) 4 |- [& ^: B7 [/ D+ j# c
GG(d,a,b,c,M2,9,0xfcefa3f8)
# s7 F: Y. S9 u- s; ?GG(c,d,a,b,M7,14,0x676f02d9)
2 K( X) Q* Z1 R5 G, Y1 ]' ]; mGG(b,c,d,a,M12,20,0x8d2a4c8a)
" b( Q% N6 f2 N8 x$ \& R: K第三轮 ' U* }+ B5 j6 Y- J* i1 {. J) `6 [
HH(a,b,c,d,M5,4,0xfffa3942) 9 A8 P/ U5 |) A4 a/ o- l1 \! w* R
HH(d,a,b,c,M8,11,0x8771f681)
) @% t! X7 |' R" dHH(c,d,a,b,M11,16,0x6d9d6122)
/ v, U9 R/ q$ u$ Z" JHH(b,c,d,a,M14,23,0xfde5380c) . r7 p% q$ s O2 M
HH(a,b,c,d,M1,4,0xa4beea44) # J' m4 v1 f' M2 I# d+ e0 w$ B
HH(d,a,b,c,M4,11,0x4bdecfa9)
/ u+ v3 b- [9 X7 K6 k P) RHH(c,d,a,b,M7,16,0xf6bb4b60) ' T! W8 W3 S/ K; O2 C
HH(b,c,d,a,M10,23,0xbebfbc70)
6 ^- t- t" D% j. kHH(a,b,c,d,M13,4,0x289b7ec6) " I5 R9 o1 J+ o
HH(d,a,b,c,M0,11,0xeaa127fa)
! U( \2 k* z; [2 MHH(c,d,a,b,M3,16,0xd4ef3085)
* B' q8 N r: G) m$ YHH(b,c,d,a,M6,23,0x04881d05) - b0 K3 M4 E' n
HH(a,b,c,d,M9,4,0xd9d4d039)
9 m2 T& k8 V7 M0 |/ ?$ F2 T) M2 IHH(d,a,b,c,M12,11,0xe6db99e5)
$ S' u; j' L E6 @HH(c,d,a,b,M15,16,0x1fa27cf8)
' o0 X: e( f1 b% e' u* c$ l oHH(b,c,d,a,M2,23,0xc4ac5665)
9 K* z! @; u C4 t8 P7 X7 b: z0 O第四轮 7 ~# c! n4 B% b6 r' Q( S! L/ S
II(a,b,c,d,M0,6,0xf4292244)
7 Z P! k3 H3 [+ O. {( t# C$ a+ k. sII(d,a,b,c,M7,10,0x432aff97)
9 L# l1 d- e8 M5 v+ ~II(c,d,a,b,M14,15,0xab9423a7) & o/ R$ E5 ` s# j F% ^
II(b,c,d,a,M5,21,0xfc93a039) * F: w* d' l3 h
II(a,b,c,d,M12,6,0x655b59c3)
7 Z# R* |! r7 ^- ?( R/ ]: h& [, ~II(d,a,b,c,M3,10,0x8f0ccc92) ; ~, K! i8 P* W& q) d0 i/ L
II(c,d,a,b,M10,15,0xffeff47d) # x. T$ o9 Y1 Z5 q" y/ B
II(b,c,d,a,M1,21,0x85845dd1)
) M4 `) g$ F* h6 X" t& |II(a,b,c,d,M8,6,0x6fa87e4f)
t m3 @" R: P" T8 w: a: q$ tII(d,a,b,c,M15,10,0xfe2ce6e0) 5 S# q l& N0 }6 J9 D7 k
II(c,d,a,b,M6,15,0xa3014314)
: @( I5 ?! H( vII(b,c,d,a,M13,21,0x4e0811a1)
2 `7 z( g8 b9 _+ L uII(a,b,c,d,M4,6,0xf7537e82) . K* b; u) [1 R" M! u: P# Y& d: q5 _
II(d,a,b,c,M11,10,0xbd3af235) 2 E5 ^/ l; X, N% z+ T: F
II(c,d,a,b,M2,15,0x2ad7d2bb)
0 c0 e8 ^: {' J& j3 D- o, n1 oII(b,c,d,a,M9,21,0xeb86d391) 9 S" |- p" Q0 _8 e8 ~
常数ti可以如下选择: ; ^: m( `: d) T9 F3 f6 p3 W F+ ~- y
在第i步中,ti是4294967296*abs(sin(i))的 |