您好,登錄后才能下訂單哦!
首先數據在內存中被解釋成二進制數字,然后將整個二進制個數按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])<<<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]
//第二輪運算
//[abcd k s i]表示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]
//第三輪運算
//[abcd k s t]表示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]
//第四輪運算
//[abcd k s t]表示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 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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。