[TABLE]
0 o1 ]4 W, k4 {3 f, } 2 @. M. y- n t0 o" F0 e. [
$ b* k a- u" ?$ l1 ?, ]
$ \/ ~0 s A3 g+ U, h' d6 ? ! x# U: b" J3 L+ Z2 ?
! W/ a0 F, L" s) N! S* W 0 d' Q, V8 S( n7 j3 b+ ~& E% Z0 k8 e
8 x# k# y) W0 s9 o" Y' b" s" F0 t[TR] ! `8 N- @ }- a, K% J& M$ m
3 W: U* F; V$ `; T: T
. g* f; d6 V# c# {9 k( C% H } . l+ ?9 |1 }8 O9 w8 ~# ~& U4 @
[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
2 A2 n, O a3 ^) \( H0 ^首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 & _8 O' h$ ?! ~ W$ w: E/ P/ k
四个32位变量初始化为: + o T7 N7 w" Z% s9 D
A=0x01234567 9 c% R v4 M$ b4 k5 M6 X9 e
B=0x89abcdef
5 ` X; G# }+ |: R5 ?! gC=0xfedcba98
& `( Z+ ^& ?& y$ x# Z- F, \" KD=0x76543210
# J' R6 z f3 U* Q5 X, K1 c2 N它们称为链接变量(chaining variable)
8 S4 f' j, c- O& g& ^3 ?! g2 ?: F s接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
' r- w5 y* n7 X4 n7 ]将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 9 p8 C* c7 J" }
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 # I3 M X5 a& g7 |
以一下是每次操作中用到的四个非线性函数(每轮一个)。
& r6 ?8 d* U; C5 W. G: sF(X,Y,Z)=(X&Y)|((~X)&Z) ; B. f9 T% X% n) T
G(X,Y,Z)=(X&Z)|(Y&(~Z)) 1 j# k0 M s' `4 b9 L6 `
H(X,Y,Z)=X^Y^Z & }1 F1 q: U8 [" h0 |. T. D
I(X,Y,Z)=Y^(X|(~Z))
: x* F- ^5 l, {4 ^" ]! h9 w9 O, S(&是与,|是或,~是非,^是异或)
. c& U* c5 N0 B% Q* e这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
# m. b! W# p* M- D函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 . i. r) b* A a0 y
设Mj表示消息的第j个子分组(从0到15),<<) C. j% l+ `9 N
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<
# F7 u( b: G$ B1 x' W4 UGG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<' q$ {; ^* y+ o5 T
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<
. w. k) ?* J3 R- sII(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<( {2 ^6 y5 i9 g$ d. p
这四轮(64步)是: ; ^, j4 n% c7 i0 P( m
第一轮 $ m, m; |. J3 @, F8 v
FF(a,b,c,d,M0,7,0xd76aa478) 9 g/ a; A+ i2 a5 W p0 o
FF(d,a,b,c,M1,12,0xe8c7b756) ' L1 z( k' Q! W* c
FF(c,d,a,b,M2,17,0x242070db) 1 _* C# e2 [% i/ J1 x ~* e
FF(b,c,d,a,M3,22,0xc1bdceee)
8 d, B% z6 G- x) I$ DFF(a,b,c,d,M4,7,0xf57c0faf)
4 ^4 f& ]1 v5 o- _9 L' K+ bFF(d,a,b,c,M5,12,0x4787c62a) 5 z# L6 Q7 @8 _) m2 I M1 y+ @
FF(c,d,a,b,M6,17,0xa8304613) 8 F' D& G& _/ E* w7 j- O
FF(b,c,d,a,M7,22,0xfd469501)
?* `, l* X% {. K% _* E9 Z; i' KFF(a,b,c,d,M8,7,0x698098d8) 0 ~- c& G# Y' G1 x# I
FF(d,a,b,c,M9,12,0x8b44f7af) . N0 b; W4 Q# w N
FF(c,d,a,b,M10,17,0xffff5bb1)
8 b+ S% }3 _1 Y+ D& n$ VFF(b,c,d,a,M11,22,0x895cd7be) 6 n+ ^" b# c' G, o
FF(a,b,c,d,M12,7,0x6b901122) m: j a* x7 c- E
FF(d,a,b,c,M13,12,0xfd987193)
2 |% S( X6 E R. [FF(c,d,a,b,M14,17,0xa679438e) 6 u' Z, P' w/ N/ _. P; t5 e4 o
FF(b,c,d,a,M15,22,0x49b40821) 1 N! l6 J. H' |# a( d8 {8 n
第二轮 * I S- b- r, {6 Q$ h
GG(a,b,c,d,M1,5,0xf61e2562) % c4 L' f2 N' X% Z9 b) M& l- j
GG(d,a,b,c,M6,9,0xc040b340) ' |" l2 @" R- z" t1 f
GG(c,d,a,b,M11,14,0x265e5a51)
, S8 f- s2 Q3 j, tGG(b,c,d,a,M0,20,0xe9b6c7aa)
8 a% j7 I0 f% Y* ZGG(a,b,c,d,M5,5,0xd62f105d)
/ z* o3 b0 _9 f0 r/ q0 D6 VGG(d,a,b,c,M10,9,0x02441453)
, u% R$ `: r& V& fGG(c,d,a,b,M15,14,0xd8a1e681) 3 T5 c! \( Q$ [- N
GG(b,c,d,a,M4,20,0xe7d3fbc8)
# V5 e9 E8 y" j* F8 OGG(a,b,c,d,M9,5,0x21e1cde6)
" e S8 H3 J: C1 ^GG(d,a,b,c,M14,9,0xc33707d6)
1 P" R, y# H4 k; BGG(c,d,a,b,M3,14,0xf4d50d87) ( q3 K1 E; @. [8 |( r% j# q, U
GG(b,c,d,a,M8,20,0x455a14ed)
7 C3 a1 n. y7 b! k! T6 N9 T' YGG(a,b,c,d,M13,5,0xa9e3e905)
0 }/ P+ w6 O1 O7 ~1 D4 |9 s+ D! IGG(d,a,b,c,M2,9,0xfcefa3f8) 3 X: d7 h) R6 {( A( T. D X5 ^/ U
GG(c,d,a,b,M7,14,0x676f02d9) 7 _3 e A- G" J5 @9 _* C! n, t/ a
GG(b,c,d,a,M12,20,0x8d2a4c8a)
) L+ W+ k* @6 {$ d# n第三轮 $ k" x. e% t0 A3 u" W* Q# T
HH(a,b,c,d,M5,4,0xfffa3942)
1 G! I# A [5 K* `+ Z- ]3 u6 Y) eHH(d,a,b,c,M8,11,0x8771f681)
; D3 t- a. t: l4 L" qHH(c,d,a,b,M11,16,0x6d9d6122)
0 P* N e% ^+ D9 ] `5 E: wHH(b,c,d,a,M14,23,0xfde5380c) , v4 A+ z% _9 Y* W
HH(a,b,c,d,M1,4,0xa4beea44)
7 M; v- g" ~6 k7 D' @HH(d,a,b,c,M4,11,0x4bdecfa9)
~9 v u5 ~) m& nHH(c,d,a,b,M7,16,0xf6bb4b60) + K2 r- X% n& U! u- S
HH(b,c,d,a,M10,23,0xbebfbc70)
$ \" A# x+ o9 \) i% XHH(a,b,c,d,M13,4,0x289b7ec6)
$ y5 W; c2 Z$ ]$ M% }( ~HH(d,a,b,c,M0,11,0xeaa127fa) # W( z1 w: v) o8 }1 U
HH(c,d,a,b,M3,16,0xd4ef3085) + D- d9 N3 e) h. x v7 H; M
HH(b,c,d,a,M6,23,0x04881d05) ; k% y7 E8 }* W
HH(a,b,c,d,M9,4,0xd9d4d039) " l, ?$ y+ ^0 V# p% g0 q
HH(d,a,b,c,M12,11,0xe6db99e5) 3 f0 P/ A: b7 l4 E% f& S
HH(c,d,a,b,M15,16,0x1fa27cf8) # Q8 z( y0 f7 {5 r/ ~/ E! \
HH(b,c,d,a,M2,23,0xc4ac5665)
$ \* t7 o. h! R$ }$ y% o$ ~9 y第四轮
7 _- r: W# ?4 H/ m6 P8 X" z, ^II(a,b,c,d,M0,6,0xf4292244) : C, ^# j/ T! K5 L8 K; H
II(d,a,b,c,M7,10,0x432aff97)
! B3 N0 S7 ~: M/ @II(c,d,a,b,M14,15,0xab9423a7) 0 V/ T2 C) G( f8 Y# L% m
II(b,c,d,a,M5,21,0xfc93a039)
2 I2 k5 g& g7 u" v' J/ i+ z1 T6 L; OII(a,b,c,d,M12,6,0x655b59c3) 1 v) P/ T6 b2 g) K p
II(d,a,b,c,M3,10,0x8f0ccc92)
/ W# B/ Y' ~6 m& s# y5 n) nII(c,d,a,b,M10,15,0xffeff47d)
) t6 D6 l- u yII(b,c,d,a,M1,21,0x85845dd1) l+ s4 X" r, i) `) N9 X
II(a,b,c,d,M8,6,0x6fa87e4f) ( ^1 L/ ~- m F+ S. Z
II(d,a,b,c,M15,10,0xfe2ce6e0)
! m5 f# {7 D$ }- r( z& qII(c,d,a,b,M6,15,0xa3014314) 3 @. S Y# r. C5 {+ I5 H% Y! @, l
II(b,c,d,a,M13,21,0x4e0811a1) - b& j. K: [9 S# n
II(a,b,c,d,M4,6,0xf7537e82)
, p- @- x3 C% x0 ^ [II(d,a,b,c,M11,10,0xbd3af235) ' W$ l' v* V" T, E
II(c,d,a,b,M2,15,0x2ad7d2bb)
5 ^7 x" C4 j5 f) F+ g* |II(b,c,d,a,M9,21,0xeb86d391) 6 @7 t5 D. [; ~$ c3 d
常数ti可以如下选择: 2 F) l) r/ W& g8 `
在第i步中,ti是4294967296*abs(sin(i))的 |