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

RFC 4634 SHA256实现中Length_Low与Length_High含义及代码逻辑问询

问题解答

1. Length_Low与Length_High的作用

SHA2-256算法要求消息填充的最后8字节存储原始消息的总比特长度,大端序64位无符号整数,为了兼容不支持原生64位无符号整数的编译环境,代码用两个32位无符号整数拼接实现64位长度存储:

  • Length_Low:存储64位长度的低32位
  • Length_High:存储64位长度的高32位
    两者拼接后的值就是完整的消息总比特长度,符合SHA256最多支持2^64比特长度消息的规范要求。

2. 两段代码逻辑详解

第一段:SHA1AddLength宏逻辑

这个宏的作用是把新输入的消息段长度累加到总长度中,同时检测长度溢出错误,我们按C语言运算规则拆解执行顺序:
宏整体是逗号表达式,按从左到右顺序执行:

  1. 第一步addTemp = (context)->Length_Low:先保存累加前的Length_Low原始值,用于后续溢出判断
  2. 第二步(context)->Length_Low += (length):把新输入消息的长度(单位为比特)累加到低32位长度变量中
  3. 溢出判断((context)->Length_Low < addTemp):32位无符号整数溢出时会从最大值绕回最小值,所以如果累加后的Length_Low比累加前还小,说明低32位已经溢出,需要向高32位进位
  4. 利用&&短路特性:只有低32位确实溢出时,才会执行++(context)->Length_High给高32位加1;如果没溢出,高32位不会被修改
  5. 超限判断:如果给高32位加1后Length_High变成0,说明整个64位长度都溢出了,超过了SHA256支持的最大消息长度,此时给context->Corrupted赋值1表示出错,否则赋值0。

第二段:长度填充逻辑

这段是SHA256消息填充的固定步骤,目的是把存储的64位总长度按大端序写入消息块的最后8字节:

  • 先处理高32位Length_High:
    • 右移24位得到最高8位,存入Message_Block[56]
    • 右移16位得到次高8位,存入Message_Block[57]
    • 右移8位得到次低8位,存入Message_Block[58]
    • 直接取低8位,存入Message_Block[59]
  • 再处理低32位Length_Low:
    • 右移24位得到最高8位,存入Message_Block[60]
    • 右移16位得到次高8位,存入Message_Block[61]
    • 右移8位得到次低8位,存入Message_Block[62]
    • 直接取低8位,存入Message_Block[63]
      处理完成后,消息块的最后8字节就是符合SHA256规范的大端序总长度值。

内容的提问来源于stack exchange,提问作者jupiter_jazz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:54:00