SHA-1哈希可以全为零吗?

mck*_*mey 30 sha1

是否有任何输入SHA-1将计算为十四进制的十六进制值,即"0000000000000000000000000000000000000000"?

daf*_*daf 20

是的,这非常不可能.即2 ^ 160中的一个,或0.00000000000000000000000000000000000000000000006842277657836021%.

  • 是的 - 事实上,哈希值的统一概率分布是良好哈希函数的定义特征之一. (6认同)
  • 至于我认为的任何其他哈希,不是吗? (4认同)
  • 如果输出在[1,2 ^ 160]之间均匀映射,那将是均匀的但仍然不包括0. (4认同)
  • 同样,这不能保证会发生。 (2认同)

Bri*_*ack 14

此外,由于SHA1在加密方面非常强大,它在计算上也是不可行的(至少对于当前的计算机技术 - 对于诸如量子计算等新兴技术的所有投注都是关闭的)来找出哪些数据会导致全零散列,直到它在实践中发生.如果你真的必须使用"0"哈希作为标记,请确保包含一个适当的断言(你不只是将输入数据哈希到你的"零"哈希标记),它仍然存在于生产中.这是您的代码永久需要检查的失败情况.警告:如果存在,您的代码将永久损坏.

根据您的情况(如果您的逻辑可以处理空字符串作为特殊情况以禁止输入)您可以使用空字符串的SHA1哈希('da39a3ee5e6b4b0d3255bfef95601890afd80709').如果您的输入仅具有数字作为不变量,也可以使用不在输入域中的任何字符串的哈希值,例如sha1('a').如果输入被预处理以添加任何常规装饰,那么没有装饰的东西的散列也会起作用(例如:sha1('abc')如果像'foo'这样的输入用引号装饰为类似''foo''的东西).

  • 当然,空字符串的 SHA1 哈希值与全零哈希值具有相同的问题,即至少原则上可能某些其他输入会产生相同的结果。 (2认同)

Aar*_*lla 8

我不这么认为.

没有简单的方法来说明为什么它不可能.如果有,那么这本身就是找到碰撞的算法的基础.

更长的分析:

预处理确保1输入中始终至少有一位.

循环w[i]将仅保留原始流,因此输入中至少有一个1位(字0到15).即使巧妙地设计了位模式,至少有一些0到15的值必须是非零的,因为循环不会影响它们.

注意:leftrotate是循环的,因此不会丢失1位.

在主循环中,很容易看出因子k永远不为零,因此temp不能为零,因为右侧的所有操作数都为零(k从不).

这给我们留下了一个问题:是否可以(a leftrotate 5) + f + e + k + w[i]通过溢出总和来创建一个返回0 的位模式.对于这一点,我们需要找到值w[i],使得w[i] = 0 - ((a leftrotate 5) + f + e + k)

这可以用于前16个值,w[i]因为您可以完全控制它们.但是,xor通过前16个值再次创建单词16到79 .

所以下一步可能是展开循环并创建一个线性方程组.我将把它作为练习留给读者;-)系统很有意思,因为我们有一个循环可以创建额外的方程式,直到我们得到稳定的结果.

基本上,选择算法的方式是您可以通过选择输入模式来创建单独的0个单词,但这些效果可以通过xor输入模式来创建64个其他输入.

举个例子:为了使temp0,我们有

a = h0 = 0x67452301
f = (b and c) or ((not b) and d)
  = (h1 and h2) or ((not h1) and h3)
  = (0xEFCDAB89 & 0x98BADCFE) | (~0x98BADCFE & 0x10325476)
  = 0x98badcfe
e = 0xC3D2E1F0
k = 0x5A827999
Run Code Online (Sandbox Code Playgroud)

这给了我们w[0] = 0x9fb498b3等等.这个值然后用在单词16,19,22,24-25,27-28,30-79中.

类似地,单词1用在单词1,17,20,23,25-26,28-29,31-79中.

如您所见,有很多重叠.如果计算的输入值会给出0结果,则该值会影响最后32个其他输入值.


The*_*ini 8

亚伦的帖子不正确.它被挂在SHA1计算的内部,而忽略了在round函数结束时发生的事情.

具体来说,请参阅维基百科伪代码.在该轮结束时,进行以下计算:

h0 = h0 + a
h1 = h1 + b 
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e
Run Code Online (Sandbox Code Playgroud)

所以,全0输出可以发生,如果h0 == -a,h1 == -b,h2 == -c,h3 == -d,并h4 == -e进入最后一节,这里的计算是模2 ^ 32.

回答你的问题:没有人知道是否存在产生所有零输出的输入,但是密码学家希望存在基于daf提供的简单参数.


Dev*_*lar 5

如果不了解 SHA-1 内部原理,我不明白为什么任何特定值都是不可能的(除非在算法描述中明确说明)。全零值的可能性不大于或小于任何其他特定值。

  • 是的,我想这是提出同一问题的更好方法:SHA-1 算法中是否有任何内容明确排除了该值。 (3认同)