MD5算法填充原始消息长度时为何存在3位偏移操作?
MD5填充步骤3位偏移设计的原因
这个3位偏移本质是为了在32位运行环境下,计算原始消息比特长度的高32位时避免整数溢出,具体逻辑如下:
- MD5填充规则明确要求,需要在填充内容的末尾追加原始消息的比特长度,该长度是64位小端格式整数,会拆分为低32位、高32位两个部分依次写入缓冲区。
- 代码中的
initial_len是原始消息的字节长度,要转换为比特长度需要乘以8,对应二进制运算就是左移3位。 - 第一行代码负责写入比特长度的低32位,只要
initial_len不超过2^29,直接计算initial_len*8的结果不会溢出32位整数,低32位取值准确。 - 第二行需要写入比特长度的高32位,如果直接计算
(initial_len * 8) >> 32,当initial_len超过2^29时,32位变量无法存储initial_len*8的完整结果,会触发溢出导致高32位计算错误。而根据移位运算的等价性质:(initial_len << 3) >> 32 = initial_len >> (32-3) = initial_len >> 29,直接对原始字节长度做右移29位操作,全程不需要执行大数乘法,完全规避了32位整数溢出问题,这就是3位偏移的核心来源。
相关实现代码:
// append the len in bits at the end of the buffer. to_bytes(initial_len*8, msg + new_len); // initial_len>>29 == initial_len*8>>32, but avoids overflow. to_bytes(initial_len>>29, msg + new_len + 4);
内容的提问来源于stack exchange,提问作者isudfv
相关产品推荐
相关产品推荐

