[TABLE] , N1 B  j% g0 T
 
, [. [  q) I' t  P$ [: Q/ C5 @4 z 
/ P; e9 e, X2 x* w   W/ [# z  r+ b) t' d6 ^3 x
 0 @: E5 w; o/ i0 I% H% u' s
 # l; a6 I, k$ z/ `# d# T
 
" M' b2 V( f9 \# b: a5 D 
  x, G8 y) |# K/ D' H% \5 }[TR] 
6 C7 H8 m0 `3 C+ V: w7 k 
2 T* w0 z- b& S ' c) Y  E! A) T1 q" N0 O
 ' p' |% i3 ~& Y, I- Y* ^! {
[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 
0 k4 _( z6 m8 D9 [+ }! E首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 - I, b, Z) K/ Z; c, W: _$ P4 s
四个32位变量初始化为: 
# r5 }, N  Q7 Y; F4 D+ AA=0x01234567 
  T4 H  b8 s7 e: z, o: cB=0x89abcdef 
1 p8 R2 R$ _: g! l3 f" M1 i* xC=0xfedcba98 
$ M4 s4 r! V. O/ O/ n0 ~$ Z9 ~" dD=0x76543210 # a8 c8 e1 t; F0 R7 ~& p
它们称为链接变量(chaining variable) 
3 I9 X8 y, o1 n7 x接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 
8 y9 M5 e1 D5 w" G! c将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。   X6 a! F4 d7 _( e
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 * M9 [7 T% r  v' X' [$ h
以一下是每次操作中用到的四个非线性函数(每轮一个)。 
% i; W- u. y5 Z, tF(X,Y,Z)=(X&Y)|((~X)&Z) 
: c- P( s& K: s* M0 `$ d7 \G(X,Y,Z)=(X&Z)|(Y&(~Z)) ) T6 M6 X/ N1 c, s- N
H(X,Y,Z)=X^Y^Z " A( d. Y% t( R6 [  T
I(X,Y,Z)=Y^(X|(~Z)) 
" }6 p9 }" H# g7 M% N(&是与,|是或,~是非,^是异或) 
' Z" F  \4 _% X% D4 Y" |这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 
% I% Q/ v9 W9 V1 G! \8 n4 H函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 : t, Z: {# K& m: i3 Z0 d
设Mj表示消息的第j个子分组(从0到15),<<
+ a5 z& t# J5 p, S; b& l) tFF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<  Q- E* z0 E. F
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<7 O- ^1 v" A( o" @7 ~; f) _
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<  x) ^/ U2 e& j: F) k3 x! i
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<& b. B  ^9 R9 V! H: {8 I3 U
这四轮(64步)是: / V6 b6 m/ `$ ^3 d5 s' v
第一轮 
$ q: d5 n& K) l$ Q! S/ k5 LFF(a,b,c,d,M0,7,0xd76aa478) 
: u4 s; x) Y& F( B# AFF(d,a,b,c,M1,12,0xe8c7b756) 9 Q3 _* i  R; V. |) O! S. Z
FF(c,d,a,b,M2,17,0x242070db) : M9 b% j6 x' M+ [! \
FF(b,c,d,a,M3,22,0xc1bdceee) 
; b! J+ `; r& n8 U' ~- y; D4 x: NFF(a,b,c,d,M4,7,0xf57c0faf) 
0 c+ N/ D0 k% x9 R! QFF(d,a,b,c,M5,12,0x4787c62a) ' I1 w5 S2 W6 S) L% |5 Q0 v) L
FF(c,d,a,b,M6,17,0xa8304613) $ O* P) Y( u  ?$ h  X
FF(b,c,d,a,M7,22,0xfd469501) / A: v5 `9 q8 N# ^, z4 ]
FF(a,b,c,d,M8,7,0x698098d8) 
* u( Q( F, V4 K% |) }3 j  pFF(d,a,b,c,M9,12,0x8b44f7af) 
- s7 _9 Z& w: t* j  fFF(c,d,a,b,M10,17,0xffff5bb1) 
: o! N7 J' T: pFF(b,c,d,a,M11,22,0x895cd7be) 
- ]  T) A7 ]2 S! _FF(a,b,c,d,M12,7,0x6b901122)   T. x& V3 H! B0 C# u5 X# F
FF(d,a,b,c,M13,12,0xfd987193) - n7 B. Z6 e6 [. k
FF(c,d,a,b,M14,17,0xa679438e) 
, [" K0 p- _& {$ Y$ }" @FF(b,c,d,a,M15,22,0x49b40821) 
+ a1 ?3 t% \9 X* X3 t* R第二轮 
. p# ?; @) e$ E3 f4 J( [5 qGG(a,b,c,d,M1,5,0xf61e2562) 5 K3 N( ~# D- {* j' L% m
GG(d,a,b,c,M6,9,0xc040b340) 
- m: H# v/ d- M- Q: Y: Z: i, M2 I6 cGG(c,d,a,b,M11,14,0x265e5a51) / a. K2 R3 Z1 K8 G
GG(b,c,d,a,M0,20,0xe9b6c7aa) ! u. j  _$ ]! y8 w- _$ M+ C9 Q- D
GG(a,b,c,d,M5,5,0xd62f105d) 
( \# t; q/ t8 W3 P8 TGG(d,a,b,c,M10,9,0x02441453) 
: c% C  v% S* e* O9 kGG(c,d,a,b,M15,14,0xd8a1e681) : M: g2 g/ Q; I6 q* K6 Q
GG(b,c,d,a,M4,20,0xe7d3fbc8) ' v" I2 j$ U- `6 b3 j# `
GG(a,b,c,d,M9,5,0x21e1cde6) 
8 e+ }% K' Y4 c. z# bGG(d,a,b,c,M14,9,0xc33707d6) 6 E5 U1 x9 X7 n6 R) f+ s# j
GG(c,d,a,b,M3,14,0xf4d50d87) ) M- \2 @8 E( x# J( w; o
GG(b,c,d,a,M8,20,0x455a14ed) 
  {+ n' S& s% t0 C. tGG(a,b,c,d,M13,5,0xa9e3e905) 4 q& y( ]6 `2 g7 Z0 v( X
GG(d,a,b,c,M2,9,0xfcefa3f8) 
: `. y6 g& N5 L; e3 M: z& sGG(c,d,a,b,M7,14,0x676f02d9) 
8 Z8 s# |# f* x( cGG(b,c,d,a,M12,20,0x8d2a4c8a) * n4 X+ \8 r6 P- f0 Z0 |7 ?
第三轮 6 {$ {0 J9 w( D7 C+ l
HH(a,b,c,d,M5,4,0xfffa3942) 
  y+ k- e; M9 [- ?& ?HH(d,a,b,c,M8,11,0x8771f681) 
7 t3 h- {$ Z4 ]+ s/ CHH(c,d,a,b,M11,16,0x6d9d6122) 
9 x. j5 Q/ [6 H" W% I+ tHH(b,c,d,a,M14,23,0xfde5380c) ( ~, |3 r' Y: N7 e- _; {
HH(a,b,c,d,M1,4,0xa4beea44) - m, M! J! e* t) ?( q+ ]2 [! ~( d
HH(d,a,b,c,M4,11,0x4bdecfa9) 
- Y3 X" B# m' }4 W% zHH(c,d,a,b,M7,16,0xf6bb4b60) 
' T! q! W0 E- \1 i- v" g) z) `. SHH(b,c,d,a,M10,23,0xbebfbc70) 8 M5 i3 ?0 n7 V
HH(a,b,c,d,M13,4,0x289b7ec6) 
' |' y. I1 z1 l$ ~  j* BHH(d,a,b,c,M0,11,0xeaa127fa) 
* F5 f- T2 C( _' d. nHH(c,d,a,b,M3,16,0xd4ef3085) 1 s' V: V$ k3 T- H% O
HH(b,c,d,a,M6,23,0x04881d05) 4 t7 c7 H5 a" ~  O3 ]" L2 o7 Y
HH(a,b,c,d,M9,4,0xd9d4d039)   f7 H) ^/ V* t
HH(d,a,b,c,M12,11,0xe6db99e5) 3 n8 z  U  }) u" t2 \& L
HH(c,d,a,b,M15,16,0x1fa27cf8) 5 \9 v# ?9 v$ Z0 _
HH(b,c,d,a,M2,23,0xc4ac5665) 6 `. x& @9 F* ~5 [
第四轮 ( _) ]; Q  |- ^& E- B0 X4 ^
II(a,b,c,d,M0,6,0xf4292244) 1 b8 x: B" g# U6 j; ?
II(d,a,b,c,M7,10,0x432aff97) ! F7 g( E) `5 g, X7 b
II(c,d,a,b,M14,15,0xab9423a7) / ?, A7 G& v' u& T
II(b,c,d,a,M5,21,0xfc93a039) ! b' \6 b7 Z" `  g: s9 P/ N. Y- y. G0 L
II(a,b,c,d,M12,6,0x655b59c3) 1 d7 `1 I* Q' I& A" s
II(d,a,b,c,M3,10,0x8f0ccc92) 
' z' M1 y9 U4 S+ M2 m3 T" CII(c,d,a,b,M10,15,0xffeff47d) 
! b$ c1 \; w; j4 a7 Y6 gII(b,c,d,a,M1,21,0x85845dd1) 
7 H$ \2 f# ~3 x  ], N7 W+ X7 @7 iII(a,b,c,d,M8,6,0x6fa87e4f) 
( }, R4 G4 e" d! b4 Q5 q3 o& x$ nII(d,a,b,c,M15,10,0xfe2ce6e0) - @* F0 W. n9 P# j
II(c,d,a,b,M6,15,0xa3014314) 
: D5 Z+ R. J$ |: WII(b,c,d,a,M13,21,0x4e0811a1) : H7 C3 O2 J+ w& m! D
II(a,b,c,d,M4,6,0xf7537e82) 2 P: I% ]4 `" a) l: r
II(d,a,b,c,M11,10,0xbd3af235) , }4 n$ l% D" R1 V2 G" n: |
II(c,d,a,b,M2,15,0x2ad7d2bb) 4 t" |) z* ^! F' ~4 s
II(b,c,d,a,M9,21,0xeb86d391) 
% f% k" `  _6 _$ h+ {! o# y# C9 N常数ti可以如下选择: 
' f1 d0 e7 h' y: H# X在第i步中,ti是4294967296*abs(sin(i))的 |