比特币维基说:


比特币正在使用两个哈希迭代(表示为SHA256 ^ 2,即“ SHA256函数平方”),其原因与对较小但相关的部分攻击有关SHA1哈希。自2005年以来,SHA1对生日攻击的抵抗力在O(2 ^ 64)与设计O(2 ^ 80)中已被部分打破。尽管hashcash依赖于映像前的抵抗力,因此不易受到生日攻击,但针对生日碰撞攻击强化SHA1的通用方法是对其进行迭代两次。到目前为止,尚不存在对SHA256的可比攻击,但是,由于SHA256的设计与SHA1类似,因此对于使用双SHA256的应用程序来说可能很防御。这就是比特币的作用,考虑到哈希现金对原像安全性的依赖,这是没有必要的,但这是对未来密码分析技术发展的防御性步骤。对SHA1和原则上类似设计的其他哈希(如SHA256)的攻击也是NIST SHA3设计竞赛的动机,该竞赛仍在继续。


我不知道如何两次哈希考虑到在第一个哈希之后找到一个冲突将在第二个哈希之后琐碎地引起一个冲突,将防止生日攻击。

是因为您必须两次计算哈希值,从而减慢了处理速度,还是有更重要的原因?

评论

我想这个问题不是您的重复问题,但是它们是非常相关的。我的想法是,比特币Wiki是不正确的,因为单个SHA1(或SHA256)碰撞也会在双SHA上发生碰撞。

附言这是2005年的论文。

这根本没有帮助。双重哈希可以防止长度扩展攻击,但是据我所知,它们不会在任何地方影响比特币。

#1 楼

任何哈希函数中的冲突都会在哈希函数的“平方”变体中产生冲突。这很容易看到。如果hash(x)==hash(y),则对输出进行散列也将相同。

因此Wiki条目错误。要查看双重哈希的真正目的,请参阅此问题和答案。

评论


$ \ begingroup $
另外,反之亦然:如果我们在哈希函数的“平方”变体中发生冲突,则可以在基本哈希(在第一哈希或第二哈希中)中找到一个冲突。
$ \ endgroup $
–fgrieu♦
17年4月1日在4:58

#2 楼

严格来说,两次哈希实际上可能会增加冲突的机会。
如果哈希函数的两个输出发生哈希冲突,则任何具有冲突哈希的字符串都将是新的冲突。

实际上,举个例子比较容易:对于可怕的假设哈希函数F ...
F("Alice") -> "aaa" F("Bob") -> "bbb" F("aaa") -> "ccc" F("bbb") -> "ccc" F(F("Alice")) == F(F("Bob"))

评论


$ \ begingroup $
的确,迭代$ n $次哈希使冲突发生的可能性约为$ n $次。当然,对于任何$ n $的实际值,$ n $乘以可忽略的小概率仍然可以忽略不计-尤其是因为达到该概率也需要$ n $乘以更多的计算量。特别是,注意观察SHA-256 $ ^ n $冲突必然意味着在迭代哈希的某个阶段观察纯SHA-256的冲突。由于后者不太可能发生,因此前者也不可能。
$ \ endgroup $
–伊尔马里·卡洛宁(Ilmari Karonen)
17年1月7日在17:28



$ \ begingroup $
@IlmariKaronen嗯,我不会说它是线性的,而是取决于我不知道的属性。如果哈希算法在对摘要长度的输入进行哈希处理时按1:1映射,则不会增加概率。如果比率为2:1,则概率为2 ^ n。因此,对于x:1的比率,假设没有不对称的循环特性,则为x ^ n。本质上,我说可能是因为赔率完全取决于哈希函数的特性,因此我们只能放心地说它永远不会/降低/概率。
$ \ endgroup $
–凯塔尔
17年1月7日在22:23

$ \ begingroup $
线性缩放是一个近似值,但非常好。如果我们使用不同的随机函数对哈希的每次迭代进行建模,则在使用$ b $位哈希将$ n $次哈希的$ k $个输入之间至少发生一次碰撞的概率为$ 1- \ exp(\ frac12n(k ^ 2-k)\ log(1-2 ^ {-b}))$。只要$ n(k ^ 2-k)\ ll 2 ^ b $,就可以很好地近似为$ \ frac12n(k ^ 2-k)2 ^ {-b} $,并且相同的条件也应满足确保将迭代视为独立随机是有效的近似值(因为在两个不同迭代中发生的任何输入的概率都可以忽略不计)。
$ \ endgroup $
–伊尔马里·卡洛宁(Ilmari Karonen)
17年1月7日23:05

$ \ begingroup $
@IlmariKaronen老实说,我现在不遵循数学,但是我不明白如何获得合理的线性行为。哈希的重复迭代会创建一棵树,因此会生成功率标度。另外,我要讲的关于属性的要点...假设有两个不好的函数:A(){a = bytes [-1];对于以字节为单位的字节{a =(a + byte)%256};返回}; B(){a = 10101010b;对于以字节为单位的字节{a = xor字节};返回} ...如果A的比例为2:1,则B为1:1
$ \ endgroup $
–凯塔尔
17年1月10日在21:07