千家信息网

md5 详解

发表于:2024-10-21 作者:千家信息网编辑
千家信息网最后更新 2024年10月21日,首先数据在内存中被解释成二进制数字,然后将整个二进制个数按512取模,在取模后的结果后面填充二进制数(填充个数为0到512个)一个二进制值1,再填充二进制0直到补齐为448bit,就是说即使取模后正好
千家信息网最后更新 2024年10月21日md5 详解


首先数据在内存中被解释成二进制数字,然后将整个二进制个数按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



0