是使用算术加法来组合摘要(使用散列函数创建的),然后散列并发布结果,而不是发布摘要集更不安全?

如果外部散列函数不同,答案是否会改变?从内部函数开始?

我正在为比特币制定提案,以启用m-of-n的交易签名,并正在考虑使用160位摘要的公钥摘要,计算方式如下:

摘要= RIPEMD160(SUM(SHA256(public_key_n)))

涉及的公共密钥数通常少于10,并且永远不会超过20。公钥无关紧要,我只是担心攻击者发现另一组散列到同一摘要的公钥。

评论

您是在担心人们找到原始的a和b(原图像),另一个具有相同哈希值的a和b(第二原图像)还是发现任意冲突?

一个观察结果是加法变量是可交换的(即您可以交换a和b并获得相同的结果),而元组变量则不是。不知道这是否与您的协议有关。

Paulo:我担心要找到另一个a和b。与a和b的顺序无关。

如果可能的话,您真的希望算法具有以下特征:仅当两个不同的输入散列到散列函数的相同输出时才可能发生冲突。如果有任何可能的方法可以做到这一点,那么就可以做到。

#1 楼

如果我正确理解了建议的构造,那就是

1)哈希n个值(使用SHA-256);

2)添加这些哈希,也许是mod 2256;

3)对总和(使用RIPEMD-160进行哈希处理)。

这可能是不安全的:在第2步中创建碰撞甚至是第二张原图都会减少到背包问题,并且安全记录不佳;当允许的输入数量n超过某个阈值,并且与第一个哈希中的位数相关时,这可能是可行的。而不是添加哈希,对它们进行排序,然后将它们连接起来;排序可以保持加法的关联性和可交换性(否则是不必要的)。该构造实质上具有与最弱的哈希函数抗碰撞性相同的抵抗力(第二个原像抵抗是n个原像的第一个哈希函数和第二个哈希函数的最弱抵抗力)。注意:我认为没有充分的理由使用两个不同的哈希函数。这是对所提议结构的轻微修改的攻击,并用XOR代替。这是第二次原图攻击:攻击者拥有一组有效的输入值,并希望在步骤3之后获得另一组具有相同总体哈希值的输入。所有彼此不同且有效的输入值),则使用第一个哈希将其哈希,直到从累积的哈希中得出256个哈希为基础为止;也就是说,直到每个值20、21,.. 2255都可以表示为256个散列中某些散列的XOR的线性组合。这只是将新生成的哈希添加到基础上的问题,除非事实证明它是基础中已有哈希的线性组合,可以通过高斯消除来检查。当它包含256个散列时,基础便是完整的,这将在第256个随机值之后不久发生。为了获得伪造品,她通常使用有效的输入字符串执行步骤1)和2)。她再次通过高斯消除将结果表示为在她的预先计算的基础上哈希的线性组合。根据基础,它将包括约128个散列的XOR。产生这些哈希的随机字符串形成一个伪造的集合。不需要步骤3)。显着减少伪造中的字符串数很容易。伪造,如果是原件,则在原件上直接添加更多矢量);这是一个背包问题,几乎无限制地提供值。我现在意识到这是声明的一部分);但无论如何,添加步骤可能是一个薄弱环节。

评论


$ \ begingroup $
谢谢,非常有帮助。对于我的应用程序,公共密钥的最大数量将比哈希函数中的位数小得多。
$ \ endgroup $
– Gavinandresen
2011年8月22日19:00

$ \ begingroup $
是的,对规范排序的连接进行哈希处理似乎是正确的选择。 (尽管我还没有看到加法如何真正使它变得不安全-仍然存在第一个哈希值。)
$ \ endgroup $
–PaŭloEbermann
11年8月22日在19:14

$ \ begingroup $
不幸的是,在这种特殊情况下,规范的排序和连接不是一个选择。
$ \ endgroup $
– Gavinandresen
11年8月22日在19:31

$ \ begingroup $
它们只有20位字符串。您甚至可以使用无循环语言对它们进行排序。
$ \ endgroup $
–沼泽雷
11年8月22日在20:03

$ \ begingroup $
@gavinandresen:如果不要求最终哈希与输入顺序无关,则可以将哈希链接起来:Hash(Hash(Hash(Hash(Hash(s0)|| s1)|| s2)) || s3)
$ \ endgroup $
–fgrieu♦
2011年8月22日23:13



#2 楼

大卫·瓦格纳(David Wagner),Crypto 2002的“广义生日问题” [Citeseer] [Slides]一文中分析了此问题(即生成第二张原像)。如果添加8个公钥,则攻击需要大约$ 2 ^ {64} $哈希计算,如果在哈希之前添加16个公钥,则复杂度约为$ 2 ^ {51} $哈希计算。