是否可以滥用使用相同私钥签名的许多消息的集合来伪造签名以便一些(但不是所有可能的)消息,或者更糟糕的是重建该私钥而不是使用公钥?
签名过多会损害私钥吗?
如果签名算法有任何好处(并且与以正确且适当随机的方式生成的足够大的密钥一起正确使用),那么在实践中,答案是否定的:访问许多现有签名不允许攻击者伪造新的,更不用说重新计算私钥了。
从理论的角度来看:大多数(实际上所有)签名方案都是从对要签名的消息进行散列开始的,而签名实际上是在散列值上计算出来的。因此,如果攻击者拥有消息M的现有签名S,该签名 S 散列为h(M),并找到消息M'使得h(M) = h(M'),那么S也是M的有效签名'(“有效签名”是指“验证者将接受的签名”)。因此,一种可能的攻击方式是尝试虚假消息M'的许多变体,直到找到一个散列到相同h(M)的变体而不是现有的签名,此时攻击者已经伪造了一个新的签名(更准确地说,已经成功地为新消息回收了现有的签名)。
这是对哈希函数的二次原像攻击。拥有许多现有签名为攻击者提供了更多目标,这使得攻击更容易。但更容易并不容易。“正常”签名算法将使用足够强大且输出足够宽的散列函数,对于任何实际数量的目标,第二原像攻击都不可行。下面放一些数字:对于 160 位散列函数(例如 SHA-1),针对一个目标的第二原像攻击的成本约为2 160;如果攻击者可以收集一百万个现有签名,成本下降到大约2 140:这容易一百万倍,但仍然太难(例如,见那里)。
不过请注意细则:我坚持正确使用算法。例如,考虑 DSA(或其椭圆曲线变体 ECDSA)。在计算签名时,您需要为给定的素数q生成一个在[1..q-1]范围内均匀选择的随机值k (每个签名都需要一个新的随机k )。如果选择在某些方面存在偏差,则可能会被利用来进行密钥恢复攻击。一个极端的例子是 Sony-PS3 的崩溃,他们使用了一个固定的k值,不管要签名的消息如何,总是相同的。这是非常错误的:两个已知签名足以重建私钥。更一般地说,Bleichenbacher(十几年前)已经证明,如果k是通过取与q大小相同的随机位串来选择的,然后减少模q,然后轻微的偏差足以从大约2 63 个已知签名(对于 160 位q)重建私钥。
当然,在那种情况下,问题在于不允许攻击者看到很多签名,而是不正确地使用算法。实现加密算法是硬的(孩子,不要在家里做!)。
例如,如果数据是视频帧,并且操作模式是 ECB 或没有随机 IV,它可以潜在地通过预测源数据的变化来恢复密钥。例如,某些卫星加密就是这种情况。