Python编写的SHA256算法处理长度超56字符输入时运行错误求助
问题解答
1. 每个64字节的SHA256处理块的运算逻辑
SHA256采用块迭代架构,所有处理块按顺序参与运算,流程如下:
- 初始化8个标准规定的初始哈希值
H0~H7 - 将填充后的完整消息拆分为N个连续的512比特(64字节)独立块
M0、M1...M(N-1) - 逐个处理每个块:
- 基于当前块生成专属的64个32位字列表
W - 将当前的
H0~H7拷贝到临时变量a~h作为压缩运算的初始值 - 执行64轮压缩运算,每轮使用
W中对应位置的字更新a~h - 将运算后的
a~h按模2^32分别累加到原有的H0~H7上,作为下一个块处理的初始哈希值
- 基于当前块生成专属的64个32位字列表
- 所有块处理完成后,将
H0~H7按顺序拼接为二进制串,再转成十六进制就是最终哈希值
2. 字列表生成规则
每个512比特的块都需要独立生成自己的64个32位字的W列表,不能跨块合并生成W,也不能复用其他块的W列表。
代码问题排查
你提供的代码存在3个核心问题,完全匹配你描述的“短消息正常、长消息错误”的故障特征:
- 多块处理逻辑完全缺失
当原始消息比特数≥448时,填充后总长度为1024比特,对应2个512比特块,你当前的代码直接把1024比特全部拆分到addtoW中,再补零到64个条目作为W列表,这是完全错误的。正确逻辑是将1024比特拆分为2个独立的512比特块,每个块单独拆分出16个32位初始字,再各自扩展为64个条目的W列表,分别执行两次压缩运算。 - 消息长度编码不符合规范
SHA256要求填充末尾的64比特是原始消息比特长度的大端无符号整数编码,你使用的format(len(self.convertToBytes), "08b").zfill(64)[0:64]逻辑仅在消息长度≤255比特时有效,长度超过255时编码结果错误。正确写法应为format(len(self.convertToBytes), '064b'),直接将长度转换为64位二进制,不足时左侧补零。 - 填充起始逻辑存在隐患
你代码中使用的self.add1未在片段中定义,按SHA256标准,填充的第一步是在原始消息比特串末尾追加1个比特1再补零,需确认self.add1是否等于self.convertToBytes + '1',如果这一步错误所有填充结果都会出错。
内容的提问来源于stack exchange,提问作者kibarekmek
相关产品推荐
相关产品推荐

