MD5算法加密的过程( 二 )


举个例子:66
MD5算法加密的过程文章插图
2、 补充数据长度
将输入信息b用64位表示并添加到填充的数据之后 , 如果b大于2^64的话 , 则只取低64位 。
至此 , 我们的处理结果刚好是512的倍数 , 等效的 , 也是16字的倍数 , 我们用M[0...N-1]来表示这个结果 , 其中N是16的倍数 。
MD5算法加密的过程文章插图
3、 初始化MD缓冲区
用一个四字的缓冲区(A,B,C,D)来计算消息摘要 , 这里的A , B , C , D每一个都是一个32位的寄存器 。 这些寄存器的初始值如下 , 用16进制表示的 , 低位字节优先 。
word A: 01 23 45 67word B: 89 ab dc edword C: fe dc ba 98word D: 76 54 32 104、 处理消息
我们首先需要定义四个辅助函数 。
F(X,Y,Z) = XY v not(X) ZG(X,Y,Z) = XZ v Y not(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X v not(Z))对于函数F来说 , 在每一位上F函数就像是一个选择器:if X then Y else Z 。
【MD5算法加密的过程】这一步需要一个64长度的表格T[1...64],由sin函数构造而成 。 T[i]是4294967296次运行abs(sin(i))的结果 , 以此类推即可 。
我们需要进行一下处理
/* 处理原数据. */For i = 0 to N/16-1 do/* 将数据赋值给X. */For j = 0 to 15 doSet X[j] to M[i*16+j].end /* 结束对j的循环 *//* 把A保存位AA B保存为BB C保存为CC D保存位DD */AA = ABB = BCC = CDD = 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 + AAB = B + BBC = C + CCD = D + DDend /* 结束对i的循环 */5、 输出
上一步输出最终的结果A , B , C , D 。 我们从A的低位字节开 , 到D的高位字节结束 , 每一个都是32位 , 最终拼接的结果就是4*32 = 128位 , 这就是MD5结算的结果 。