[TABLE]
9 K" y* g' p! q( N* M ) ]) @$ j; B0 J: J6 Z
0 i, k& l9 |- Y% D& K/ n. A
! B# T1 u, C1 c
% e3 j; a; C3 ^6 y' a- J
3 `3 ^; {6 X. N, X' A$ {
0 O/ g2 F8 H6 }4 B8 z8 k
+ T; B3 J7 Q0 i9 P[TR] 4 s" z6 q- X7 s p1 t( R
+ f* U7 y' J# J " i; Y; z g& Y0 A: c! D9 J
; Z+ R& u* s5 c/ N9 B3 K[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
% f- o8 ]9 k! z/ Q: I; u' N首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
. U4 l1 c- s. U) D* B5 S四个32位变量初始化为: ' w: X0 p t z5 q, L" f" z( h
A=0x01234567 . `$ J2 J" y; X/ ~* O5 U4 A W( ^ `
B=0x89abcdef - x2 [# ?- u7 O9 }! \$ }
C=0xfedcba98 : O) N9 H7 q' C5 S! ]7 k) `6 z% k
D=0x76543210
( H c( ^' I) Z它们称为链接变量(chaining variable)
* J% O2 c; x, l r8 g0 Q1 |接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
, w4 x; i7 A; a3 b/ ~8 s. e" Y4 q将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 ! m! P) y" h B8 B7 Z
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
4 b6 s% f# O% H+ G7 _$ ~以一下是每次操作中用到的四个非线性函数(每轮一个)。 : ^- Y* {" e y! K* P6 D1 L
F(X,Y,Z)=(X&Y)|((~X)&Z)
3 V1 Y9 x$ h( OG(X,Y,Z)=(X&Z)|(Y&(~Z))
: i2 ]7 W/ Q8 kH(X,Y,Z)=X^Y^Z
, W x. t0 d/ m2 H+ l2 i9 ]; pI(X,Y,Z)=Y^(X|(~Z))
$ y6 N9 G/ }9 ^, _% {(&是与,|是或,~是非,^是异或) 6 X: O/ \& j2 T; u9 x
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 9 @% l: ]3 ?) n8 E* y7 d- v
函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
& n1 T; z q6 ^( U/ S. r3 Q设Mj表示消息的第j个子分组(从0到15),<<4 N) f3 b# X9 x# ?
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<
7 E# O u" p0 e! V OGG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<; X! _2 e! ^, E+ ?5 g: o5 h% W
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<
+ L S# j# A1 M5 @! eII(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
+ g6 o# _3 X* ?* ]& A- J' K+ N这四轮(64步)是: ' A5 B0 o3 }/ n/ s. t. ]
第一轮
+ v1 D2 _# q j8 y+ P) p NFF(a,b,c,d,M0,7,0xd76aa478) ! }; G9 Z$ Z: X, o [
FF(d,a,b,c,M1,12,0xe8c7b756) 4 l/ a7 H; V& m9 Q$ C0 U
FF(c,d,a,b,M2,17,0x242070db)
' ^& _! A1 D4 d6 l% a. l$ B5 EFF(b,c,d,a,M3,22,0xc1bdceee) 7 q- G9 ~1 A2 Q) E, h5 Q) e O: f
FF(a,b,c,d,M4,7,0xf57c0faf)
2 J$ T. e' ^; \& w3 N" GFF(d,a,b,c,M5,12,0x4787c62a) 4 x0 K% s" q7 Z5 V1 r7 Q
FF(c,d,a,b,M6,17,0xa8304613) ( l7 x) c* |* b; _9 M" u8 w
FF(b,c,d,a,M7,22,0xfd469501)
6 U1 Q! W' H; K/ l8 b" p% QFF(a,b,c,d,M8,7,0x698098d8)
9 S u* R& Z# i( U' f, pFF(d,a,b,c,M9,12,0x8b44f7af) % q, V' M3 j$ s; _
FF(c,d,a,b,M10,17,0xffff5bb1) ( m$ A1 f0 B( i+ L: O
FF(b,c,d,a,M11,22,0x895cd7be)
! o5 r# s, m* X; n4 L6 Q2 p' VFF(a,b,c,d,M12,7,0x6b901122)
: c d( P3 J+ l3 s$ T2 P$ Y7 u9 QFF(d,a,b,c,M13,12,0xfd987193) 2 m6 s0 w7 A9 U0 K6 h
FF(c,d,a,b,M14,17,0xa679438e) 2 W _! x- Q: g9 R$ _( _, G
FF(b,c,d,a,M15,22,0x49b40821)
( Z6 O) D0 u) t9 G7 v+ t& _第二轮
! f/ ?6 ~4 w9 t% |" [) \; DGG(a,b,c,d,M1,5,0xf61e2562)
# W" |8 U/ u0 _0 `* k( N4 |- dGG(d,a,b,c,M6,9,0xc040b340) 6 G( X6 D5 E" ~% { T- j
GG(c,d,a,b,M11,14,0x265e5a51)
: S3 o$ t' m2 Q9 e: U e% Y) zGG(b,c,d,a,M0,20,0xe9b6c7aa)
7 J$ I0 w4 j, ^1 FGG(a,b,c,d,M5,5,0xd62f105d)
2 C7 c' _8 o: RGG(d,a,b,c,M10,9,0x02441453)
3 @ ^+ @7 v! D* s' MGG(c,d,a,b,M15,14,0xd8a1e681) 7 \3 Z' d5 l! G( H* t
GG(b,c,d,a,M4,20,0xe7d3fbc8) 4 O- Q; V7 _* x7 g1 \; V* i4 u
GG(a,b,c,d,M9,5,0x21e1cde6)
& r$ @2 L, z! q* e% WGG(d,a,b,c,M14,9,0xc33707d6)
% B* Z/ G; ]3 w3 DGG(c,d,a,b,M3,14,0xf4d50d87) 7 h% A/ L5 f+ }$ S
GG(b,c,d,a,M8,20,0x455a14ed)
' h0 P/ m1 q. x* @# vGG(a,b,c,d,M13,5,0xa9e3e905)
" ]% d8 E: O: ?3 R# LGG(d,a,b,c,M2,9,0xfcefa3f8) 6 g$ l/ ]! }7 k1 X) T
GG(c,d,a,b,M7,14,0x676f02d9)
( `9 Z' b' [) Z, i" s$ TGG(b,c,d,a,M12,20,0x8d2a4c8a)
' m# c- f5 J% }8 _! z n* D# w: f第三轮
2 s+ S% g; r) Z/ J; D: _: xHH(a,b,c,d,M5,4,0xfffa3942) . M* ~ A+ a, K( w' J5 o7 i
HH(d,a,b,c,M8,11,0x8771f681) 0 c% ]0 [% e: ~# g* L5 D$ S9 K5 q
HH(c,d,a,b,M11,16,0x6d9d6122) / _: ~6 M F; y" h6 h' n
HH(b,c,d,a,M14,23,0xfde5380c)
' f9 _6 R2 T0 H! N' h+ T' E* IHH(a,b,c,d,M1,4,0xa4beea44)
7 k6 o- p+ ?! v) A, D7 w6 n& \/ uHH(d,a,b,c,M4,11,0x4bdecfa9) . k- A+ \! J; w$ _+ m; m
HH(c,d,a,b,M7,16,0xf6bb4b60)
* f& x4 [) w1 [+ a; a! xHH(b,c,d,a,M10,23,0xbebfbc70)
$ y1 B. K- D. t; _3 ]HH(a,b,c,d,M13,4,0x289b7ec6)
: v! V5 b! {# f9 o7 jHH(d,a,b,c,M0,11,0xeaa127fa)
' Y8 C& A4 r0 ?* x# l2 a& ZHH(c,d,a,b,M3,16,0xd4ef3085)
3 g; X W$ l# r9 r: D% NHH(b,c,d,a,M6,23,0x04881d05) 1 v& s0 _4 k) N- V
HH(a,b,c,d,M9,4,0xd9d4d039)
2 F$ u- ~% q- O- s2 p6 x3 R! gHH(d,a,b,c,M12,11,0xe6db99e5) ; h' a& Q$ f- l7 k8 [, ?# Z; t6 I
HH(c,d,a,b,M15,16,0x1fa27cf8) 8 ~; d# H! X$ F( u- r
HH(b,c,d,a,M2,23,0xc4ac5665)
* \% G- v( c4 j4 f' O4 N2 p第四轮
* D$ W( j5 D1 \8 S8 dII(a,b,c,d,M0,6,0xf4292244) & @ z. M! l2 f) b9 b5 N
II(d,a,b,c,M7,10,0x432aff97)
. b( L) [+ a7 k* @II(c,d,a,b,M14,15,0xab9423a7) 0 v. I( |) D, ` _) ?' w
II(b,c,d,a,M5,21,0xfc93a039) 6 l2 \; X# T6 p2 E! o4 n
II(a,b,c,d,M12,6,0x655b59c3)
' Z& b0 \; [- t$ t* x- V! t0 OII(d,a,b,c,M3,10,0x8f0ccc92)
; L$ a* U1 {8 W2 A' N' K1 DII(c,d,a,b,M10,15,0xffeff47d) 0 x/ x" C, m* r
II(b,c,d,a,M1,21,0x85845dd1) + U; r1 a0 R. ^7 o" o" I
II(a,b,c,d,M8,6,0x6fa87e4f) ) R' R6 w. T8 r5 N1 A6 f( ?
II(d,a,b,c,M15,10,0xfe2ce6e0)
( V4 K5 y9 m2 _7 U0 `/ ^II(c,d,a,b,M6,15,0xa3014314) , e' z" A# O8 ^% y: f0 Z/ H
II(b,c,d,a,M13,21,0x4e0811a1)
4 G0 ^7 ^, F, W( A& j$ C) _II(a,b,c,d,M4,6,0xf7537e82)
! R2 T* w. Z% a9 B5 i3 qII(d,a,b,c,M11,10,0xbd3af235)
- {$ `* W6 Q2 o( B d( n9 O( L6 sII(c,d,a,b,M2,15,0x2ad7d2bb) ( [! ?& s, J) W
II(b,c,d,a,M9,21,0xeb86d391)
6 N! a* F& U+ m' q0 W( \常数ti可以如下选择:
; ~0 }* Z0 a; R$ t9 G在第i步中,ti是4294967296*abs(sin(i))的 |