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

时间:2009-12-14 17:39:04

标签: sha1

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

7 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:14)

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

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

答案 2 :(得分: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)

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

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

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

举个例子:要使temp为0,我们有

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

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

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

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

答案 3 :(得分:7)

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

具体来说,请参阅pseudo-code from Wikipedia。在回合结束时,完成以下计算:

h0 = h0 + a
h1 = h1 + b 
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e

如果h0 == -ah1 == -bh2 == -ch3 == -dh4 == -e进入最后一节,计算结果可能会产生全0输出是mod 2 ^ 32。

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

答案 4 :(得分:3)

在不了解SHA-1内部结构的情况下,我不明白为什么任何特定值都不可能(除非在算法描述中明确说明)。全零值不会比任何其他特定值更可能或更不可能。

答案 5 :(得分:0)

与此处的所有当前答案相反,没人知道。概率估计和证明之间存在很大差异。

但你可以放心地认为它不会发生。实际上,您可以安全地假设几乎任何值都不是结果(假设它不是通过某些类似SHA-1的过程获得的)。只要SHA-1是安全的,你就可以假设它(实际上它已经不存在了,至少在理论上是这样)。

人们似乎并没有意识到它是多么不可能(如果所有人类都将其所有当前资源集中在通过强制执行来找到零哈希,那么当前宇宙的xxx年龄将需要破解它)。

如果您知道该功能是安全的,那么假设它不会发生并没有错。这可能会在未来发生变化,因此假设某些恶意输入可以提供该值(例如,如果发现零散列,则不要擦除用户的HDD)。

如果有人仍然认为它不是“干净”或其他什么,我可以告诉你,由于量子力学,在现实世界中没有任何保证。你认为只是因为概率很低,你无法穿过坚固的墙壁。

[我已经完成了这个网站...我的第一个答案在这里,我试着写一个很好的答案,但我看到的是一群沮丧的蠢货,他们错了,甚至不能说出原因是什么他们这样做。你的社区真让我失望。我仍然会使用这个网站,但只是被动地使用]

答案 6 :(得分:-3)

与此处的所有答案相反,答案仅为“否”。

哈希值始终包含设置为1的位。