代码之家  ›  专栏  ›  技术社区  ›  mckamey

sha-1哈希可以全部为零吗?

  •  28
  • mckamey  · 技术社区  · 15 年前

    sha-1是否有任何输入计算为十六进制值的四个零,即“000000000000000000000000000000000000000000000000000”?

    7 回复  |  直到 10 年前
        1
  •  8
  •   Aaron Digulla    11 年前

    我不这么认为。

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

    更长的分析时间:

    预处理确保始终至少有一个 1 输入位。

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

    注: leftrotate 是圆形的,因此不会丢失1位。

    在主循环中,很容易看出 k 永远不会是零,所以 temp 不能为零,因为右侧的所有操作数都为零( K 绝不是)。

    这就给我们留下了一个问题,您是否可以为其创建位模式 (a leftrotate 5) + f + e + k + w[i] 通过溢出和返回0。为此,我们需要找到 W[我] 这样 w[i] = 0 - ((a leftrotate 5) + f + e + k)

    这对于 W[我] 因为你完全控制了他们。但是单词16到79又是由 xor 前16个值。

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

    基本上,选择算法的方式是这样的,您可以通过选择输入模式来创建单个的0个单词,但是这些效果被 异或 使用输入模式来创建64个其他输入。

    举个例子:使 临时雇员 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中。

    同样,单词1也用于单词1、17、20、23、25-26、28-29、31-79。

    正如你所看到的,有很多重叠。如果您计算的输入值将给您一个0的结果,该值将影响最后32个其他输入值。

        2
  •  18
  •   daf    15 年前

    是的,这是难以置信的不可能。即2^160中的一个,或0.000000000000000000000000000000000006842277657836021%。

        3
  •  14
  •   Brian Jack    13 年前

    此外,由于sha1在密码学上很强,因此在计算上也是不可行的(至少在当前的计算机技术下——所有的赌注都被排除在紧急技术上,如 quantum computing )找出什么数据会导致一个零散列,直到它在实践中发生。如果你 真正地 必须使用“0”散列作为sentinel,确保包含一个适当的断言(您不只是将输入数据散列到您的“零”散列sentinel中),该断言在生产中仍然有效。这是您的代码将永久需要检查的故障条件。警告:如果您的代码被破坏,它将被永久破坏。

    根据您的情况(如果您的逻辑能够处理空字符串作为一种特殊情况以禁止其输入),您可以使用空字符串的sha1哈希(“da39a3ee5e6b4b0d325bfef95601890afd80709”)。也可能是对输入域以外的任何字符串(如sha1(“a”)使用哈希,前提是您的输入只有数字作为不变量。如果输入经过预处理以添加任何常规装饰,那么没有装饰的东西的散列也会起作用(例如:sha1(“abc”),如果您的输入(如“foo”)用引号装饰为“foo”)。

        4
  •  7
  •   TheGreatContini    10 年前

    亚伦的职位不正确。它被挂在sha1计算的内部,而忽略了在圆函数的末尾发生的事情。

    具体来说,请参见 pseudo-code from 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 进入最后一节,计算是mod 2^32。

    回答你的问题:没有人知道是否存在一个产生所有零输出的输入,除了密码器。 期待 这是基于DAF提供的简单论点。

        5
  •  3
  •   DevSolar    15 年前

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

        6
  •  0
  •   user1947100    11 年前

    与目前所有的答案相反,没有人知道这一点。概率估计和证明有很大的区别。

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

    人们似乎并没有意识到这是多么不可能(如果全人类都把当前的资源集中在通过野蛮变形找到零散列值上,这需要大约XXX……当前宇宙的年代)。

    如果你知道这个函数是安全的,那么假设它不会发生是正确的。这在将来可能会改变,所以假设一些恶意输入可能会给出这个值(例如,如果找到零散列值,不要删除用户的HDD)。

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

    [我完成了这个网站…我在这里的第一个答案是,我试图写一个很好的答案,但我看到的是一群投了反对票的白痴,他们错了,甚至不能说出他们为什么要这么做。你的社区真让我失望。我仍将使用此网站,但只能被动使用]

        7
  •  -3
  •   Marius Amado-Alves    12 年前

    与这里所有的答案相反,答案只是不。

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