|
Message Digest - MD5 Algorithm
Part:
1
2
3
4
5
(Continued from previous part...)
Step 3. Initializing MD Buffer. MD5 algorithm requires a 128-bit buffer with a specific
initial value. The rules of initializing buffer are:
- The buffer is divided into 4 words (32 bits each), named as A, B, C, and D.
- Word A is initialized to: 0x67452301.
- Word B is initialized to: 0xEFCDAB89.
- Word C is initialized to: 0x98BADCFE.
- Word D is initialized to: 0x10325476.
Step 4. Processing Message in 512-bit Blocks. This is the main step of MD 5 algorithm, which
loops through the padded and appended message in blocks of 512 bits each. For each input block,
4 rounds of operations are performed with 16 operations in each round. This step can be
described in the following pseudo code slightly modified from the RFC 1321's version:
Input and predefined functions:
A, B, C, D: initialized buffer words
F(X,Y,Z) = (X AND Y ) OR (NOT X AND Z)
G(X,Y,Z) = (X AND Z ) OR (Y AND NOT Z)
H(X,Y,Z) = X XOR Y XOR Z
I(X,Y,Z) = Y XOR (X OR NOT Z)
T[1, 2, ..., 64]: Array of special constants (32-bit integers) as:
T[i] = int(abs(sin(i)) * 2**32)
M[1, 2, ..., N]: Blocks of the padded and appended message
R1(a,b,c,d,X,s,i): Round 1 operation defined as:
a = b + ((a + F(b,c,d) + X + T[i]) <<< s)
R2(a,b,c,d,X,s,i): Round 1 operation defined as:
a = b + ((a + G(b,c,d) + X + T[i]) <<< s)
R3(a,b,c,d,X,s,i): Round 1 operation defined as:
a = b + ((a + H(b,c,d) + X + T[i]) <<< s)
R4(a,b,c,d,X,s,i): Round 1 operation defined as:
a = b + ((a + I(b,c,d) + X + T[i]) <<< s)
Algorithm:
For k = 1 to N do the following
AA = A
BB = B
CC = C
DD = D
(X[0], X[1], ..., X[15]) = M[k] /* Divide M[k] into 16 words */
/* Round 1. Do 16 operations. */
R1(A,B,C,D,X[ 0], 7, 1)
R1(D,A,B,C,X[ 1],12, 2)
R1(C,D,A,B,X[ 2],17, 3)
R1(B,C,D,A,X[ 3],22, 4)
R1(A,B,C,D,X[ 4], 7, 5)
R1(D,A,B,C,X[ 5],12, 6)
R1(C,D,A,B,X[ 6],17, 7)
R1(B,C,D,A,X[ 7],22, 8)
R1(A,B,C,D,X[ 8], 7, 9)
R1(D,A,B,C,X[ 9],12,10)
R1(C,D,A,B,X[10],17,11)
R1(B,C,D,A,X[11],22,12)
R1(A,B,C,D,X[12], 7,13)
R1(D,A,B,C,X[13],12,14)
R1(C,D,A,B,X[14],17,15)
R1(B,C,D,A,X[15],22,16)
/* Round 2. Do 16 operations. */
R2(A,B,C,D,X[ 1], 5,17)
R2(D,A,B,C,X[ 6], 9,18)
R2(C,D,A,B,X[11],14,19)
R2(B,C,D,A,X[ 0],20,20)
R2(A,B,C,D,X[ 5], 5,21)
R2(D,A,B,C,X[10], 9,22)
R2(C,D,A,B,X[15],14,23)
R2(B,C,D,A,X[ 4],20,24)
R2(A,B,C,D,X[ 9], 5,25)
R2(D,A,B,C,X[14], 9,26)
R2(C,D,A,B,X[ 3],14,27)
R2(B,C,D,A,X[ 8],20,28)
R2(A,B,C,D,X[13], 5,29)
R2(D,A,B,C,X[ 2], 9,30)
R2(C,D,A,B,X[ 7],14,31)
R2(B,C,D,A,X[12],20,32)
/* Round 3. Do 16 operations. */
R3(A,B,C,D,X[ 5], 4,33)
R3(D,A,B,C,X[ 8],11,34)
R3(C,D,A,B,X[11],16,35)
R3(B,C,D,A,X[14],23,36)
R3(A,B,C,D,X[ 1], 4,37)
R3(D,A,B,C,X[ 4],11,38)
R3(C,D,A,B,X[ 7],16,39)
R3(B,C,D,A,X[10],23,40)
R3(A,B,C,D,X[13], 4,41)
R3(D,A,B,C,X[ 0],11,42)
R3(C,D,A,B,X[ 3],16,43)
R3(B,C,D,A,X[ 6],23,44)
R3(A,B,C,D,X[ 9], 4,45)
R3(D,A,B,C,X[12],11,46)
R3(C,D,A,B,X[15],16,47)
R3(B,C,D,A,X[ 2],23,48)
/* Round 4. Do 16 operations. */
R4(A,B,C,D,X[ 0], 6,49)
R4(D,A,B,C,X[ 7],10,50)
R4(C,D,A,B,X[14],15,51)
R4(B,C,D,A,X[ 5],21,52)
R4(A,B,C,D,X[12], 6,53)
R4(D,A,B,C,X[ 3],10,54)
R4(C,D,A,B,X[10],15,55)
R4(B,C,D,A,X[ 1],21,56)
R4(A,B,C,D,X[ 8], 6,57)
R4(D,A,B,C,X[15],10,58)
R4(C,D,A,B,X[ 6],15,59)
R4(B,C,D,A,X[13],21,60)
R4(A,B,C,D,X[ 4], 6,61)
R4(D,A,B,C,X[11],10,62)
R4(C,D,A,B,X[ 2],15,63)
R4(B,C,D,A,X[ 9],21,64)
A = A + AA
B = B + BB
C = C + CC
D = D + DD
End of for loop
Output:
A, B, C, D: Message digest
(Continued on next part...)
Part:
1
2
3
4
5
|