34

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

4

7 回答 7

22

是的,这非常不可能。即 2^160 分之一,或 0.000000000000000000000000000000000000000000000006842277657836021%。

于 2009-12-14T17:42:44.343 回答
15

此外,由于 SHA1 在密码学上很强大,因此要找出哪些数据会导致全零散列在计算上也是不可行的(至少对于当前的计算机技术——量子计算等新兴技术是不可能的)。在实践中发生。如果您确实必须使用“0”散列作为标记,请务必包含一个适当的断言(您不只是将输入数据散列到您的“零”散列标记),该断言在生产中仍然存在。这是您的代码将永久需要检查的故障条件。警告:如果这样做,您的代码将永久损坏。

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

于 2011-03-21T14:19:11.963 回答
10

我不这么认为。

没有简单的方法来说明为什么这是不可能的。如果有,那么这本身就是寻找冲突的算法的基础。

更长的分析:

预处理确保输入中始终至少有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]因为您可以完全控制它们。但是单词 16 到 79 再次通过xoring 前 16 个值创建。

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

xor基本上,该算法的选择方式是,您可以通过选择输入模式来创建单独的 0 个单词,但这些效果会通过输入模式来创建 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

这给了我们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 个其他输入值。

于 2013-09-24T13:32:03.050 回答
9

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

具体来说,请参阅Wikipedia 中的伪代码。在回合结束时,完成以下计算:

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

h0 == -a因此,如果, h1 == -b, h2 == -c, h3 == -d, 并h4 == -e进入最后一部分,则可能会发生全 0 输出,其中计算为 mod 2^32。

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

于 2014-07-10T04:12:16.150 回答
5

在没有任何 SHA-1 内部知识的情况下,我不明白为什么任何特定值都不可能(除非在算法描述中明确说明)。与任何其他特定值相比,全零值的可能性并不大或小。

于 2009-12-14T17:42:58.790 回答
2

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

但你可以放心地假设它不会发生。事实上,您可以放心地假设结果不会是任何值(假设它不是通过某些类似 SHA-1 的过程获得的)。只要 SHA-1 是安全的,您就可以假设这一点(实际上它不再安全了,至少理论上如此)。

人们似乎没有意识到这是多么不可能(如果全人类将所有当前资源都集中在通过暴力破解找到零散列,则需要大约 xxx... 当前宇宙的年龄来破解它)。

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

如果有人仍然认为它不“干净”或其他什么,我可以告诉你,由于量子力学,现实世界中没有什么是可以保证的。你假设你不能仅仅因为概率极低而穿过一堵坚固的墙。

[我已经完成了这个网站......我在这里的第一个答案,我试图写一个很好的答案,但我看到的只是一群投反对票的白痴,他们是错误的,甚至无法说出他们这样做的原因. 你的社区真的让我很失望。我仍然会使用这个网站,但只是被动]

于 2013-01-03T23:34:55.623 回答
-4

与这里的所有答案相反,答案很简单。

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

于 2013-01-18T16:16:41.890 回答