![](https://csdnimg.cn/release/download_crawler_static/687230/bg1.jpg)
AI00 MD5 算法流程
1
MD5 算法流程
算法流程算法流程
算法流程
MD5 算法将输入的消息进行分组,每组 512 位(即 64 字节),顺序处理完所有组后输出 128 位结果,
将这 128 位用十六进制表示便得常见的 32 字符的 MD5 码,而所谓的 16 字符的 MD5 码,就是这 32 字符
中间的 16 个字符。
在每一组消息的处理中,都要进行 4 轮、每轮 16 步、总计 64 步的处理。其中每步计算中含一次左循
循循
循
环
环环
环移位,每一步结束时将计算结果进行一次右循环
循环循环
循环移位。详见下方流程(未优化)。
算法流程:
一. 初始化
a) 设置常数表 g_nTable[4][16],他有 64 个常量,对应每组处理的 4×16=64 步。由于是常量,也可
以在计算时直接嵌入数据。每个 g_nTable[i][j]通过公式 )1*16sin(*
32
++ ji 计算后取整得到。
这里 i∈[0,3],j∈[0,15],16*i+j+1 的单位为弧度,而非角度。
unsigned int g_nTable[4][16] = {
{ 0xD76AA478,0xE8C7B756,0x242070DB,0xC1BDCEEE,
0xF57C0FAF,0x4787C62A,0xA8304613,0xFD469501,
0x698098D8,0x8B44F7AF,0xFFFF5BB1,0x895CD7BE,
0x6B901122,0xFD987193,0xA679438E,0x49B40821 },
{ 0xF61E2562,0xC040B340,0x265E5A51,0xE9B6C7AA,
0xD62F105D,0x02441453,0xD8A1E681,0xE7D3FBC8,
0x21E1CDE6,0xC33707D6,0xF4D50D87,0x455A14ED,
0xA9E3E905,0xFCEFA3F8,0x676F02D9,0x8D2A4C8A },
{ 0xFFFA3942,0x8771F681,0x6D9D6122,0xFDE5380C,
0xA4BEEA44,0x4BDECFA9,0xF6BB4B60,0xBEBFBC70,
0x289B7EC6,0xEAA127FA,0xD4EF3085,0x04881D05,
0xD9D4D039,0xE6DB99E5,0x1FA27CF8,0xC4AC5665 },
{ 0xF4292244,0x432AFF97,0xAB9423A7,0xFC93A039,
0x655B59C3,0x8F0CCC92,0xFFEFF47D,0x85845DD1,
0x6FA87E4F,0xFE2CE6E0,0xA3014314,0x4E0811A1,
0xF7537E82,0xBD3AF235,0x2AD7D2BB,0xEB86D391 }};
b) 初始化每步左循环移位的位数 g_nMove[4][16],对应每轮处理的 4×16=64 步处理。由于是常量,
也可以在计算时直接嵌入数据。此数据有规律,可以只用 16 个。
int g_nMove[4][16] = {
{ 7,12,17,22, 7,12,17,22, 7,12,17,22, 7,12,17,22 },
{ 5, 9,14,20, 5, 9,14,20, 5, 9,14,20, 5, 9,14,20 },
{ 4,11,16,23, 4,11,16,23, 4,11,16,23, 4,11,16,23 },
{ 6,10,15,21, 6,10,15,21, 6,10,15,21, 6,10,15,21 }};
c) 初始化 g_nResult[4]。g_nResult 参与下一组消息的处理过程,同时存放该组计算结果,新的
g_nResult 又参与下一组消息的处理,直至最后一组计算结束,g_nResult 即为所需的 MD5 码。
g_nResult 数组成员应为 32 位长,这样总计 32×4=128 位。
unsigned int g_nResult[4] = { 0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476 };
二. 消息读取与填充
a) 将一段未处理消息(如文件内容)读取到缓冲区(如某一较大数组或动态申请的内存)中,最好
一次读取 64n 个字节,这样就是 n 组,方便处理。
b) 判断消息是否已经读完,没有则直接前往
三.分组处理进行计算,如果已经读完了就应该进行适