MD5详解

首先数据在内存中被解释成二进制数字,然后将整个二进制个数按512取模,在取模后的结果后面填充二进制数(填充个数为0到512个)一个二进制值1,再填充二进制0直到补齐为448bit,就是说即使取模后正好为448bit,依然填充512bit的二进制值,值到再次达到448bit,然后将填充前的数据长度值表示为64bit的二进制数字,加在之前填充过的数据后面,使之bit位数正好为512的整数倍,如何填充前数据长度表示为二进制数超过64bit,则取低64bit填充在后面,至此,整个数据为512的整数倍。

01300000165488122544360167982

数据为512整数倍,也为16的整数倍,M数组M[0,1…N-1]表示目的数据,即要加密的原始数据,然后,四个32bit的初始数据被用来计算md5值,表示为16进制分别为

A:01 23 45 67

B:89 ab cd ef

C:fe dc ba 98

D:76 54 32 10

然后用到四个辅助函数,处理的数据均为32bit二进制数:

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) )

这里还用到了一个有64个元素的表格T[1…….64],T[i] 表示表格中第i个元素,每个元素都是既定的,相当于数字4294967296* abs(sin(i))的整数部分(其中i为弧度值,都是给定的)。

//N表示总共32bit的数据块数

//运算要循环N/16次

然后每512bit(即16word)数据依次作如下运算(i表示16个word):

第一个512bit到最后一个512bit循环运算               // for(int i=0;i<=N/16-1;i++)

将16-word数据拷贝到一维数组X中

将数组X中的数据X[j](0<=j<=15)拷贝到数组M中对应位置M[i*16+j]

//将初始数据保存

AA=A

BB=B

CC=C

DD=D

//第一轮运算

//[abcd k s i] 表示a=b+((a+F(b,c,d)+X[k]+T[i])<<

//做以下十六个运算

[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]

//第二轮运算

//[abcd k s i]表示a=b+((a+G(b,c,d)+X[k]+T[i]<<

//做以下十六个运算

[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]

//第三轮运算

//[abcd k s t]表示a=b+((a+H(b,c,d)+X[k]+T[i])<<

//做以下十六个运算

[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]

//第四轮运算

//[abcd k s t]表示a=b+((a+I(b,c,d)+X[k]+T[i])<<

//做以下十六个运算

[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 60]

[ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64]

//然后做如下运算

A=A+AA

B=B+BB

C=C+CC

D=D+DD

循环结束后将A,B C ,D按顺序串连起来以十六进制的形式表示出来即为HASH值。

备注:附上从第一轮到第四轮中对应位置T[i]的值:

第一轮中:

[0xd76aa478]        [0xe8c7b756]        [0x242070db]        [0xc1bdceee]

[0xf57c0faf]           [0x4787c62a]        [0xa8304613]        [0xfd469501]

[0x698098d8]        [0x8b44f7af]        [0xffff5bb1]              [0x895cd7be]

[0x6b901122]        [0xfd987193]        [0xa679438e]        [0x49b40821]

第二轮中:

[0xf61e2562]        [0xc040b340]        [0x265e5a51]        [0xe9b6c7aa]

[0xd62f105d]        [0x2441453]          [0xd8a1e681]        [0xe7d3fbc8]

[0x21e1cde6]        [0xc33707d6]        [0xf4d50d87]        [0x455a14ed]

[0xa9e3e905]        [0xfcefa3f8]            [0x676f02d9]        [0x8d2a4c8a]

第三轮中:

[0xfffa3942]        [0x8771f681]            [0x6d9d6122]        [0xfde5380c]

[0xa4beea44]        [0x4bdecfa9]           [0xf6bb4b60]        [0xbebfbc70]

[0x289b7ec6]        [0xeaa127fa]           [0xd4ef3085]        [0x4881d05]

[0xd9d4d039]        [0xe6db99e5]        [0x1fa27cf8]            [0xca4c5665]

第四轮中:

[0xf4292244]        [0x432aff97]        [0xab9423a7]            [0xfc93a039]

[0x655b59c3]        [0x8f0ccc92]        [0xffeff47d]               [0x85845dd1]

[0x6fa87e4f]         [0xfe2ce6e0]        [0xa3014314]            [0x4e0811a1]

[0xf7537e82]        [0xbd3af235]        [0x2ad7d2bb]            [0xeb86d391]

原始文档地址:https://tools.ietf.org/html/rfc1321

文章来源:一副眼镜 的BLOG http://blocks.blog.51cto.com/9909371/1626141

 

发表评论

邮箱地址不会被公开。 必填项已用*标注