MD5算法分析

MD5算法分析


MD5算法的RFC网址:http://www.faqs.org/rfcs/rfc1321.html

word表示32-bit
byte表示8-bit

X_i表示Xi
X^i表示Xi

X<<<s表示左循环移位

not(X)表示~X
XvY表示X|Y
XY表示X&Y

假设有消息m,则b = m.getBytes().length * 8

if ((b % 512) >= 448) {
    padding (512 – b % 512 + 448) bits
} else if ((b % 512) < 448) {
    padding (448 – b % 512) bits
}
padding规则是一个1,n个0。使padding后的消息长度为448加上512的倍数。(0 <= n <= 512)

将b用64-bit表示,如果b > 264,则只取低64 bits,然后按照低位优先的原则将64 bits填充到上述结果后面,使的消息长度为512的倍数。该消息用M[0...N-1]表示。其中M[i]是一个word。

word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10

A = 0×67452301
B = 0xefcdab89
C = 0x98badcfe
D = 0×10325476

4个辅助函数
f(x,y,z) = (x & y) | ((~x) & z)
g(x,y,z) = (x & z) | (y & (~z))
h(x,y,z) = x ^ y ^ z
i(x,y,z) = y ^ (x | (~z))

表T[1...64],其中T[i] = 4294967296 * abs(sin(i))的整数部分,i的单位是弧度。

for (int i = 0; i < N % 16; i++) {
    for (int j = 0; j < 16; j++) {
        X[j] = M[i * 16 + j];
    }

    AA = A;
    BB = B;
    CC = c;
    DD = d;

    /* Round 1 */
    /*
     * Let [abcd k s i] denote the operation
     *   a = b + ((a + F(b, c, d) + X[k] + T[i]) <<< s.
    */
    [ABCD  0  7  1]  [DABC  1 12  2]  [CDAB  2 17  3]  [BCDA  3 22  4]
    [ABCD  4  7  5]  [DABC  5 12  6]  [CDAB  6 17  7]  [BCDA  7 22  8]
    [ABCD  8  7  9]  [DABC  9 12 10]  [CDAB 10 17 11]  [BCDA 11 22 12]
    [ABCD 12  7 13]  [DABC 13 12 14]  [CDAB 14 17 15]  [BCDA 15 22 16]

    /* Round 2 */
    /*
     * Let [abcd k s i] denote the operation
     *   a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s).
     */
    [ABCD  1  5 17]  [DABC  6  9 18]  [CDAB 11 14 19]  [BCDA  0 20 20]
    [ABCD  5  5 21]  [DABC 10  9 22]  [CDAB 15 14 23]  [BCDA  4 20 24]
    [ABCD  9  5 25]  [DABC 14  9 26]  [CDAB  3 14 27]  [BCDA  8 20 28]
    [ABCD 13  5 29]  [DABC  2  9 30]  [CDAB  7 14 31]  [BCDA 12 20 32]

    /* Round 3 */
    /*
     * Let [abcd k s i] denote the operation
     *   a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s.
     */
    [ABCD  5  4 33]  [DABC  8 11 34]  [CDAB 11 16 35]  [BCDA 14 23 36]
    [ABCD  1  4 37]  [DABC  4 11 38]  [CDAB  7 16 39]  [BCDA 10 23 40]
    [ABCD 13  4 41]  [DABC  0 11 42]  [CDAB  3 16 43]  [BCDA  6 23 44]
    [ABCD  9  4 45]  [DABC 12 11 46]  [CDAB 15 16 47]  [BCDA  2 23 48]

    /* Round 4 */
    /*
     * Let [abcd k s i] denote the operation
     *   a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s).
     */
    [ABCD  0  6 49]  [DABC  7 10 50]  [CDAB 14 15 51]  [BCDA  5 21 52]
    [ABCD 12  6 53]  [DABC  3 10 54]  [CDAB 10 15 55]  [BCDA  1 21 56]
    [ABCD  8  6 57]  [DABC 15 10 58]  [CDAB  6 15 59]  [BCDA 13 21 58]
    [ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64]

    /*
     * Then perform the following additions. (That is increment each
     * of the four registers by the value it had before this block
     * was started.)
     */
     A = A + AA
     B = B + BB
     C = C + CC
     D = D + DD
}

依照低位优先的原则输出A、B、C和D

测试数据
md5("") = d41d8cd98f00b204e9800998ecf8427e
md5("a") = 0cc175b9c0f1b6a831c399e269772661
md5("abc") = 900150983cd24fb0d6963f7d28e17f72
md5("message digest") = f96b697d7cb7938d525a2f31aaf161d0
md5("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
md5("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789") =
        d174ab98d277d9f5a5611c2c9f419d9f
md5("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =
        57edf4a22be3c955ac49da2e2107b67a

转自:http://sangua.com/md5-algorithm-description-and-the-realization-of-java.html 含java源码

你可能感兴趣的:(MD5,算法)