首先數據在內存中被解釋成二進制數字,然后將整個二進制個數按512取模,在取模后的結果后面填充二進制數(填充個數為0到512個)一個二進制值1,再填充二進制0直到補齊為448bit,就是說即使取模后正好為448bit,依然填充512bit的二進制值,值到再次達到448bit,然后將填充前的數據長度值表示為64bit的二進制數字,加在之前填充過的數據后面,使之bit位數正好為512的整數倍,如何填充前數據長度表示為二進制數超過64bit,則取低64bit填充在后面,至此,整個數據為512的整數倍。
數據為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