[TABLE]
9 c# w& [. i$ ?& ]/ ~ 7 p, g* o5 w. Q
; B8 q, C$ G% g & m1 i' X. {# Q1 y! g$ R* z
2 n( t D* `, W1 T
' ~9 o* q0 }* n8 r
0 ?3 j- {4 `6 s6 p) D: { 1 P S- `2 ?$ L3 u- f {3 @3 `3 C
[TR]
$ s6 _! L, Z3 E8 r; a8 b + B" @% p) `4 e# k+ J6 T5 m
, I3 l( {9 d, h& k+ @2 t, t6 R
) W- d5 J- }* h$ X/ |[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
% c: B! Q- \/ ~ c1 s4 ]1 @首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 " a" G+ \: X& B3 l) w
四个32位变量初始化为:
- D, A9 Y- V, U( D# l% d4 DA=0x01234567 ( v- E- Y6 N! g# P$ @
B=0x89abcdef 0 S9 I. s$ {' P: A4 ]8 }7 R
C=0xfedcba98
+ d% V, f" ~+ e3 r, ^5 `* bD=0x76543210
+ v& i0 E* O+ j. Y4 F$ x9 S它们称为链接变量(chaining variable)
5 z) A) O V4 L# @接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
+ A1 a7 r. f% G" g( P( k将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 " W* ^) C4 x3 b7 x( ? N6 j# |0 w( f
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
4 X& V+ O) p6 l1 r以一下是每次操作中用到的四个非线性函数(每轮一个)。
1 m/ I+ B% q" H- H0 P- z* P V* hF(X,Y,Z)=(X&Y)|((~X)&Z)
+ v% O. W) @; }3 rG(X,Y,Z)=(X&Z)|(Y&(~Z)) $ Y( L: a6 n3 R0 P
H(X,Y,Z)=X^Y^Z 5 l: o6 \6 x: d" P& I/ e% p' h q
I(X,Y,Z)=Y^(X|(~Z)) ' H. `# ?) i5 H) A% d. R/ c
(&是与,|是或,~是非,^是异或)
+ U7 b H+ _' a4 E8 w0 \* b' f% f, |这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
0 L3 J1 D, z: o, c! x函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 0 u* o+ c* y6 N) s! \; T+ d, t) H
设Mj表示消息的第j个子分组(从0到15),<<) a: n' [! G0 u# b. V3 S
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<- f) [1 o1 Q( I* W5 G( Y' S; ^
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<
$ m* P) N, a8 s, E cHH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<
. `4 K$ E' B3 s7 H4 [II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
2 R. n5 G) ~' `+ S; \9 [- f" B这四轮(64步)是:
7 P* O" E+ {1 O) g% X( M第一轮 ' A6 }( a2 \" t0 w
FF(a,b,c,d,M0,7,0xd76aa478) 9 G- o ~# K4 ^
FF(d,a,b,c,M1,12,0xe8c7b756) 7 q& ]5 u$ S: {8 `
FF(c,d,a,b,M2,17,0x242070db) 4 y) {/ T8 _% x) o0 z, H7 H2 B/ M' M
FF(b,c,d,a,M3,22,0xc1bdceee)
: P+ i" A& |# ^, {: k9 ^( }FF(a,b,c,d,M4,7,0xf57c0faf) 8 x* g G( C4 t+ \
FF(d,a,b,c,M5,12,0x4787c62a) 9 W, P( N c$ r8 H. k
FF(c,d,a,b,M6,17,0xa8304613)
- e( s* |8 O: O$ Y5 c* ~% a/ BFF(b,c,d,a,M7,22,0xfd469501) \9 T& x+ z3 M4 x0 w
FF(a,b,c,d,M8,7,0x698098d8) . m* N! g% \5 N
FF(d,a,b,c,M9,12,0x8b44f7af)
1 h, X1 z5 f) N# V% g, @FF(c,d,a,b,M10,17,0xffff5bb1)
& y8 ?. Y& Z, v/ @" [( X. |0 QFF(b,c,d,a,M11,22,0x895cd7be)
4 K- p5 }5 j2 ^9 x& z1 |3 S% r, G0 GFF(a,b,c,d,M12,7,0x6b901122)
' @& } B5 S& CFF(d,a,b,c,M13,12,0xfd987193)
% z9 \5 C1 v1 D, o, p1 M) h: _- BFF(c,d,a,b,M14,17,0xa679438e)
0 E# `, q! A) J$ H1 K! IFF(b,c,d,a,M15,22,0x49b40821) / l4 M1 `4 A9 \6 |- B a) J! x
第二轮 7 B( a; c6 o. `+ A% X0 n
GG(a,b,c,d,M1,5,0xf61e2562) $ N: ? h% W' \) K
GG(d,a,b,c,M6,9,0xc040b340)
! v6 O3 B7 O0 N2 fGG(c,d,a,b,M11,14,0x265e5a51) * n& Z1 C$ O3 \. Q" m' r
GG(b,c,d,a,M0,20,0xe9b6c7aa) * Q. {, j& J7 H3 I# s
GG(a,b,c,d,M5,5,0xd62f105d)
8 V% f- I/ |% n* s1 D d5 _. U, eGG(d,a,b,c,M10,9,0x02441453)
6 A6 w B8 _; p6 J+ [6 sGG(c,d,a,b,M15,14,0xd8a1e681)
" ?. m% B9 j# z9 x0 l& LGG(b,c,d,a,M4,20,0xe7d3fbc8) 5 Q: Z3 \1 i- l( C; c' }
GG(a,b,c,d,M9,5,0x21e1cde6) ; O# B a i, J. q+ ^
GG(d,a,b,c,M14,9,0xc33707d6)
?4 V, F3 t# Q V' o$ t x+ DGG(c,d,a,b,M3,14,0xf4d50d87) $ _! E6 |; T& y9 q! u/ A
GG(b,c,d,a,M8,20,0x455a14ed)
/ c5 l, T, v2 h% g! ^7 `GG(a,b,c,d,M13,5,0xa9e3e905) - J5 D2 s3 e$ ?
GG(d,a,b,c,M2,9,0xfcefa3f8) " M$ W: @% ?0 ]
GG(c,d,a,b,M7,14,0x676f02d9) 3 w& u: v5 v' x/ L/ p7 Y7 o+ ^3 n( r
GG(b,c,d,a,M12,20,0x8d2a4c8a) ; V; E6 a c0 a( I
第三轮
5 v% x5 G- z6 s SHH(a,b,c,d,M5,4,0xfffa3942)
$ d. ~8 \9 E5 ?& L- ]HH(d,a,b,c,M8,11,0x8771f681)
) ~+ ]$ q( |! _8 j% lHH(c,d,a,b,M11,16,0x6d9d6122) k* i/ k8 K( T3 d" N1 g$ S6 C% N
HH(b,c,d,a,M14,23,0xfde5380c)
! w- v, k* a8 [ RHH(a,b,c,d,M1,4,0xa4beea44)
7 w: l; ^ n+ [2 c& r; PHH(d,a,b,c,M4,11,0x4bdecfa9)
5 A+ j# x9 V9 X8 ?9 HHH(c,d,a,b,M7,16,0xf6bb4b60)
5 M9 y# E5 S( y% G$ v+ b: ZHH(b,c,d,a,M10,23,0xbebfbc70)
5 B" M" T7 m6 S( Y; THH(a,b,c,d,M13,4,0x289b7ec6)
: @0 U a# W; o5 q; [HH(d,a,b,c,M0,11,0xeaa127fa)
5 D8 o3 n8 i- eHH(c,d,a,b,M3,16,0xd4ef3085) ! w5 l- W4 O! P* o
HH(b,c,d,a,M6,23,0x04881d05) 7 n2 i0 }/ j( B8 p
HH(a,b,c,d,M9,4,0xd9d4d039) + q# Y3 H& C: X t+ @$ o
HH(d,a,b,c,M12,11,0xe6db99e5) : _6 U' X& R8 P5 N% r
HH(c,d,a,b,M15,16,0x1fa27cf8)
F) s- F9 I e( i% [HH(b,c,d,a,M2,23,0xc4ac5665) B/ X9 X; I% y. W3 A- n7 m0 G& B
第四轮
( K! |( ]+ R; G a# t7 lII(a,b,c,d,M0,6,0xf4292244)
9 |# ^4 G% D! ?7 E# lII(d,a,b,c,M7,10,0x432aff97) 7 q5 n9 V* P! T0 c3 V8 V
II(c,d,a,b,M14,15,0xab9423a7) 3 a$ Z0 X7 x3 n- O. f x
II(b,c,d,a,M5,21,0xfc93a039)
! f- e$ N0 z3 @' d; OII(a,b,c,d,M12,6,0x655b59c3)
' g: h- v- G4 T8 oII(d,a,b,c,M3,10,0x8f0ccc92) ) H9 ~" h- R; c0 D
II(c,d,a,b,M10,15,0xffeff47d)
7 i+ V/ J' n# ]3 k7 u, S4 lII(b,c,d,a,M1,21,0x85845dd1) ) M( s- Z* K# b) Y n$ s
II(a,b,c,d,M8,6,0x6fa87e4f) 7 N. f" m8 t& }4 f. H3 n' G
II(d,a,b,c,M15,10,0xfe2ce6e0) . F; l& a7 S! o( q z
II(c,d,a,b,M6,15,0xa3014314) # y0 A0 R$ f7 T. Z8 _% S; {: ?( @6 Z% S
II(b,c,d,a,M13,21,0x4e0811a1)
8 v7 C( h5 E# ~' @II(a,b,c,d,M4,6,0xf7537e82) 0 K0 i6 M: x) v; T
II(d,a,b,c,M11,10,0xbd3af235) 2 T4 a# ^3 q8 s/ E$ S2 O
II(c,d,a,b,M2,15,0x2ad7d2bb)
" m' r8 P* d r. d! mII(b,c,d,a,M9,21,0xeb86d391)
7 [2 F$ O( ~: d0 I9 ~3 \+ u! @常数ti可以如下选择:
$ k9 m4 q9 ]) Z C8 p- w4 H) H在第i步中,ti是4294967296*abs(sin(i))的 |