在比特币论坛上,我问为什么比特币客户端出于各种目的将SHA-256(SHA-256(x))作为其加密哈希进行计算。领先的理论-自比特币作者失踪以来-似乎从安全角度来看可能类似于将SHA-256中的回合次数从64增加到128,从而提供了一定的安全裕度。对SHA-256的首次原像攻击(如果存在这种情况)很可能对SHA-256(SHA-256(x))不起作用,从而给了过渡到新哈希函数的时间。

首先是真的吗?至少对某些类型的攻击,两次哈希会增加发起原图像攻击的难度吗?安全性有类似的提高吗?如何将第一轮加密的结果反馈到第二(或第三)设置中?您会两次使用同一密钥吗?您会从第一轮(第二轮的第三轮,等等)的密文中(的哈希)派生第二个密钥吗?您是否需要奇数回合和备用的Encrypt(Decrypt(Encrypt()))(如Triple-DES一样)来防止中间相遇攻击?这将如何与对称密钥加密的各种模式相互作用?如果我要在真正的产品中实现它,我没有想到的其他事情了吗?

#1 楼

SHA-256(SHA-256(x))是Ferguson和Schneier在其出色的著作“ Practical Cryptography”(后来由Ferguson,Schneier和Kohno更新,并更名为“ Cryptography Engineering”)中提出的,用于制造SHA-256不受“长度扩展”攻击的影响。他们称其为“ SHA-256d”。我们在2006年启动Tahoe-LAFS项目时就开始将SHA-256d用于所有内容,其原则是它的效率几乎不及SHA-256,并且使我们不必去思考长度扩展攻击是否危险我们在每个地方都使用哈希函数。如果比特币的发明者出于类似原因使用它,我不会感到惊讶。为什么不使用SHA-256d代替SHA-256?

请注意,SHA-3项目要求所有候选对象都具有某种防止长度扩展攻击的方法。其中一些使用类似于SHA-256d的方法,即,在发出结果之前,它们在状态的末尾进行了额外的“最终化”哈希处理。

#2 楼

对于第二次原像攻击:

hash(x) = hash(y)暗示hash(hash(x)) = hash(hash(y))

,因此它不能防止直接的原像攻击。比特币为a b c构建了一个Merkle树,如下所示:
hash(hash(hash(a)+hash(b))+hash(hash(c)+hash(c)))。最终结果仍然是相同的。

的确可以提高对首次原像攻击的抵抗力,但在任何情况下都没有关系,这很重要-攻击者通常拥有明文生成哈希值。 (鉴于存在ECDSA操作,因此对地址的图像进行预攻击似乎很遥不可及。)

评论


$ \ begingroup $
那么,一般而言,有什么理由执行hash(hash(x))吗?
$ \ endgroup $
– maaku
2011-09-27 15:42

$ \ begingroup $
我认为可以提出一个论点,那就是它可以为攻击提供更好的保护,在这种攻击中,仅给出哈希值的攻击者试图查找对此哈希进行哈希处理的文本。 (但在每种现实的比特币情况下,攻击者将拥有的不仅仅是哈希值。)
$ \ endgroup $
– David Schwartz
2011年9月27日下午16:39

$ \ begingroup $
仅供参考-在Bitcoin.SE上引用了此答案
$ \ endgroup $
–半音
13年3月19日在17:03



#3 楼

是的(针对名义问题的加密部分)。实际上,由于攻击(每个链接一个词),Bruce Schneier建议使用多轮AES加密:


密码学完全是为了保证安全。如果您可以破解密码的n轮,则可以设计2n或3n轮。我们正在学习的是,
AES的安全裕度比以前认为的要小得多。
尽管没有理由为了支持另一个
算法而放弃AES,但NST应该增加三个AES
变体的回合数。在这一点上,我建议在16轮中使用AES-128,在20轮中使用AES-192,在28轮中使用AES-256。甚至更多;我们不想一次又一次地修改标准。


编辑:显然,我对此的理解不正确。轮数在算法内部,而不是“多次加密操作”。按照设计,AES对于128位密钥有10个回合,对于192位密钥有12个回合,对于256位密钥有14个回合。

对此感到抱歉。

评论


$ \ begingroup $
他是如何提议扩展密钥扩展以适应新的回合数量的?
$ \ endgroup $
–西达科他州
2012年12月5日在16:21