[TABLE]
( O$ Q h, J7 |/ ^! z I9 c1 w( u ^& x* {
% p2 m" Y" L8 q& ?% k) h' j/ e" S
, [) F. j* [% q: d! A- E( N 2 s) p) k) o6 \! K* G
" k8 b6 s& ?& q
\/ B8 q/ A/ p R+ ^
. x9 u% |" X4 Z[TR] 4 D- ?2 w4 X) b6 \
/ Q6 `3 I3 c; @" n, F; V
) I# X% W# v0 m" V/ n3 ], C8 f
. I" p Q, P$ d- W[TD]在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
2 L9 Y) M$ d! [' T$ H& Q首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
9 ~ \8 f/ a6 F* ]四个32位变量初始化为: K$ g9 D. U- M1 k% a" q2 B
A=0x01234567 , f/ P, @$ O3 m( {3 Q
B=0x89abcdef
* n3 A% T. e# q3 G' e# y/ EC=0xfedcba98 0 n9 y/ |; ?0 Q# z0 t' I
D=0x76543210 . R, E( [& i( _* r6 h) s5 X( S
它们称为链接变量(chaining variable)
6 [& P- }+ _6 a3 E! a" w5 s接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 # t3 a; E: Q4 M( T, J
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。
: X+ d1 M. x8 v( s主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
9 j7 I6 C7 ]( C V J% R以一下是每次操作中用到的四个非线性函数(每轮一个)。
# q" b# [ M7 QF(X,Y,Z)=(X&Y)|((~X)&Z)
% E, n& _0 F7 ^G(X,Y,Z)=(X&Z)|(Y&(~Z))
0 x) h: j: X: Z1 V- mH(X,Y,Z)=X^Y^Z
4 s/ Q$ J1 I) B9 M0 E6 L% Q, B- DI(X,Y,Z)=Y^(X|(~Z))
4 Z0 S/ Y7 C4 U" e7 P(&是与,|是或,~是非,^是异或) # l+ d: R9 h# S' D; } T1 Y
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 ) J2 g. N+ F7 o; l5 ^& h' S
函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 0 f" t8 @7 l$ r K) l
设Mj表示消息的第j个子分组(从0到15),<<6 s; E/ J- v. f
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<& r Y1 w/ `: ^* j
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<
5 H. D+ Z9 K! cHH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<# F ]' l D7 ?
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
6 x+ d8 q: t0 D: d" I这四轮(64步)是:
T5 b/ o# y8 _7 y/ l/ _第一轮
! g" f" e, K" gFF(a,b,c,d,M0,7,0xd76aa478)
. \) T# v* Z7 J" U, p, a/ S0 fFF(d,a,b,c,M1,12,0xe8c7b756)
, Y* s& O# I- r* c0 k; M$ f1 ?FF(c,d,a,b,M2,17,0x242070db)
w% F! v% P9 P9 R* u, Z6 U- S% i# {$ NFF(b,c,d,a,M3,22,0xc1bdceee) 4 H, q5 Q% f- w3 N9 t' D! @) A' G
FF(a,b,c,d,M4,7,0xf57c0faf)
; [* `! Q- e0 y. e! x8 J* cFF(d,a,b,c,M5,12,0x4787c62a)
" d1 R( K/ k1 `7 y' VFF(c,d,a,b,M6,17,0xa8304613)
+ T5 _) m- M8 I: r7 IFF(b,c,d,a,M7,22,0xfd469501) 3 v: [; K) k6 w
FF(a,b,c,d,M8,7,0x698098d8) . J. y( v. i* E& w- d/ k
FF(d,a,b,c,M9,12,0x8b44f7af)
2 X9 s2 k. i0 E1 n- l6 ^0 B. n0 PFF(c,d,a,b,M10,17,0xffff5bb1) , l4 g8 `0 j( k0 w2 ^
FF(b,c,d,a,M11,22,0x895cd7be)
1 d: d" U& n% V* ]8 FFF(a,b,c,d,M12,7,0x6b901122)
, {8 y- J0 q: ^* b/ C% s8 i+ JFF(d,a,b,c,M13,12,0xfd987193) ) E( A( d6 v, d
FF(c,d,a,b,M14,17,0xa679438e)
L. B4 ~4 J& |$ q: dFF(b,c,d,a,M15,22,0x49b40821)
. e& W# _% G" W, l& Y5 i第二轮 ) ?8 j/ |1 e* e& Q, t
GG(a,b,c,d,M1,5,0xf61e2562) p, M& Q& w# z3 L! d) X! b
GG(d,a,b,c,M6,9,0xc040b340) ) \+ x2 g- M; z( R, R6 {
GG(c,d,a,b,M11,14,0x265e5a51) 6 m! v8 `. ~( Q2 l% R) Z
GG(b,c,d,a,M0,20,0xe9b6c7aa) - }) s" [) r8 D/ u4 {
GG(a,b,c,d,M5,5,0xd62f105d) 5 c, w2 @! c8 V7 a& w
GG(d,a,b,c,M10,9,0x02441453)
, ]: F% S1 K/ w4 o% {3 ?GG(c,d,a,b,M15,14,0xd8a1e681) 5 A) M% `4 A; w/ c
GG(b,c,d,a,M4,20,0xe7d3fbc8)
. \% s" J5 p+ ~' N6 K! H& kGG(a,b,c,d,M9,5,0x21e1cde6)
) R! {2 @, h( q3 N& DGG(d,a,b,c,M14,9,0xc33707d6)
3 |# e3 b1 k* R$ R4 MGG(c,d,a,b,M3,14,0xf4d50d87) 6 t+ T' O" t" z$ E" i: P7 h& T2 \! ?
GG(b,c,d,a,M8,20,0x455a14ed) # }7 b; E! n% A* t% F0 G
GG(a,b,c,d,M13,5,0xa9e3e905) " Y. o* d# n- B
GG(d,a,b,c,M2,9,0xfcefa3f8)
5 h7 a* g: j+ ^* r* yGG(c,d,a,b,M7,14,0x676f02d9)
7 _! S5 P# Q! x- h8 B$ ]/ jGG(b,c,d,a,M12,20,0x8d2a4c8a)
+ g4 P3 c6 x* s3 a v7 v第三轮
) p- p1 |2 d! {; ~4 zHH(a,b,c,d,M5,4,0xfffa3942)
@0 h3 {$ }; w: ~% t8 w$ BHH(d,a,b,c,M8,11,0x8771f681) 3 F* V5 X! L _
HH(c,d,a,b,M11,16,0x6d9d6122) : m# H. n* X* ]3 g t
HH(b,c,d,a,M14,23,0xfde5380c) 3 l: p G9 W) G8 h% w& K
HH(a,b,c,d,M1,4,0xa4beea44)
: J6 I* v) b) O k! f6 U- R- M# jHH(d,a,b,c,M4,11,0x4bdecfa9) , \! V, C4 b4 A. i4 T* M8 O
HH(c,d,a,b,M7,16,0xf6bb4b60) 8 X) E6 f- B3 [* v; I2 v- F5 W
HH(b,c,d,a,M10,23,0xbebfbc70) 5 w& v, R* `/ O; ^3 ^- L
HH(a,b,c,d,M13,4,0x289b7ec6) 8 g" L @: e8 b `+ b/ T8 K
HH(d,a,b,c,M0,11,0xeaa127fa) 9 p3 |% W) b1 S7 a
HH(c,d,a,b,M3,16,0xd4ef3085)
, a$ t/ _" [/ j8 p8 aHH(b,c,d,a,M6,23,0x04881d05)
6 W5 Y& M# X7 Z! LHH(a,b,c,d,M9,4,0xd9d4d039)
3 G% E% A g8 Y; b' {: E" kHH(d,a,b,c,M12,11,0xe6db99e5)
. p7 L6 [7 \3 k# FHH(c,d,a,b,M15,16,0x1fa27cf8) . |# l- |# x0 k% `
HH(b,c,d,a,M2,23,0xc4ac5665) ( S$ F* d$ D' |9 h
第四轮 8 @- [7 S4 S" z1 Y2 \, J1 V! P
II(a,b,c,d,M0,6,0xf4292244)
: l# R9 l/ k( f. FII(d,a,b,c,M7,10,0x432aff97) ( J7 r$ O( u6 c: V9 E& m) _# Q c
II(c,d,a,b,M14,15,0xab9423a7) , ~4 e5 \* F b+ q$ [
II(b,c,d,a,M5,21,0xfc93a039) , \& v( o5 j$ L5 r# N4 A; o7 U+ E
II(a,b,c,d,M12,6,0x655b59c3) / G; C; j h3 g/ A0 X" ]$ R
II(d,a,b,c,M3,10,0x8f0ccc92)
+ @$ P3 V4 V. v/ K- |II(c,d,a,b,M10,15,0xffeff47d)
" g1 S" r! p: }8 @II(b,c,d,a,M1,21,0x85845dd1) , `/ N" c3 Y9 c+ x$ m( l: h
II(a,b,c,d,M8,6,0x6fa87e4f) % A/ k2 F* y1 ~0 _% L# X/ l
II(d,a,b,c,M15,10,0xfe2ce6e0)
+ F$ |: x0 R& k+ _II(c,d,a,b,M6,15,0xa3014314) 7 M) Q! g! H9 ^
II(b,c,d,a,M13,21,0x4e0811a1)
/ R5 h! U6 V% x Z! i$ _9 III(a,b,c,d,M4,6,0xf7537e82) 1 ~7 ~/ H: M% Q |; o; y, @( x
II(d,a,b,c,M11,10,0xbd3af235) 1 }" U% R6 `! `' @6 J8 x' M5 |
II(c,d,a,b,M2,15,0x2ad7d2bb) ) J- C" Z/ C8 ~6 r- _2 R M
II(b,c,d,a,M9,21,0xeb86d391) : m3 |( g$ ~9 e
常数ti可以如下选择:
+ K% V6 ]8 L8 @/ g在第i步中,ti是4294967296*abs(sin(i))的 |