[TABLE]
) g4 g3 M. g: T2 Q' {% d. W 3 K! _1 f F' b% X2 |. {
- m5 ?$ G& W p% p
6 i6 [; U% m& |0 G4 W$ d. ` * d% ~& J: {6 r# a
' c5 l& w$ I6 W- d( m& M/ L
- Y0 P; i: J! }( l
' E' {' Q( P3 i
[TR]
$ ^ k5 l" L- c' a- V6 u
+ ?9 _7 Y/ F5 ? B Z; B " a- W- [5 {" u9 v W) U
% G% P8 g, Y+ W) ][TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
0 ~; V" V- A" I' ~) Z, S' Y首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 / _! ^1 m1 U0 V7 ]
四个32位变量初始化为: . P% T5 o R2 @; g; i0 T
A=0x01234567
; Q1 O# B, q- b7 A% q/ s6 PB=0x89abcdef
W; L4 L2 H7 v2 Q' t) xC=0xfedcba98 $ x1 u) Z, v9 B1 y( [2 x
D=0x76543210
6 _) j" X3 q* g- c# f4 H它们称为链接变量(chaining variable) 4 Q7 @5 G1 W9 _, O# u2 a/ u
接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 # g3 L+ i& c t+ \/ e" X9 t0 {0 ^8 w
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。
! T. k7 G! r" t2 M2 Y主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。 & I7 g' l+ }) H5 B7 T- }
以一下是每次操作中用到的四个非线性函数(每轮一个)。 & f- W9 b5 y9 ^; S7 k7 m6 s$ u( [
F(X,Y,Z)=(X&Y)|((~X)&Z) 7 G$ g2 e; q, B" u7 o6 E
G(X,Y,Z)=(X&Z)|(Y&(~Z)) , {/ I8 ?% J! J& b
H(X,Y,Z)=X^Y^Z 7 t# F5 f3 s: n- A+ p% O/ C
I(X,Y,Z)=Y^(X|(~Z)) 9 V) A/ a% P) q3 K7 |
(&是与,|是或,~是非,^是异或)
$ ^) `4 t6 k X/ {1 ~$ A这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
: L4 k' B# k. S' [! i+ v函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
- g. `# c+ J' g9 R+ f% j7 |设Mj表示消息的第j个子分组(从0到15),<<
8 S! u( n6 H# j `/ w2 tFF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<; _) H6 T* f3 d
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<. S) ?# y. {7 O, V( @2 |' E9 ?3 s5 U
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<0 D. f4 ?6 l/ ^8 {9 S& k$ ^( v
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
; S5 h# X9 z5 k* O$ s% i2 s这四轮(64步)是:
/ G" N* r' K8 g& `- X& B第一轮 ; O9 {6 x, B( d/ h, W) l
FF(a,b,c,d,M0,7,0xd76aa478) 6 @0 H5 H3 S2 q2 |5 E3 R6 |
FF(d,a,b,c,M1,12,0xe8c7b756) ) {2 I8 R9 Z& a4 d& b
FF(c,d,a,b,M2,17,0x242070db) 5 u, K8 j; o8 V: Z, F9 `' X
FF(b,c,d,a,M3,22,0xc1bdceee)
( {0 }0 J3 _1 _# O6 O0 U% h6 q hFF(a,b,c,d,M4,7,0xf57c0faf) ) ~% m$ g: `/ v) j2 {% N" N1 O ~! q
FF(d,a,b,c,M5,12,0x4787c62a) $ f/ i& y/ Z9 R4 L9 V9 j' L! x0 v, L
FF(c,d,a,b,M6,17,0xa8304613)
0 F* p( S/ \* I' J3 l, lFF(b,c,d,a,M7,22,0xfd469501)
& ]1 U6 o. E1 e& b. Z. UFF(a,b,c,d,M8,7,0x698098d8)
$ T" R4 J! v2 }1 r1 E( l1 MFF(d,a,b,c,M9,12,0x8b44f7af)
8 b/ Y Y8 ^4 k# ^7 R vFF(c,d,a,b,M10,17,0xffff5bb1) ( |" u4 C: R: J/ A2 M5 O
FF(b,c,d,a,M11,22,0x895cd7be) * j" k0 [0 i' A/ f9 |' j( e
FF(a,b,c,d,M12,7,0x6b901122)
& } ?3 h' E2 O k9 x/ oFF(d,a,b,c,M13,12,0xfd987193)
, x* @% m4 j8 o! r3 l2 Y" vFF(c,d,a,b,M14,17,0xa679438e) ! Z3 }, z" L) |; y+ L |7 d
FF(b,c,d,a,M15,22,0x49b40821)
( u; U( h; s/ ]2 ?& K" t, Z. P第二轮 8 [5 N1 E& n* p g: U# M$ E: O
GG(a,b,c,d,M1,5,0xf61e2562)
) f3 a# V0 U7 y; W7 t, J+ D' A' l$ fGG(d,a,b,c,M6,9,0xc040b340) & y- t$ i; x: A, U
GG(c,d,a,b,M11,14,0x265e5a51) / m5 F9 q& y! n, k# S0 d
GG(b,c,d,a,M0,20,0xe9b6c7aa) ) b+ N/ A3 t# H/ }9 \8 `6 c
GG(a,b,c,d,M5,5,0xd62f105d)
9 T9 ]- q" _* u( g' X% G: `GG(d,a,b,c,M10,9,0x02441453) 3 `% A: @0 m( x# V
GG(c,d,a,b,M15,14,0xd8a1e681)
7 k; y$ W0 h- cGG(b,c,d,a,M4,20,0xe7d3fbc8) : F, \) e! h) @+ k& m8 K
GG(a,b,c,d,M9,5,0x21e1cde6) " z3 P9 e0 e! M
GG(d,a,b,c,M14,9,0xc33707d6) * y- M8 ?! M- _& h, J
GG(c,d,a,b,M3,14,0xf4d50d87)
: F( q& H* R8 x! VGG(b,c,d,a,M8,20,0x455a14ed) $ I. u3 h6 E% A% G
GG(a,b,c,d,M13,5,0xa9e3e905)
9 q# B" }$ A% j# A2 P( V3 J' F4 MGG(d,a,b,c,M2,9,0xfcefa3f8)
7 P* y2 N$ C. a1 i0 a2 }GG(c,d,a,b,M7,14,0x676f02d9) ' Q9 [/ o; c6 |" M! g4 ~. N, d
GG(b,c,d,a,M12,20,0x8d2a4c8a)
5 b* A7 X5 Q5 D3 q, p5 o( t4 c/ R, R第三轮 ' ?4 w* E! V& u# i5 M
HH(a,b,c,d,M5,4,0xfffa3942)
8 i( Z, b, a* F, ~" m6 a, B! E6 t2 CHH(d,a,b,c,M8,11,0x8771f681) 3 G, i3 z, r: }4 y- y
HH(c,d,a,b,M11,16,0x6d9d6122) $ h& ~- p5 {) i, a* y
HH(b,c,d,a,M14,23,0xfde5380c)
" s# A1 t( d6 t( ^- fHH(a,b,c,d,M1,4,0xa4beea44) j+ _( h; `4 r" P4 Q
HH(d,a,b,c,M4,11,0x4bdecfa9)
. M# e( ^- H% q4 j6 HHH(c,d,a,b,M7,16,0xf6bb4b60)
. A& W6 K5 d3 `5 C, y9 gHH(b,c,d,a,M10,23,0xbebfbc70) 7 @& t, d, H8 J# p, G8 @+ M' ?
HH(a,b,c,d,M13,4,0x289b7ec6) % i4 c' r- R9 h
HH(d,a,b,c,M0,11,0xeaa127fa) Y3 ~+ y8 Z" u! r2 f) U( q
HH(c,d,a,b,M3,16,0xd4ef3085) 0 y3 U1 K" _5 w7 s& _
HH(b,c,d,a,M6,23,0x04881d05) ' C/ t+ \( i8 [+ w3 H* U3 c1 T' {' V
HH(a,b,c,d,M9,4,0xd9d4d039) 5 I. K% B k9 J+ t
HH(d,a,b,c,M12,11,0xe6db99e5)
9 a' D2 ~* U2 x" S2 Z3 n# u* D) sHH(c,d,a,b,M15,16,0x1fa27cf8)
w y5 }( {+ ^4 ]3 M5 r$ p% J. Z+ uHH(b,c,d,a,M2,23,0xc4ac5665) % {5 B5 X" f! `4 k1 |
第四轮
~+ T+ L5 m# }3 _II(a,b,c,d,M0,6,0xf4292244) $ g9 n" g4 p. r8 n. U
II(d,a,b,c,M7,10,0x432aff97) * F% _0 r" `. M
II(c,d,a,b,M14,15,0xab9423a7)
4 n0 a- \ U9 `+ B1 mII(b,c,d,a,M5,21,0xfc93a039) 0 f1 l- A ~- p5 O/ W1 s' J- |
II(a,b,c,d,M12,6,0x655b59c3)
7 \8 d, A0 k9 z; q* D; JII(d,a,b,c,M3,10,0x8f0ccc92)
h# m% T$ ]9 LII(c,d,a,b,M10,15,0xffeff47d)
( r4 w% x) |" d% k6 NII(b,c,d,a,M1,21,0x85845dd1) 3 {5 \- o! W" u3 n6 n, h0 z$ {
II(a,b,c,d,M8,6,0x6fa87e4f) ' ~2 ~0 d# E1 H2 Z
II(d,a,b,c,M15,10,0xfe2ce6e0)
" \$ K% C" e' d8 V5 H2 ^) PII(c,d,a,b,M6,15,0xa3014314)
1 M) l$ Z- H4 @' z K7 q! e& @II(b,c,d,a,M13,21,0x4e0811a1) ; I% n3 p0 E: ]3 I7 S8 \5 Y% P( f
II(a,b,c,d,M4,6,0xf7537e82)
) H+ Y. C- Q( L$ SII(d,a,b,c,M11,10,0xbd3af235)
) h4 z& c7 b7 III(c,d,a,b,M2,15,0x2ad7d2bb)
& M+ K" k7 j/ X" Y1 D9 P8 b' wII(b,c,d,a,M9,21,0xeb86d391) & V% [2 y& c& T5 i; r
常数ti可以如下选择:
Z, ?$ |" J7 o+ n! u2 z* U在第i步中,ti是4294967296*abs(sin(i))的 |