[TABLE]
" t, i( }* }" T+ Z) Y : D) h A$ H. t" q+ h; R
5 x0 Y5 `5 V, M6 M: h5 D: O ) U, F- o$ y+ i( v3 x" R" w6 O
0 p' |$ N0 O+ X- ? C Q- m9 B ( A2 M% Q7 U2 T+ \( L; f
6 B0 `6 h# K- ~; Q - v8 E- h. F+ t
[TR]
( v4 _# s) [! M9 J1 W ! }. Z, n7 S' M4 ~7 X# K
" Q- T* p- {! S: |3 K$ y. {0 N * ~7 y, a$ f. [
[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 0 ` ~5 k4 Y# l" o2 ^, S
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
+ _; }( N/ W5 q2 c四个32位变量初始化为:
0 h; w8 e" ^2 z4 X+ C. ]% tA=0x01234567
( C& u- C5 B4 I! r! cB=0x89abcdef
) [& U# g2 m! k2 e) O0 R: ~9 J7 eC=0xfedcba98
|; p3 F2 y9 d. t/ RD=0x76543210 % \: c* J: A" p; @+ O
它们称为链接变量(chaining variable)
; n: `: O6 |/ `( _/ z2 {* }接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
( a# u5 t5 ]) Y/ a+ G8 u/ q) ^将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。
, @$ |4 }( S* |0 v2 V) \主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
* o% s/ B8 z, ]* O. k P1 E" e以一下是每次操作中用到的四个非线性函数(每轮一个)。 ' r) Z0 j* }( X4 w& q& E
F(X,Y,Z)=(X&Y)|((~X)&Z) / J! ?) t/ n% b6 [0 A
G(X,Y,Z)=(X&Z)|(Y&(~Z))
4 h; ^) r0 z3 D" h# T/ e! @1 JH(X,Y,Z)=X^Y^Z 6 ^( @2 q" u0 k7 e7 _
I(X,Y,Z)=Y^(X|(~Z)) / X5 i, x1 a7 L9 V% H# B; n
(&是与,|是或,~是非,^是异或) : h% G% r& E( s$ \
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 - E1 R% C# e9 y. \8 J2 i$ e
函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 ; ], q. X x. l( n' `
设Mj表示消息的第j个子分组(从0到15),<<8 r1 ]/ \" h7 q8 j' _
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<# Z W9 g- t9 P8 x- I
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<* j' T; ^) }. Y7 y* v" x
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<
3 g0 Z( f3 r, r# ~II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<1 `1 ?( W7 C! b% j
这四轮(64步)是:
' ?1 k6 [2 B+ a% W) D第一轮
5 ]2 m1 r5 p5 l# m2 u# BFF(a,b,c,d,M0,7,0xd76aa478) & }7 l. Z; r' Q4 a8 W. O" y
FF(d,a,b,c,M1,12,0xe8c7b756) , {* _3 G5 b7 I9 p% u" @
FF(c,d,a,b,M2,17,0x242070db)
; M" K( I9 D7 ^3 ?* zFF(b,c,d,a,M3,22,0xc1bdceee)
/ G, G7 I A9 x2 m! gFF(a,b,c,d,M4,7,0xf57c0faf) # O; B1 R. H- O
FF(d,a,b,c,M5,12,0x4787c62a) + Y$ U9 A5 f2 n: X
FF(c,d,a,b,M6,17,0xa8304613) 1 v! v) F, H( Y; A/ x) S% T* g% B
FF(b,c,d,a,M7,22,0xfd469501)
# b( Y2 ~* S: i8 I( u s3 PFF(a,b,c,d,M8,7,0x698098d8)
' |& v1 }' o/ O$ P( B! L# v; \& UFF(d,a,b,c,M9,12,0x8b44f7af)
8 P, N: x" H- t, r- ~) O; D$ t3 ?FF(c,d,a,b,M10,17,0xffff5bb1) 9 \2 @$ l5 H( J+ I+ n4 R5 {
FF(b,c,d,a,M11,22,0x895cd7be) ! u% q( [0 v( Y+ {( A
FF(a,b,c,d,M12,7,0x6b901122) ! d& E& q3 p8 W# s7 M7 j
FF(d,a,b,c,M13,12,0xfd987193)
& Q$ ?9 B, K; @FF(c,d,a,b,M14,17,0xa679438e)
: X) u3 r( \; }1 gFF(b,c,d,a,M15,22,0x49b40821) 5 X. n( {" T9 M. [' x$ }5 `
第二轮 ; l9 F" |5 z3 ^1 {
GG(a,b,c,d,M1,5,0xf61e2562)
' H }* o, e9 |# Y2 m0 R V' c YGG(d,a,b,c,M6,9,0xc040b340)
7 x- i) x# R5 ?/ y; _GG(c,d,a,b,M11,14,0x265e5a51) , ^7 i, ~% H8 M X" o/ C" R6 P
GG(b,c,d,a,M0,20,0xe9b6c7aa) ; d# _. Q& |: K y" s( k5 V% m
GG(a,b,c,d,M5,5,0xd62f105d)
& G0 M' L3 _! z( q6 }+ R. T; ?GG(d,a,b,c,M10,9,0x02441453) ; \* V% Q8 M$ t' {$ w; u4 z
GG(c,d,a,b,M15,14,0xd8a1e681)
/ k5 d. C) X/ k! J7 M$ V& iGG(b,c,d,a,M4,20,0xe7d3fbc8)
8 _$ c" F6 y1 ]$ U5 l$ @) JGG(a,b,c,d,M9,5,0x21e1cde6)
" y6 `' Y6 z% nGG(d,a,b,c,M14,9,0xc33707d6) 2 j& M) C: I2 G! g
GG(c,d,a,b,M3,14,0xf4d50d87) ; T. N! K, u9 K5 N
GG(b,c,d,a,M8,20,0x455a14ed) ' y" R# J- b( ]; s3 G
GG(a,b,c,d,M13,5,0xa9e3e905) " D1 o; N( X4 ?1 X8 K% Z
GG(d,a,b,c,M2,9,0xfcefa3f8) 7 r* N9 M- M1 a& f
GG(c,d,a,b,M7,14,0x676f02d9) ( {* e9 n$ k' K- E
GG(b,c,d,a,M12,20,0x8d2a4c8a) , d& @' y3 ~$ B' {. x5 y# M, m
第三轮 P% @# v& f4 `
HH(a,b,c,d,M5,4,0xfffa3942) " k. c- p( b& \* O& ^# S6 [: h
HH(d,a,b,c,M8,11,0x8771f681)
7 @& j* L E. THH(c,d,a,b,M11,16,0x6d9d6122) - {7 @, P5 B+ ?% A9 h) {
HH(b,c,d,a,M14,23,0xfde5380c)
+ T. A2 U- @" p8 X$ JHH(a,b,c,d,M1,4,0xa4beea44) % V, u k: U- N
HH(d,a,b,c,M4,11,0x4bdecfa9)
+ L3 I4 y: D+ V# ?2 L2 XHH(c,d,a,b,M7,16,0xf6bb4b60) ' U7 O$ b( Y/ y0 v
HH(b,c,d,a,M10,23,0xbebfbc70)
( P1 ]! e, a" Z; fHH(a,b,c,d,M13,4,0x289b7ec6)
; K' ~. ~+ ^/ D& b4 hHH(d,a,b,c,M0,11,0xeaa127fa) 3 n1 r+ i8 q: k: l9 w) z# [, `: W
HH(c,d,a,b,M3,16,0xd4ef3085)
- v& \1 U3 X1 u( J6 O; fHH(b,c,d,a,M6,23,0x04881d05) ) g/ k5 ?2 E$ ]. m4 A
HH(a,b,c,d,M9,4,0xd9d4d039)
- @5 s2 J, _6 n% p9 {HH(d,a,b,c,M12,11,0xe6db99e5) + `/ C4 @9 X* ]5 @5 B, [# e d
HH(c,d,a,b,M15,16,0x1fa27cf8)
8 U- o; ]% E K- A- W, L- tHH(b,c,d,a,M2,23,0xc4ac5665)
0 `: |+ F" {; s3 M第四轮 7 w2 Z9 C2 v# ~" M) F
II(a,b,c,d,M0,6,0xf4292244)
0 l" ~# ~+ `9 Q+ j" n2 kII(d,a,b,c,M7,10,0x432aff97) 0 K3 n: W$ i$ [1 `$ X
II(c,d,a,b,M14,15,0xab9423a7) ! s: k- t3 T2 b2 k6 p
II(b,c,d,a,M5,21,0xfc93a039) / p1 Y% x1 W- E2 e D' c8 i
II(a,b,c,d,M12,6,0x655b59c3) $ C3 D" r( K$ S! @" Y4 o
II(d,a,b,c,M3,10,0x8f0ccc92)
: b0 Q6 {5 {+ xII(c,d,a,b,M10,15,0xffeff47d)
8 H1 n9 c) n9 u$ A8 T2 fII(b,c,d,a,M1,21,0x85845dd1)
! f& g$ t9 ]& H8 X6 vII(a,b,c,d,M8,6,0x6fa87e4f) 0 x! j: f# {! }6 B" i8 e7 h8 V
II(d,a,b,c,M15,10,0xfe2ce6e0) $ f9 X7 v0 R# i5 p
II(c,d,a,b,M6,15,0xa3014314)
1 Z( Y; ?8 K% w$ f1 w! ?3 q0 k ZII(b,c,d,a,M13,21,0x4e0811a1)
$ w- B& [8 N) f1 _8 n7 [II(a,b,c,d,M4,6,0xf7537e82) 9 \: E$ I ?, V" R7 ^2 v
II(d,a,b,c,M11,10,0xbd3af235) , i/ |8 r2 d7 |
II(c,d,a,b,M2,15,0x2ad7d2bb) 5 M* L4 B8 A9 D; s7 m% J7 Z
II(b,c,d,a,M9,21,0xeb86d391)
0 L& p* {; d0 c: L4 |# z7 U V3 l常数ti可以如下选择: ' P( U5 j! R, p2 a: C/ Z7 d c
在第i步中,ti是4294967296*abs(sin(i))的 |