MD5算法是如何工作的?
计算消息摘要的过程如下:
步骤1 - 追加填充位 - 消息以某种方式继续或填充,使其总长度(以比特为单位)对512取模的结果为448。即使消息的长度(以比特为单位)最初对512取模的结果为448,此操作也会持续执行。448 + 64 = 512,因此消息的填充方式使其长度现在比512的整数倍少64位。
步骤2 - 追加长度 - 将原始消息M的长度(以比特为单位,在插入填充位之前)的64位描述添加到步骤1的结果中。如果原始消息的长度大于264 = 184 467 440 73 709 551 616,则仅使用消息M长度的低64位。
因此,该字段包含原始消息M对264取模的结果。这些位作为两个32位字添加,并先添加低位(最低有效位)字。步骤1和步骤2的结果是一条消息,其长度(以比特为单位)是512位的整数倍。
步骤3 - 初始化MD缓冲区 - 一个128位的缓冲区可用于保存MD5哈希算法的中间结果和最终结果。一个四字缓冲区(A、B、C和D)可用于计算消息摘要。因此,每个A、B、C、D都是一个32位的寄存器。
这些寄存器以十六进制启动,低位字节优先:
字A:01 23 45 67
字B:89 ab cd ef
字C:fe dc ba 98
字D:76 54 32 10
步骤4 - 以512位(16字)块处理消息 - 压缩函数包括四轮处理。每一轮都将当前正在处理的512位块(Yq)和128位缓冲区值ABCD作为输入,并更新缓冲区的元素。
它可以描述四个辅助函数,每个函数都将三个32位字作为输入,并生成一个32位字作为输出。
F (X, Y, Z) = XY v not (X) Z
G (X, Y, Z) = XZ v Y not (Z)
H (X, Y, Z) = X xor Y xor Z
I (X, Y, Z) = Y xor (X v not (Z))
在每个比特位置,F充当条件:如果X则Y否则Z。函数F可以使用+而不是v来表示,因为XY和not X(Z)永远不会在相同的比特位置有1。
步骤5 - 输出 - 消息摘要生成一个输出,包括A、B、C、D。最终轮的输出是128位的哈希结果或消息摘要,它可以在递增处理消息的所有t个512位块后获得。