[TABLE]
1 k' w" |% n, G0 `. V% d3 u9 B$ Q
; u7 `4 {. i# Y ~1 Q
! E2 `- ~* h3 v2 U4 J* A ( m- w: W3 N- h9 h4 K' L; C
/ j. W6 {2 ]) S8 k$ R$ |# @7 i
9 z0 i+ F4 f3 k4 ~ - b& x5 E6 g. A! d
8 M0 F+ D% Y9 R+ j# {9 U
[TR]
2 B' W% k' ]' w. D: R# b' u & \3 |8 r! t' a5 d
M( t# Z0 y, V0 B. m3 q 2 K H- ^! n9 i: q
[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 , j; s3 @) B" T6 ~
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 8 H! L" e% |, O0 L7 _6 K9 N* {! C
四个32位变量初始化为: " c0 r9 i. U' R& c! a [1 e
A=0x01234567
' F# a4 D7 K0 [8 FB=0x89abcdef % j5 z/ o7 |/ c! d* Q& }
C=0xfedcba98 , h2 V) o$ ~/ i% M S% |
D=0x76543210
/ v2 i4 s D! M# h- K' k它们称为链接变量(chaining variable)
4 M0 N4 |' X, u接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
+ r) K7 v8 G$ d: W! O将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。
; s$ X. ?0 a- l" g7 J% Z3 P1 s主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
( t' |' E4 ]4 B5 L, T3 D7 w以一下是每次操作中用到的四个非线性函数(每轮一个)。
9 M4 \) E$ @8 r: B' U& ?6 N9 M$ cF(X,Y,Z)=(X&Y)|((~X)&Z)
9 b X( ], \ G* zG(X,Y,Z)=(X&Z)|(Y&(~Z)) # L" }. `( g7 W& l6 _; M t
H(X,Y,Z)=X^Y^Z
) {% F1 @& F0 S% p8 A3 Z0 GI(X,Y,Z)=Y^(X|(~Z)) . C, v1 o" X3 V
(&是与,|是或,~是非,^是异或)
. Q3 }: {4 Y; n0 ]2 T这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
/ W2 Q3 u6 V4 n/ }7 V. F; Q8 G函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 ) a1 {/ h4 i/ r! K' D
设Mj表示消息的第j个子分组(从0到15),<<
: m0 U; N* B4 o+ TFF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<7 {) i% {) ^9 L$ n' q! R3 Z' w
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<: z6 x- j' L+ N1 s
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<5 C/ O, U! K& R4 |) C
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<) H* l+ h t1 s* X0 j4 R5 {
这四轮(64步)是: / f, v/ B9 r. f3 F. c
第一轮
' F, P# N, y# ~$ Y/ G8 j$ q [) ]FF(a,b,c,d,M0,7,0xd76aa478)
2 E" {4 k+ H+ fFF(d,a,b,c,M1,12,0xe8c7b756)
3 }4 b# ^: ?4 sFF(c,d,a,b,M2,17,0x242070db)
0 V; j( {! _9 E) x5 f$ ]) wFF(b,c,d,a,M3,22,0xc1bdceee) ! f# M; U' a! V; k% B1 q
FF(a,b,c,d,M4,7,0xf57c0faf)
8 g1 r, U( t' h5 u# l" k: g$ \FF(d,a,b,c,M5,12,0x4787c62a) 7 W. ]& [) d; ~6 o
FF(c,d,a,b,M6,17,0xa8304613) - e4 m9 ~8 l {5 J% g7 |
FF(b,c,d,a,M7,22,0xfd469501)
+ J+ y+ @ B: O9 c" FFF(a,b,c,d,M8,7,0x698098d8) & ^6 h" y; r; Y E7 G$ J: b5 ]
FF(d,a,b,c,M9,12,0x8b44f7af) * z& C2 x" }0 f) f% D1 Z3 R
FF(c,d,a,b,M10,17,0xffff5bb1) $ Z. ^) ?3 A g Z O5 z
FF(b,c,d,a,M11,22,0x895cd7be)
" m+ m8 f) @2 S r1 qFF(a,b,c,d,M12,7,0x6b901122) % Z3 Y" M6 t B5 o
FF(d,a,b,c,M13,12,0xfd987193)
- P3 h1 Y& W, \& W- @; z6 q- J5 _; F5 aFF(c,d,a,b,M14,17,0xa679438e) ; ]2 ]+ j: I, B5 |" i8 }
FF(b,c,d,a,M15,22,0x49b40821) $ t8 j% m- ^9 m& H0 b7 A% ? B
第二轮 $ s7 f% K: {& C7 R
GG(a,b,c,d,M1,5,0xf61e2562) 4 `0 C0 |7 C5 {3 ~
GG(d,a,b,c,M6,9,0xc040b340)
2 ~" s/ g' E. B# z$ i) hGG(c,d,a,b,M11,14,0x265e5a51) , B7 j) N$ p. O2 c% ?% q9 X# L
GG(b,c,d,a,M0,20,0xe9b6c7aa) * S4 R; P' l8 _5 j1 t
GG(a,b,c,d,M5,5,0xd62f105d)
% {* ~" d8 E0 d5 R- VGG(d,a,b,c,M10,9,0x02441453) ! ], Y7 _8 V5 i3 x7 f+ s" [
GG(c,d,a,b,M15,14,0xd8a1e681)
; [8 ^2 C! a/ o0 M5 n& m/ a6 zGG(b,c,d,a,M4,20,0xe7d3fbc8)
: A& E: \5 l2 ~- O, |4 ?/ H" RGG(a,b,c,d,M9,5,0x21e1cde6)
# y- g& q1 i( J# X5 U- ?$ ZGG(d,a,b,c,M14,9,0xc33707d6)
7 z1 O: n3 p. L% k; qGG(c,d,a,b,M3,14,0xf4d50d87) 1 n/ N+ Z% Y/ E8 y C
GG(b,c,d,a,M8,20,0x455a14ed)
9 k. p% V! H+ A" n" o% I' s$ UGG(a,b,c,d,M13,5,0xa9e3e905) 1 Y" G' b0 Y/ _/ c/ \5 e. g! W8 I
GG(d,a,b,c,M2,9,0xfcefa3f8) ; N: _9 k. d& z9 _; P2 P! H4 |
GG(c,d,a,b,M7,14,0x676f02d9)
7 e. u6 I% o( @ KGG(b,c,d,a,M12,20,0x8d2a4c8a) $ m5 N! `" f! c; n' k5 G
第三轮
! L% _) x# I" ]' ?4 G/ @HH(a,b,c,d,M5,4,0xfffa3942) 2 K6 J, R2 V+ f) G
HH(d,a,b,c,M8,11,0x8771f681) V9 E! D7 Z# e8 f
HH(c,d,a,b,M11,16,0x6d9d6122) ) `! x6 F5 J* S" q: o" j
HH(b,c,d,a,M14,23,0xfde5380c)
/ `' V/ ]0 {/ R6 ^+ ?2 }HH(a,b,c,d,M1,4,0xa4beea44)
/ a" ~8 A% }. L7 {HH(d,a,b,c,M4,11,0x4bdecfa9)
$ y* V' f( P+ v$ q! ^HH(c,d,a,b,M7,16,0xf6bb4b60) - V, q4 K$ l$ `3 m
HH(b,c,d,a,M10,23,0xbebfbc70)
( O2 R/ ~% Z, }6 k9 J, iHH(a,b,c,d,M13,4,0x289b7ec6)
5 w. ^ n1 Z: b* N$ F( ~HH(d,a,b,c,M0,11,0xeaa127fa)
6 u, @" ^: I9 E* P6 YHH(c,d,a,b,M3,16,0xd4ef3085) 1 H8 {/ p. j# e9 @2 r. a! p
HH(b,c,d,a,M6,23,0x04881d05)
1 W |& [$ U5 ?% Y) [HH(a,b,c,d,M9,4,0xd9d4d039)
2 n9 ]) F* w- j! ]- ~) M2 AHH(d,a,b,c,M12,11,0xe6db99e5) * ?- k ^' O( J8 @0 |
HH(c,d,a,b,M15,16,0x1fa27cf8) % n6 j) g! k) X, ~1 m( m. U
HH(b,c,d,a,M2,23,0xc4ac5665) - n" x$ o! y! D8 l' U$ E+ [
第四轮 ; U( g, L7 ~- ~5 t7 J
II(a,b,c,d,M0,6,0xf4292244) ' `7 [; y1 i( _: b0 k
II(d,a,b,c,M7,10,0x432aff97) $ p3 m7 Y9 {, \# j" i
II(c,d,a,b,M14,15,0xab9423a7) : `! o; e: W# ]1 R/ q" m) E
II(b,c,d,a,M5,21,0xfc93a039)
& L) |+ X% ]8 u- g+ e' Z# bII(a,b,c,d,M12,6,0x655b59c3) / X0 O- } H y- h6 v
II(d,a,b,c,M3,10,0x8f0ccc92) / Q+ j8 W! l5 F0 D
II(c,d,a,b,M10,15,0xffeff47d) 6 t; |9 z+ q1 ^4 q5 B- D
II(b,c,d,a,M1,21,0x85845dd1)
& z, A1 ]8 u' W6 }II(a,b,c,d,M8,6,0x6fa87e4f)
; D7 w$ n. z& L. pII(d,a,b,c,M15,10,0xfe2ce6e0)
7 p4 Z' H! l+ o, o. aII(c,d,a,b,M6,15,0xa3014314) % J( d3 R& n- u& D0 J, t3 k
II(b,c,d,a,M13,21,0x4e0811a1) 0 V# O8 w% k \1 }8 I% G8 @
II(a,b,c,d,M4,6,0xf7537e82)
3 {1 Y8 ]9 Q# o7 Z( e SII(d,a,b,c,M11,10,0xbd3af235)
2 S1 Y& `$ z& W! }" EII(c,d,a,b,M2,15,0x2ad7d2bb) 0 b3 V( O$ Z6 n; I
II(b,c,d,a,M9,21,0xeb86d391)
! k: O% }" C% A2 F F% B5 Z% C常数ti可以如下选择:
, L3 B/ u4 W5 C* o$ M( F在第i步中,ti是4294967296*abs(sin(i))的 |