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语言运算规则拆解执行顺序:
宏整体是逗号表达式,按从左到右顺序执行:
- 第一步
addTemp = (context)->Length_Low:先保存累加前的Length_Low原始值,用于后续溢出判断 - 第二步
(context)->Length_Low += (length):把新输入消息的长度(单位为比特)累加到低32位长度变量中 - 溢出判断
((context)->Length_Low < addTemp):32位无符号整数溢出时会从最大值绕回最小值,所以如果累加后的Length_Low比累加前还小,说明低32位已经溢出,需要向高32位进位 - 利用
&&短路特性:只有低32位确实溢出时,才会执行++(context)->Length_High给高32位加1;如果没溢出,高32位不会被修改 - 超限判断:如果给高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]
- 右移24位得到最高8位,存入
- 再处理低32位
Length_Low:- 右移24位得到最高8位,存入
Message_Block[60] - 右移16位得到次高8位,存入
Message_Block[61] - 右移8位得到次低8位,存入
Message_Block[62] - 直接取低8位,存入
Message_Block[63]
处理完成后,消息块的最后8字节就是符合SHA256规范的大端序总长度值。
- 右移24位得到最高8位,存入
内容的提问来源于stack exchange,提问作者jupiter_jazz
相关产品推荐
相关产品推荐

