[TABLE]
1 P, h* V } J- x% V3 w$ B
0 P( ?7 |7 j# d% P+ B5 P( ^) w) f ' B* L1 D7 M$ M4 g6 X6 u
% k7 \& I" _$ g( L8 a, j; P4 P
4 k: @( I3 |; _" e- {& x K # ~+ C- X, q. g7 {7 s8 ^
' K1 R1 L0 q9 y* C |
1 V% L4 B% c$ N4 i2 j4 |6 H
[TR] 0 Y/ X. H& V9 K4 P+ M
% k; ~( P" ^3 Q! P+ |- o4 b
+ ^0 n* J* @- K9 m
; [ |2 p, H" ][TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
0 N3 N, b- r0 M( q5 w$ i3 ~首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
& U, d" w0 R Y, O& Y" B" l四个32位变量初始化为: + G: |; z6 [0 q* I' f; _
A=0x01234567
( w J3 ~/ @+ A1 l1 R3 @6 rB=0x89abcdef 7 N ^8 w5 E8 `4 F) E8 U4 x$ Q
C=0xfedcba98 9 w8 ^& s# \! A
D=0x76543210
. y' e4 y% N4 `' ?* y它们称为链接变量(chaining variable)
+ R7 z6 {7 r8 K接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
" p; \# {6 j$ p; v将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 + l# M; V1 ~& W# J" X* X% Y9 O8 E
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 4 [3 V6 B$ Z% j4 O7 @5 |
以一下是每次操作中用到的四个非线性函数(每轮一个)。 / X; j% ?2 m0 `4 n. X
F(X,Y,Z)=(X&Y)|((~X)&Z)
, V) b: v! v+ i. }G(X,Y,Z)=(X&Z)|(Y&(~Z)) 9 ^( z( `; p- }2 Q5 q4 A- m
H(X,Y,Z)=X^Y^Z
! D) f8 p" K, g% q: V4 WI(X,Y,Z)=Y^(X|(~Z)) 8 h( L4 N$ g" S8 B$ u. M5 D3 }( P* f& W
(&是与,|是或,~是非,^是异或) 6 q, d8 N0 m p
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
8 a3 q# [8 P* I3 O. h函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 : r. d2 Z! B. ^& a* z
设Mj表示消息的第j个子分组(从0到15),<<1 ?; T6 M: R. N2 Y
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<
6 j- h9 F2 k$ w9 E7 Y0 P( uGG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<
) x n5 K6 l" U# _& O* L# I! [* b: vHH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<2 @5 R, S) F# }7 G* ~
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<) a8 S$ e9 A' P% H1 Z$ D. J
这四轮(64步)是: ! h# U! t! |% r' R5 {
第一轮
: F$ E3 ^/ t! m7 yFF(a,b,c,d,M0,7,0xd76aa478) d. L( e" Q+ F! l
FF(d,a,b,c,M1,12,0xe8c7b756) . B3 \* C) ]+ [6 Y8 u$ B
FF(c,d,a,b,M2,17,0x242070db) ( q" u9 K% l( M' u4 `) m4 q7 u
FF(b,c,d,a,M3,22,0xc1bdceee)
* H+ N6 I: w, T6 XFF(a,b,c,d,M4,7,0xf57c0faf)
: g+ o p+ Q2 O8 g5 Y8 N- sFF(d,a,b,c,M5,12,0x4787c62a) ! N( T* w: k! z( {: Z
FF(c,d,a,b,M6,17,0xa8304613)
% P* u! A5 c3 _, kFF(b,c,d,a,M7,22,0xfd469501)
! h6 u6 Q3 `/ fFF(a,b,c,d,M8,7,0x698098d8) 6 W: z7 {" L1 m! L" A, g! C: v" e
FF(d,a,b,c,M9,12,0x8b44f7af)
; y- h- a* [& t5 t: A. ?4 WFF(c,d,a,b,M10,17,0xffff5bb1)
5 I+ U- ]& ~4 w; z. m% S3 r3 rFF(b,c,d,a,M11,22,0x895cd7be)
5 w% N+ e1 u% F* Q2 ?FF(a,b,c,d,M12,7,0x6b901122) ' X4 C' ]# l" k, o6 F: n/ P
FF(d,a,b,c,M13,12,0xfd987193) * d9 _' S- ~2 B K- U; X0 V; }* M
FF(c,d,a,b,M14,17,0xa679438e)
) `9 U \- {: QFF(b,c,d,a,M15,22,0x49b40821)
+ a0 j4 A# E3 P; `" U' K, s第二轮
2 N C; C% J: e' N) Y& rGG(a,b,c,d,M1,5,0xf61e2562)
6 O x% \' ^% L k& N! P- N F6 C# IGG(d,a,b,c,M6,9,0xc040b340)
9 D( u* e$ W8 `( TGG(c,d,a,b,M11,14,0x265e5a51) . J5 a, S( A! s8 r: a/ K. x8 U
GG(b,c,d,a,M0,20,0xe9b6c7aa) - H- w* C3 D0 N' D1 c, b. A
GG(a,b,c,d,M5,5,0xd62f105d) * f% O( n* Z6 E3 v' a m1 j& a
GG(d,a,b,c,M10,9,0x02441453)
3 N& m+ C. l5 l5 W. G0 [GG(c,d,a,b,M15,14,0xd8a1e681)
: u2 L' c% T5 f/ X( ~- \GG(b,c,d,a,M4,20,0xe7d3fbc8)
- ~, X# q: S8 P7 B# mGG(a,b,c,d,M9,5,0x21e1cde6) / q4 P+ Y8 R9 o
GG(d,a,b,c,M14,9,0xc33707d6) 0 e/ a$ J: q( Q o
GG(c,d,a,b,M3,14,0xf4d50d87) & k* W' m: a# T" O# {" C! b3 N* D
GG(b,c,d,a,M8,20,0x455a14ed)
9 F _; {: q0 M9 | cGG(a,b,c,d,M13,5,0xa9e3e905) / ^& }6 Y1 U0 x
GG(d,a,b,c,M2,9,0xfcefa3f8)
6 s! N [ ~7 t$ I! Q" CGG(c,d,a,b,M7,14,0x676f02d9)
0 N4 b z. t+ K' p8 i, C: bGG(b,c,d,a,M12,20,0x8d2a4c8a)
: y% g8 T p5 k6 f! H* \* f! ]第三轮
6 O0 Q1 ]" {6 b% Z9 t$ A8 \# [HH(a,b,c,d,M5,4,0xfffa3942)
) d) W5 u; O: ` d; Y' P# h9 yHH(d,a,b,c,M8,11,0x8771f681)
; h7 K- [$ x& Y3 p5 R5 cHH(c,d,a,b,M11,16,0x6d9d6122) 2 p- x& {' V* o: B9 X! l
HH(b,c,d,a,M14,23,0xfde5380c) 2 w8 C- H/ [, a, v3 f* R: J
HH(a,b,c,d,M1,4,0xa4beea44) & [4 o+ `% t4 R* }7 U1 o4 L; C/ a
HH(d,a,b,c,M4,11,0x4bdecfa9) 9 z' |* w/ {' o' R
HH(c,d,a,b,M7,16,0xf6bb4b60) 2 {* Y% e3 g8 N+ D/ b6 D
HH(b,c,d,a,M10,23,0xbebfbc70)
0 g) y+ \1 A+ qHH(a,b,c,d,M13,4,0x289b7ec6) ( l7 `$ ?. V8 R+ O8 Z
HH(d,a,b,c,M0,11,0xeaa127fa)
! |* m# L8 \5 e( K" y! u- z. v' BHH(c,d,a,b,M3,16,0xd4ef3085) ; E% y+ n0 o4 W; ^( y L5 R
HH(b,c,d,a,M6,23,0x04881d05)
: {; \0 n" `1 T5 Y1 yHH(a,b,c,d,M9,4,0xd9d4d039)
6 P9 o T8 E3 A( w3 q" WHH(d,a,b,c,M12,11,0xe6db99e5) 9 m% M2 f4 T, e, ^4 ?8 N' I- R' R
HH(c,d,a,b,M15,16,0x1fa27cf8)
* J* Q( T, L7 |HH(b,c,d,a,M2,23,0xc4ac5665)
: W; f! d. L0 `/ h H( _/ R第四轮 1 t9 c* O: v4 j6 a+ n+ Q4 T9 p
II(a,b,c,d,M0,6,0xf4292244) 1 i A: d. F. v/ s# Q) V' j
II(d,a,b,c,M7,10,0x432aff97)
9 V9 ~# r6 s' x# Y+ J" [II(c,d,a,b,M14,15,0xab9423a7)
9 R* X4 O1 J# J% XII(b,c,d,a,M5,21,0xfc93a039)
; l7 B. p" V4 p; }II(a,b,c,d,M12,6,0x655b59c3) 5 @, q+ s! |+ J% o! b! p$ ^
II(d,a,b,c,M3,10,0x8f0ccc92) % Y6 H& D- }, h3 U
II(c,d,a,b,M10,15,0xffeff47d)
R2 E5 I) N6 M1 jII(b,c,d,a,M1,21,0x85845dd1) : }3 d' n2 v# \: M
II(a,b,c,d,M8,6,0x6fa87e4f)
- H! M2 o# O0 B* L" w- L, bII(d,a,b,c,M15,10,0xfe2ce6e0) % b, q' b3 Y3 C$ r) T+ Q
II(c,d,a,b,M6,15,0xa3014314)
+ @4 ?4 h' K$ G$ ]8 y+ UII(b,c,d,a,M13,21,0x4e0811a1) # `, C5 Z5 V+ j7 g
II(a,b,c,d,M4,6,0xf7537e82)
) l& g& C& s% Q* h) _: ^% N# l) v8 i- qII(d,a,b,c,M11,10,0xbd3af235) 6 G2 w. h. G6 _; h K
II(c,d,a,b,M2,15,0x2ad7d2bb) , E& ^6 g. G( h/ d( E& K
II(b,c,d,a,M9,21,0xeb86d391)
, R: d/ G0 V8 e" P( d( _+ B常数ti可以如下选择: " N& [+ {. `) J0 X6 |
在第i步中,ti是4294967296*abs(sin(i))的 |