[TABLE]
5 @( w) h I4 k4 x 7 v6 M# k) {* c, B
; ^( H; h8 W$ v- k1 x: t
, u, o0 A. B! h9 m# b& A1 X
8 g6 ^* E2 v6 A9 \, W 5 c+ Z3 ~* |$ j" {0 @
8 R% N3 N4 [& T% v) o2 P
5 l5 {" x. s( q7 w4 U
[TR] - K; w+ V$ f. x) y) Z7 d
/ X, g/ n8 `9 j3 S$ u8 B ! Z+ k; Q% }( E2 ^2 ~% Y6 M/ L
# z7 s2 T i" v" _. q% ^[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 : O w# T* U8 o9 H7 I" C6 m8 y( u: e
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 $ ]. e" h; I/ V
四个32位变量初始化为: % |0 N, l! @9 T0 i0 B" C
A=0x01234567
6 l- ^4 j( i2 @+ C EB=0x89abcdef
( ?5 x* W, v, Q9 m, CC=0xfedcba98 8 P& [8 J5 [; V; q; D) k
D=0x76543210
: v% V' V) j7 X. q/ _! j) [# `它们称为链接变量(chaining variable) 3 e. p" H+ Q1 Q- I$ Q& C* j5 j# a \
接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
5 l2 q! J6 ]9 b) g将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 $ k: T9 L) U( x* ^$ o: h9 n
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 7 _3 n! X! u2 a; O& T& z: z5 B5 O
以一下是每次操作中用到的四个非线性函数(每轮一个)。
1 {6 R7 @3 d- dF(X,Y,Z)=(X&Y)|((~X)&Z)
/ o$ g& ]) O X+ t9 {% T4 NG(X,Y,Z)=(X&Z)|(Y&(~Z)) ' @% P0 P4 K8 [) z7 p" l6 a: F
H(X,Y,Z)=X^Y^Z
- X( l2 G0 I& \2 D8 DI(X,Y,Z)=Y^(X|(~Z))
! Y2 z- D/ ^* e. m(&是与,|是或,~是非,^是异或)
( }- E, T: n+ }$ f7 n: J8 p这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
' w% [8 d- w9 {5 z9 E函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 7 D7 u( A; c# d3 o* @0 f8 @/ r
设Mj表示消息的第j个子分组(从0到15),<<
1 w6 u. P8 W; r# e/ U+ ]! X' {FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<
$ l5 _4 Y. J, p& j0 jGG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<
9 H' r7 Y3 {/ ]HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<# h" g4 b' b. r) w7 Q
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
8 {5 ~9 r! G2 X! {4 ?& _+ f这四轮(64步)是:
7 `* q+ F6 ]& H第一轮
4 k0 o7 d2 _) x# Q2 t3 {* rFF(a,b,c,d,M0,7,0xd76aa478)
5 Z2 _6 e- e* G7 ]3 ^" gFF(d,a,b,c,M1,12,0xe8c7b756)
7 m* \ o% ]5 q: r* tFF(c,d,a,b,M2,17,0x242070db)
* d8 \- ^# ?) t l# aFF(b,c,d,a,M3,22,0xc1bdceee) , n/ f N% }4 v* `5 \
FF(a,b,c,d,M4,7,0xf57c0faf)
8 ? ^0 H9 |" y! w" s* Z* jFF(d,a,b,c,M5,12,0x4787c62a) : W- G, U! ` c
FF(c,d,a,b,M6,17,0xa8304613) X& q" N5 M$ _) r( R
FF(b,c,d,a,M7,22,0xfd469501)
# t1 |+ i" V. v5 s0 cFF(a,b,c,d,M8,7,0x698098d8)
9 D4 Z5 s' B0 u" m* n( v. oFF(d,a,b,c,M9,12,0x8b44f7af) 5 q2 n& f& C& i* b" X4 D
FF(c,d,a,b,M10,17,0xffff5bb1)
) g4 ^3 v) J# `. ]5 IFF(b,c,d,a,M11,22,0x895cd7be)
% F5 W" }; a7 ]/ P6 J$ L& ^6 z; \FF(a,b,c,d,M12,7,0x6b901122)
& s; X% E) q/ NFF(d,a,b,c,M13,12,0xfd987193) ! Q/ s+ C7 X4 \8 |/ s9 t& X
FF(c,d,a,b,M14,17,0xa679438e) 6 i( y4 @* ]* L! z/ F
FF(b,c,d,a,M15,22,0x49b40821)
2 m5 m6 a# C. J, ]$ r. W2 E. |第二轮 ( Y" {; F4 v) e4 C* p& M: j
GG(a,b,c,d,M1,5,0xf61e2562)
/ [( F1 Z1 n* q; c2 _$ F. fGG(d,a,b,c,M6,9,0xc040b340)
+ b6 M8 R; H! O' ^9 H! LGG(c,d,a,b,M11,14,0x265e5a51)
$ x* V/ a. u4 D! @7 IGG(b,c,d,a,M0,20,0xe9b6c7aa)
( G9 q4 `$ k. i" F! |' yGG(a,b,c,d,M5,5,0xd62f105d) * y% D( W1 Z& t# y6 o
GG(d,a,b,c,M10,9,0x02441453)
- c6 f5 n+ W/ e1 ^6 dGG(c,d,a,b,M15,14,0xd8a1e681) 7 W9 ]* U, U, e- G
GG(b,c,d,a,M4,20,0xe7d3fbc8) 2 T0 n7 ]" C' h( \: S$ W+ `
GG(a,b,c,d,M9,5,0x21e1cde6)
# k' y8 I* C; H# i! fGG(d,a,b,c,M14,9,0xc33707d6) ! T+ h: V' y4 W5 f9 ^
GG(c,d,a,b,M3,14,0xf4d50d87) ! U( a U2 M; M L
GG(b,c,d,a,M8,20,0x455a14ed)
6 j7 {4 h) z/ u0 `; kGG(a,b,c,d,M13,5,0xa9e3e905)
: j2 \- x, h2 h$ N5 u1 v1 VGG(d,a,b,c,M2,9,0xfcefa3f8)
3 P$ x l/ \( G' W1 K6 {GG(c,d,a,b,M7,14,0x676f02d9) $ p" W+ Q3 P5 m8 C# U
GG(b,c,d,a,M12,20,0x8d2a4c8a)
! `6 g3 D+ r" r% j0 L3 D第三轮
I e" @& K# l! ^% nHH(a,b,c,d,M5,4,0xfffa3942) + `. F/ F3 [0 Z4 X3 p
HH(d,a,b,c,M8,11,0x8771f681) % U: r: h8 A# s! o) x" I8 _$ j8 h& W
HH(c,d,a,b,M11,16,0x6d9d6122) : h3 G' A, @ a; p" U/ ?
HH(b,c,d,a,M14,23,0xfde5380c)
: k4 x& M M6 bHH(a,b,c,d,M1,4,0xa4beea44) : G$ Z* U) W) Q( v
HH(d,a,b,c,M4,11,0x4bdecfa9) ' ~* Q6 X' `3 n- @! Q+ k
HH(c,d,a,b,M7,16,0xf6bb4b60) ; W& A& T/ f2 [+ U+ p, H1 h
HH(b,c,d,a,M10,23,0xbebfbc70) 7 Y6 g% Q& i! }6 O& y: U
HH(a,b,c,d,M13,4,0x289b7ec6) ! q [7 V d- ~/ H- J; B5 f
HH(d,a,b,c,M0,11,0xeaa127fa)
9 H0 U; P- Z4 {) cHH(c,d,a,b,M3,16,0xd4ef3085) : c+ D, N: Q+ `
HH(b,c,d,a,M6,23,0x04881d05) 2 e; f5 ~, C5 v- E- i
HH(a,b,c,d,M9,4,0xd9d4d039)
# e' f: n5 L. b: ]3 k7 NHH(d,a,b,c,M12,11,0xe6db99e5)
6 U& f' T4 s! H) f8 v t' V3 \; PHH(c,d,a,b,M15,16,0x1fa27cf8)
7 k' \7 S1 t7 fHH(b,c,d,a,M2,23,0xc4ac5665) . ]2 ]( R- z+ ]# d1 A! `0 \# o
第四轮
: X9 a/ i5 n$ u. }2 dII(a,b,c,d,M0,6,0xf4292244) + b) \- E! }3 }6 r
II(d,a,b,c,M7,10,0x432aff97)
- n$ \: ~' L3 `8 CII(c,d,a,b,M14,15,0xab9423a7)
2 \* L2 m# S& W4 s" y( SII(b,c,d,a,M5,21,0xfc93a039) ( {& C; @: s; h" B
II(a,b,c,d,M12,6,0x655b59c3) # ?, g2 K( r: J1 y9 x7 j; D
II(d,a,b,c,M3,10,0x8f0ccc92) & C% w b0 p& L4 j5 j
II(c,d,a,b,M10,15,0xffeff47d)
+ A' n, i/ I% p. I0 eII(b,c,d,a,M1,21,0x85845dd1)
" f* T( o) b/ x* |II(a,b,c,d,M8,6,0x6fa87e4f)
* s4 {' e# r8 d% GII(d,a,b,c,M15,10,0xfe2ce6e0)
5 V9 [& F" m8 k$ o, F: v' @# wII(c,d,a,b,M6,15,0xa3014314) * o0 U5 [( t3 ~: x/ B" A/ n& b
II(b,c,d,a,M13,21,0x4e0811a1) * [5 a4 k }1 ]/ y9 l9 R
II(a,b,c,d,M4,6,0xf7537e82) 4 Q2 C# ~! t% b& l7 S+ M' v
II(d,a,b,c,M11,10,0xbd3af235) 7 c! L+ L$ x& e6 g+ A6 b( H0 S8 A
II(c,d,a,b,M2,15,0x2ad7d2bb)
2 d- w/ I) s3 V' ~II(b,c,d,a,M9,21,0xeb86d391)
( M; i7 j6 H+ |. l+ E0 T1 s常数ti可以如下选择:
' I1 v4 o, l$ b. x$ i在第i步中,ti是4294967296*abs(sin(i))的 |