You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 10:06:04