[TABLE]
9 [! B8 X8 \! P3 r$ s, c - J' Q% }; G, W* n
# W* c, ]) C1 G# V 7 v3 k3 E5 ?- u: U% S$ ?% a: _
; h9 _# `- ~8 I" N) ` % m+ U8 i4 j8 T5 Y
- r' w2 n; g1 i+ a! W8 S
: I+ Q M. N6 [: D# G[TR]
. F- W. G" [, k. c- Z+ _6 {0 ?
- J! d; K& H' p5 R* I
5 r: Q/ ^0 ~) d% [2 b( ~* n * J+ N; R/ v4 ]$ r+ w$ H4 _
[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 % d, r8 B, Q% G# U m/ h4 P- @- s9 r
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
+ \: W7 \" q$ P3 q% `四个32位变量初始化为:
. }: n! s! Q2 C, B( f0 T2 s8 [A=0x01234567 4 D* K* H2 ? m$ O; t! x
B=0x89abcdef % r, r% u$ |2 n2 _# a
C=0xfedcba98
& e, m8 z6 ]3 [D=0x76543210 % K' ~. z- J% B5 ^$ g. d* `
它们称为链接变量(chaining variable)
# P2 p* L- w, ~: y+ L接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
, K8 Q5 K/ p. `# y5 ^将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 # y/ w! q! S7 `. R) P0 U4 f# X$ z
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 8 r/ c; \ q8 k7 w% G
以一下是每次操作中用到的四个非线性函数(每轮一个)。
/ J6 d7 J& T' i3 U6 X, CF(X,Y,Z)=(X&Y)|((~X)&Z)
$ z7 m9 w" r$ M% y- d+ ^- ?0 G* oG(X,Y,Z)=(X&Z)|(Y&(~Z))
% d& s! b/ K9 E( h: D4 RH(X,Y,Z)=X^Y^Z
4 t7 z9 c9 B) RI(X,Y,Z)=Y^(X|(~Z)) & l" W' _& p2 {( g
(&是与,|是或,~是非,^是异或) ( F4 t6 n5 ^0 ~ H4 i
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
+ `! j9 n/ `6 Z. k/ _函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 9 j( `* X& p. z0 Z5 l
设Mj表示消息的第j个子分组(从0到15),<<7 d+ g+ @) r( L
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<
0 j6 V+ Q6 I; O5 b t3 oGG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<2 m" `% E7 |8 K( m5 y L( o, x4 E
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<4 G. k. s. Y, }# n' X5 K! U/ j
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
7 ^$ {4 u( @4 i# R" S% r这四轮(64步)是: 1 f; o, [+ L2 d7 \
第一轮 8 f. A& Y( y1 _0 M- Y. R! L% H
FF(a,b,c,d,M0,7,0xd76aa478) 6 O; f6 y6 Z, G$ @! r
FF(d,a,b,c,M1,12,0xe8c7b756)
) x7 u* _% v- H* vFF(c,d,a,b,M2,17,0x242070db) + ?9 k u4 l8 d! ]! w8 V' \
FF(b,c,d,a,M3,22,0xc1bdceee) 5 f: D% K- v# y# ?( g2 H. t) i
FF(a,b,c,d,M4,7,0xf57c0faf) , G* W# s4 \: _
FF(d,a,b,c,M5,12,0x4787c62a) % s% e2 V, T# T, |
FF(c,d,a,b,M6,17,0xa8304613)
8 k: \. m6 Y! c( f jFF(b,c,d,a,M7,22,0xfd469501)
% O" }* n2 U/ ~, G9 X+ f! ~- _" h8 nFF(a,b,c,d,M8,7,0x698098d8)
; e+ d" r4 \' w0 TFF(d,a,b,c,M9,12,0x8b44f7af)
5 U3 d& m7 U, {& O' U9 x. _$ |FF(c,d,a,b,M10,17,0xffff5bb1)
7 f: U* M1 @! qFF(b,c,d,a,M11,22,0x895cd7be) ' x3 K# \8 M K. a( o3 s
FF(a,b,c,d,M12,7,0x6b901122) 0 n- i$ t$ v/ \! R2 p! ]5 c0 m
FF(d,a,b,c,M13,12,0xfd987193) - r, R' \# W- n# ~6 G8 E
FF(c,d,a,b,M14,17,0xa679438e) 5 m& M2 y1 Z- ^ {
FF(b,c,d,a,M15,22,0x49b40821)
$ B3 j2 L3 r' N" ?5 g9 A第二轮
F% A( y- M4 E# R9 Z# a0 ]GG(a,b,c,d,M1,5,0xf61e2562) . G7 o4 h: R4 a4 @
GG(d,a,b,c,M6,9,0xc040b340)
" N3 U0 _- J. v; R. r4 y$ H. ]' ]GG(c,d,a,b,M11,14,0x265e5a51) . t& R5 @# \2 ^- y9 e3 H
GG(b,c,d,a,M0,20,0xe9b6c7aa) `; W6 P5 V* f5 u: m& o0 A8 U! E
GG(a,b,c,d,M5,5,0xd62f105d) ' S( _5 Z6 Y5 y& t6 x% Z5 q Z
GG(d,a,b,c,M10,9,0x02441453) + x6 i6 S) k6 z4 f5 m
GG(c,d,a,b,M15,14,0xd8a1e681)
- d/ s+ Y+ @* r" q: Q7 T% WGG(b,c,d,a,M4,20,0xe7d3fbc8)
6 X, P7 v7 m6 {0 \2 a. b. aGG(a,b,c,d,M9,5,0x21e1cde6)
- I" F/ C0 L% |1 G4 @GG(d,a,b,c,M14,9,0xc33707d6)
" Q0 I" c N7 z/ }GG(c,d,a,b,M3,14,0xf4d50d87)
6 J: l8 i( t4 U8 v( `8 ZGG(b,c,d,a,M8,20,0x455a14ed) * ]. T0 T' w/ v1 @! X2 j- K
GG(a,b,c,d,M13,5,0xa9e3e905) - ^9 E3 a. Z' h' {
GG(d,a,b,c,M2,9,0xfcefa3f8)
2 T: X8 Y! Y5 h& [+ ZGG(c,d,a,b,M7,14,0x676f02d9) , s- {( i# W( P! W
GG(b,c,d,a,M12,20,0x8d2a4c8a)
9 F" S& B1 R# V第三轮
+ I% Q+ X" `" eHH(a,b,c,d,M5,4,0xfffa3942)
: C4 @, C! \( ~0 x) a' l# i: S4 cHH(d,a,b,c,M8,11,0x8771f681)
1 Y2 B" }0 N/ G7 x0 IHH(c,d,a,b,M11,16,0x6d9d6122)
7 f/ s& h' ^. B; i0 R% c0 hHH(b,c,d,a,M14,23,0xfde5380c) + w" q* Z% @) I; o
HH(a,b,c,d,M1,4,0xa4beea44) & z( Y8 {0 w" B. G# l: m
HH(d,a,b,c,M4,11,0x4bdecfa9)
9 e- ?9 Z5 ?1 t* v) C$ a1 kHH(c,d,a,b,M7,16,0xf6bb4b60) 0 x6 R0 I6 `, H( T8 N2 [# Y
HH(b,c,d,a,M10,23,0xbebfbc70)
& [0 N4 h! K8 F$ I$ y& eHH(a,b,c,d,M13,4,0x289b7ec6) 9 u' k9 M3 L3 `# e, n
HH(d,a,b,c,M0,11,0xeaa127fa)
4 ^: |3 |# S) n/ c HHH(c,d,a,b,M3,16,0xd4ef3085)
$ M! Z* o. {% _9 _% g0 e1 |( XHH(b,c,d,a,M6,23,0x04881d05)
3 e" Q2 {2 ]4 p: k5 m% ~, W( hHH(a,b,c,d,M9,4,0xd9d4d039)
1 J3 `3 _' a) n2 nHH(d,a,b,c,M12,11,0xe6db99e5) / d# {: _- R, W$ f: [3 Z4 V: q
HH(c,d,a,b,M15,16,0x1fa27cf8) 9 Q- v7 i+ t) Z3 V7 e* d! A
HH(b,c,d,a,M2,23,0xc4ac5665) 9 L, a7 u; j& \
第四轮
S2 p' |1 M* p9 E% uII(a,b,c,d,M0,6,0xf4292244)
' k5 I! |) a2 G ]0 e: P- GII(d,a,b,c,M7,10,0x432aff97)
# q2 H6 R6 Y) wII(c,d,a,b,M14,15,0xab9423a7)
$ F6 ]6 `) r! E: III(b,c,d,a,M5,21,0xfc93a039)
' @& v4 o8 |' a6 a; A1 Y2 g/ OII(a,b,c,d,M12,6,0x655b59c3) : v2 c; j) [3 j1 W
II(d,a,b,c,M3,10,0x8f0ccc92)
2 `6 q8 C' w7 Y! EII(c,d,a,b,M10,15,0xffeff47d)
w, S* [ x# l- E: ^II(b,c,d,a,M1,21,0x85845dd1) , @. J& y0 l5 n+ E( `' [/ V
II(a,b,c,d,M8,6,0x6fa87e4f) 5 I. t/ M3 `$ z2 Z) Y E D
II(d,a,b,c,M15,10,0xfe2ce6e0) / t( l4 A, m8 T6 z/ V+ i2 E) Q
II(c,d,a,b,M6,15,0xa3014314) & Y' X9 r- J% w+ l/ U2 L% G
II(b,c,d,a,M13,21,0x4e0811a1) ! Z9 Q7 Y t' w+ n
II(a,b,c,d,M4,6,0xf7537e82) 5 F1 c" [. d. @- ~
II(d,a,b,c,M11,10,0xbd3af235) 7 g( v; A) J: ]* d
II(c,d,a,b,M2,15,0x2ad7d2bb) , O7 d7 {5 W0 {) w i8 G, m: |; |
II(b,c,d,a,M9,21,0xeb86d391) / X/ w; d. X; f! o* K
常数ti可以如下选择:
+ q. }5 {9 W- N0 [5 G* E在第i步中,ti是4294967296*abs(sin(i))的 |