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

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上,作为下一个块处理的初始哈希值
  • 所有块处理完成后,将H0~H7按顺序拼接为二进制串,再转成十六进制就是最终哈希值

2. 字列表生成规则

每个512比特的块都需要独立生成自己的64个32位字的W列表,不能跨块合并生成W,也不能复用其他块的W列表。


代码问题排查

你提供的代码存在3个核心问题,完全匹配你描述的“短消息正常、长消息错误”的故障特征:

  1. 多块处理逻辑完全缺失
    当原始消息比特数≥448时,填充后总长度为1024比特,对应2个512比特块,你当前的代码直接把1024比特全部拆分到addtoW中,再补零到64个条目作为W列表,这是完全错误的。正确逻辑是将1024比特拆分为2个独立的512比特块,每个块单独拆分出16个32位初始字,再各自扩展为64个条目的W列表,分别执行两次压缩运算。
  2. 消息长度编码不符合规范
    SHA256要求填充末尾的64比特是原始消息比特长度的大端无符号整数编码,你使用的format(len(self.convertToBytes), "08b").zfill(64)[0:64]逻辑仅在消息长度≤255比特时有效,长度超过255时编码结果错误。正确写法应为format(len(self.convertToBytes), '064b'),直接将长度转换为64位二进制,不足时左侧补零。
  3. 填充起始逻辑存在隐患
    你代码中使用的self.add1未在片段中定义,按SHA256标准,填充的第一步是在原始消息比特串末尾追加1个比特1再补零,需确认self.add1是否等于self.convertToBytes + '1',如果这一步错误所有填充结果都会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:00