首先数据在内存中被解释成二进制数字,然后将整个二进制个数按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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。