[TABLE] 
+ K' E7 m* _, J; w 7 I3 e  o+ ~& n4 U; G5 [: ^  T3 [
 2 V+ V# z+ D1 G0 I2 B
 # H3 r- J1 R  q6 Q- e1 A, |
 
) }& ?1 n8 O: @$ p; r# n! F , z' t8 d' D+ [4 U. d
 
7 U: a) o) q# }5 f8 r' n- l# S , u9 |3 [" x; L! `
[TR] $ c- K3 Z& a& V0 u
 : B  _+ M% s& L8 y$ }9 Z' l
 ) t1 ?8 j/ P' o1 N2 j' C0 b5 Z  h
 
9 Q' {/ ?! j) H% y" t[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 
1 d$ D6 j/ H( c( z2 ]6 o; n+ r  n首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 
: I3 i4 u: B; N( j四个32位变量初始化为: 
4 Y" @( A5 z8 E# lA=0x01234567 " i% E2 X' r/ [3 l
B=0x89abcdef , t: q& }0 w7 ]
C=0xfedcba98 
  h, M: S6 \) a3 e6 l7 Q1 C6 ED=0x76543210 ( V8 t' @; i- T3 p5 `
它们称为链接变量(chaining variable) 
! e# K8 U& T7 N( ?, a# E' _! p接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 * h4 t4 f- B  @  {
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 " k6 q! ~" E- z1 O' u! f
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 
1 H- m0 i$ |8 {4 B7 H/ E3 D以一下是每次操作中用到的四个非线性函数(每轮一个)。 
7 y4 u6 x8 N2 v8 `1 q. v3 G, C+ RF(X,Y,Z)=(X&Y)|((~X)&Z)   _4 y: J' d7 t4 E
G(X,Y,Z)=(X&Z)|(Y&(~Z)) 
. Y- ^* U9 R. x) EH(X,Y,Z)=X^Y^Z 
' E- U# @/ t4 AI(X,Y,Z)=Y^(X|(~Z)) # F' T1 z3 ?" j# z7 b. f
(&是与,|是或,~是非,^是异或) 4 ^1 w# U9 V1 q, a
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 
( ]1 ~. E8 a3 E函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 ; {8 L1 v' x" E! [% X5 n
设Mj表示消息的第j个子分组(从0到15),<<- O7 |, W; p: f, T& ^9 P) A" X
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<. W9 X% V0 c. ^9 ]' }
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<+ \* ~! ~" r/ B  }
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<
1 N( E2 L4 @/ n" WII(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<) o& l: j1 K( o1 O  V1 k8 j
这四轮(64步)是: 
3 M( i" O) e/ G3 [& X% v7 [( N6 a第一轮 4 H- p4 n, @+ T/ J+ m
FF(a,b,c,d,M0,7,0xd76aa478) 
- i5 w" ]! C$ R! z' Y& jFF(d,a,b,c,M1,12,0xe8c7b756) 
* Q+ z7 B5 S2 x$ j6 i1 \FF(c,d,a,b,M2,17,0x242070db) 
5 k8 b: ?4 Z8 ?: g3 W- w) mFF(b,c,d,a,M3,22,0xc1bdceee) , G( E" [& J: _
FF(a,b,c,d,M4,7,0xf57c0faf)   X: h/ ]4 @, h3 g; n. q3 r
FF(d,a,b,c,M5,12,0x4787c62a) 
: _& g- K( @6 G  lFF(c,d,a,b,M6,17,0xa8304613) 
! s: j5 I" C$ p' ~9 ~FF(b,c,d,a,M7,22,0xfd469501) 
7 Y2 y% N  ~- L2 R1 TFF(a,b,c,d,M8,7,0x698098d8) & g1 g5 A7 f# a
FF(d,a,b,c,M9,12,0x8b44f7af) 5 A6 [* E0 }" N  R4 c) W: v9 I! u0 d
FF(c,d,a,b,M10,17,0xffff5bb1)   u6 T) Q6 P  t7 U. p6 x
FF(b,c,d,a,M11,22,0x895cd7be) 
1 Q7 D4 t6 X) E. o/ ?" U( d. KFF(a,b,c,d,M12,7,0x6b901122) 
$ }2 W- z+ G7 `: V3 uFF(d,a,b,c,M13,12,0xfd987193) ! _& g' X, Z) z; w" S0 ?
FF(c,d,a,b,M14,17,0xa679438e) 
3 A6 z; d, \1 ^FF(b,c,d,a,M15,22,0x49b40821) 
- S; x0 \7 \$ U- I. d3 \第二轮 
* d2 n! H) p+ \: ]( |& v6 G. B/ v8 _GG(a,b,c,d,M1,5,0xf61e2562) 
' n( s# O; e3 R& D% w% I  I, B4 {GG(d,a,b,c,M6,9,0xc040b340) 
/ I7 F& z. @8 T8 r4 MGG(c,d,a,b,M11,14,0x265e5a51)   t* P9 ?& V. U8 m1 u. e! _
GG(b,c,d,a,M0,20,0xe9b6c7aa) : F% M1 u4 M- q) d, Y% Z
GG(a,b,c,d,M5,5,0xd62f105d) * n5 }$ F/ z/ V5 E# ~3 D- K& C
GG(d,a,b,c,M10,9,0x02441453) 
$ _' p' b3 P, ?1 R, `GG(c,d,a,b,M15,14,0xd8a1e681) . r4 n9 `# l, [* \5 k1 p
GG(b,c,d,a,M4,20,0xe7d3fbc8) # T3 S/ t8 C' O7 X+ n
GG(a,b,c,d,M9,5,0x21e1cde6) 
8 |( T- N" _7 B6 G# |$ T) Z( m$ RGG(d,a,b,c,M14,9,0xc33707d6) ) }0 m9 }. k; ^7 h7 H' k& I
GG(c,d,a,b,M3,14,0xf4d50d87) 
3 ~7 A' F( Y8 ?/ dGG(b,c,d,a,M8,20,0x455a14ed) 
, `1 J0 K- i( |GG(a,b,c,d,M13,5,0xa9e3e905) 1 t9 k# p8 N) j! p' x# B
GG(d,a,b,c,M2,9,0xfcefa3f8) 
" j9 @, F8 a7 w8 D1 q( b' E2 x; aGG(c,d,a,b,M7,14,0x676f02d9) 
; @1 A4 o1 L; g$ y, aGG(b,c,d,a,M12,20,0x8d2a4c8a) 
2 C  `. ?( a' I& ]* g; S- m, @2 N第三轮 
( p3 t) A$ W# m- p/ fHH(a,b,c,d,M5,4,0xfffa3942) 5 F  A  B: p3 x( ]
HH(d,a,b,c,M8,11,0x8771f681) 
8 y  {4 Y- D' M, R6 D' T+ E9 rHH(c,d,a,b,M11,16,0x6d9d6122) 4 t: E& ^; W6 b& y; [# N4 v% P
HH(b,c,d,a,M14,23,0xfde5380c) 
5 g/ \9 H& O3 [HH(a,b,c,d,M1,4,0xa4beea44) ; r; O7 d4 k8 ]7 G3 P
HH(d,a,b,c,M4,11,0x4bdecfa9) " j3 }5 E0 \% x3 _) r
HH(c,d,a,b,M7,16,0xf6bb4b60) 
2 U: B9 ?8 r' p1 _HH(b,c,d,a,M10,23,0xbebfbc70) " P6 P" B' S& i! k- Q. z4 v4 [
HH(a,b,c,d,M13,4,0x289b7ec6) 
" Y* m0 U+ R5 L. F( n# q$ T: l- ZHH(d,a,b,c,M0,11,0xeaa127fa) 
' T! U. d8 N& j  m1 X; eHH(c,d,a,b,M3,16,0xd4ef3085) 4 P  G1 I3 X% i1 q5 L
HH(b,c,d,a,M6,23,0x04881d05) , V7 G/ j6 G* u, B& y) F
HH(a,b,c,d,M9,4,0xd9d4d039) 
0 M2 W3 M4 r  Q" K$ T2 rHH(d,a,b,c,M12,11,0xe6db99e5) 
. g3 j/ u$ H- n. gHH(c,d,a,b,M15,16,0x1fa27cf8) 
, ]+ [+ |8 x* [9 r0 Z9 p$ yHH(b,c,d,a,M2,23,0xc4ac5665) # h3 n! k, N) u# J7 J0 |8 o
第四轮 . k) }8 v* Y# l( Z
II(a,b,c,d,M0,6,0xf4292244) 8 i/ p' ~' N4 Z+ M/ P' y5 E: I7 }
II(d,a,b,c,M7,10,0x432aff97) 
* P; }- J+ D" @* D8 _* nII(c,d,a,b,M14,15,0xab9423a7) " f) i; Y2 f  H3 M' b2 G4 j
II(b,c,d,a,M5,21,0xfc93a039) 
$ _) @3 S* V: ^+ F. ^6 {) v- n0 EII(a,b,c,d,M12,6,0x655b59c3) 
5 ~8 \% o+ R5 y, X- n5 AII(d,a,b,c,M3,10,0x8f0ccc92) 
1 \7 Y+ P$ s7 V; N8 W* f6 l3 @% @. P4 SII(c,d,a,b,M10,15,0xffeff47d) + }/ ~* n5 ^! F$ Q% L
II(b,c,d,a,M1,21,0x85845dd1)   o6 i- l& y* S7 X; n
II(a,b,c,d,M8,6,0x6fa87e4f) / L: ^' ~9 I: L6 F$ O
II(d,a,b,c,M15,10,0xfe2ce6e0) 
* O4 v4 I9 f2 CII(c,d,a,b,M6,15,0xa3014314) 
# j  H9 R5 P8 _. e, |0 eII(b,c,d,a,M13,21,0x4e0811a1) 
) a( Q1 ^  H2 x+ C4 r" gII(a,b,c,d,M4,6,0xf7537e82)   c+ Z. s, M; y3 D' K
II(d,a,b,c,M11,10,0xbd3af235) 
* E+ E. w/ h* O% g9 ^+ n; m- AII(c,d,a,b,M2,15,0x2ad7d2bb) " C! s! X, z6 J& C. y0 w* e( j$ ~2 q
II(b,c,d,a,M9,21,0xeb86d391) 
4 f$ V; \) s1 N/ y常数ti可以如下选择: 
: y6 ^( U+ j$ u' X在第i步中,ti是4294967296*abs(sin(i))的 |