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

实现SHA-1计算80个32位字时17行起出现异常,请求技术协助

排查SHA-1生成80个32位字时的异常问题

嘿,我来帮你搞定这个SHA-1的问题!你说从第17行开始出现奇怪符号,十有八九是在生成后续W数组元素的过程中,位操作或者数据类型处理出了岔子。结合SHA-1的标准逻辑,我给你列几个最可能的原因和解决方向:

  • 循环左移操作没做对:SHA-1里生成W[i](i≥16)时,需要把W[i-3] XOR W[i-8] XOR W[i-14] XOR W[i-16]的结果循环左移1位,而不是普通的左移。普通左移会直接丢掉高位的bit,而循环左移要把溢出的高位补到低位。比如32位无符号数的话,正确的实现应该是:(temp << 1) | ((temp >> 31) & 1)。如果这里写错了,生成的数值会完全偏离预期,甚至出现奇怪的符号。

  • 误用了有符号整数类型:SHA-1的所有计算都应该基于无符号32位整数。如果你的伪代码里用了有符号类型,当某个32位字的最高位被置1时,数值会被解析成负数,输出的时候就会显示成奇怪的符号或者补码形式。赶紧把数据类型改成无符号32位的试试。

  • 数组索引搞混了:要注意你的数组是0-based还是1-based的。比如标准SHA-1里W数组是从0到79,第17个元素是W[16],计算它需要用W[13]、W[8]、W[2]、W[0]。如果你把索引偏移算错了(比如把i-14写成i-15),那生成的结果肯定不对。

  • XOR操作的位数不对齐:确保参与XOR的四个W元素都是完整的32位无符号数,如果其中某个元素因为之前的操作被截断或者位数不足,XOR之后就会产生异常值。

给你贴一段标准的W数组生成伪代码参考:

// 拆分输入分组为16个32位无符号整数,初始化W数组前16位
W[0..15] = 输入分组的32位字拆分结果

// 生成第16到79位的W字(0-based索引,对应你说的第17个及以后)
for i from 16 to 79:
    temp = W[i-3] XOR W[i-8] XOR W[i-14] XOR W[i-16]
    // 32位循环左移1位
    W[i] = (temp << 1) | ((temp >> 31) & 1)

你可以先单独测试这个W数组的生成逻辑,比如用一个已知的测试输入(比如全0的512位分组),对比标准的W数组值,看看从第17个元素开始是不是和预期一致。如果还是有问题,把你伪代码里第17行附近的具体代码贴出来,我可以帮你更精准地定位!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:35:25