给出两个不同的消息,A和B(可能是20-80个字符的文本,如果大小完全重要),A的MD5摘要与B 的MD5摘要相同的概率是多少? A的SHA1摘要与B的SHA1摘要相同?那就是:
(MD5(A) == MD5(B)) && (SHA1(A) == SHA1(B))
假设没有恶意意图,即没有选择消息以找到冲突。我只是想知道这种情况发生的可能性。
我认为机会是“天文数字低”,但我不知道如何验证这一点。
更多信息:可能消息池的大小受到限制,但很大(数亿)。生日悖论的情况正是我所担心的。
答案 0 :(得分:63)
假设在随机字符串的MD5和SHA-1哈希范围内均匀分布(事实并非如此),并假设我们只讨论两个字符串而不是在谈论字符串池(所以我们避免生日 - 悖论型复杂性):
MD5散列是128位宽,SHA-1是160.根据上述假设,如果两个散列都发生碰撞,则两个字符串A和B有碰撞P的概率。所以
P(both collide) = P(MD5 collides) * P(SHA-1 collides)
并且
P(MD5 collides) = 1/(2^128)
P(SHA-1 collides) = 1/(2^160)
所以
P(both) = 2^-128 * 2^-160 = 2^-288 ~= 2.01 x 10^-87
同样,如果你有一个字符串池并且你正在尝试确定与池冲突的可能性,那么你就在birthday paradox的域中,这个我在这里计算的概率并不是'适用。那些和哈希并不像它们应该的那样统一。实际上你会有更高的碰撞率,但它仍然很小。
修改强>
由于您正处理生日悖论的情况,因此应将与解决方案相同的逻辑应用于生日悖论。让我们从一个哈希函数的角度来看它:
N := the number of hashes in your pool (several hundred million)
S := the size of your hash space (2^288)
Therefore,
P(There are no collisions) = (S!)/(S^N * (S - N)!)
让我们假设我们有一个很好的偶数哈希,如2 ^ 29(大约5.3亿)。
P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)
简而言之,我甚至不想考虑计算这个数字。我甚至不确定你如何估算它。你至少需要一个能够处理巨大因子而不会死亡的任意精度计算器。
请注意,概率将遵循在N = 1 or 2
时开始接近0的曲线,并且在N >= 2^288
时将达到1,其形状类似于维基百科页面上的生日悖论。
生日悖论在P = .5
时达到N = 23
。换句话说,当N是S的6%时,碰撞的概率是50%。如果那个尺度(我不确定它是否确实),这意味着当你有碰撞时有50%的碰撞几率2 ^ 288个哈希值的6%。 2 ^ 288的6%约为2 ^ 284。你的N(几亿)的价值远不及那个。与你的S相比,它实际上是微不足道的,所以我认为你没有什么可担心的。碰撞不太可能。
答案 1 :(得分:6)
Welbog的帖子的附录:
通过使用Stirling's approximation,可以在不使用任意精度算术的情况下计算大因子的比率:
N! ≈sqrt(2πn)*(n / e) n
所以(S!)/(S ^ N *(S-N)!)≈sqrt(2πS)/ sqrt(2π(SN))*(S / e) S /( (SN)/ e)的 SN / S ñ
= sqrt(S /(S-N))*(S /(S-N)) S-N * e -N
= sqrt(1 +α)*(1 +α) S-N * e -N 其中α= N /(S-N)小。
近似(1 + a / n) nx ≈e ax 保持为n→∞(或至少变得非常大)
**因此,这意味着(1+(N /(S-N))) S-N ≈e N 对于S-N>> Ñ
所以我希望
(S!)/(S ^ N *(S-N)!)≈slert(1 + N /(SN))* e N * e -N 对于SN,sup> = sqrt(1 + N /(SN))>> Ñ....
除了大于1 ...所以其中一个近似值不够好。 :P
(**警告:N / S必须很小:N = 22,S = 365,这是2倍)
答案 2 :(得分:4)
如果消息大小不受限制,则机会渐近逼近100%,因为有无数可能的消息和有限数量的可能哈希值。
(注意:编辑问题会使现在不那么重要)
答案 3 :(得分:1)
通常,当一个人随机选择N个元素时,计算预期碰撞次数比碰撞概率更容易。由于预期的碰撞次数不能小于碰撞的概率,因此它可以经常用作合适的上限。
假设 p 是两个随机挑选的元素碰撞的概率。如果我们选择N个随机元素,那么就有N *(N-1)/ 2对元素,因此预期的碰撞数量是
p * N *(N-1)/ 2。
例如,如果我们假设MD5和SHA1的碰撞概率为p = 2 -288 ,那么即使在随机挑选2个 100 元素后,我们仍然只期待大约2 -89 碰撞。
另一个例子:如果我们选择2个 30 随机元素并且只计算MD5。假设两个MD5哈希之间的碰撞是p = 2 -128 ,这给出了碰撞次数的预期数量2 -59 。因此,即使MD5哈希与两个输入发生冲突的概率已经非常小。
答案 4 :(得分:1)
所选答案不正确,因为它使用了错误的概率。我今天花了很多时间来研究这个(你可以在评论中看到我的思考过程),并且相信实际的答案如下(生日攻击的消息略大于你所说的) :
如果可以将这些概率相乘(我不确定),那就好了。
今天超级计算机是可行的(不到几个月,每年都在下降)。
请注意,这是基于足够大的消息池(使生日悖论有意义)。这也是你说你担心的情况。
现在,另一种情况是发现特定消息的一对哈希(SHA1和MD5)发生冲突。这会让你走出bday悖论的领域,并且难以达到数量级。我不确定那是2 ^( - 61 * 2)* 2 ^( - 18 * 2)还是别的。 如果有人知道这是什么,请发表评论(非常感谢!)。
现在你问:
给出两个不同的消息,A和B(可能是20-80个字符的文本,如果大小很重要的话)
是的,尺寸确实很重要。单击2 ^ -18图的链接,您将看到该值适用于两个输入块。在MD5中,输入块为512字节。文本的20-80个字符太小,单块值为2 ^ 41。
因此,对于该数据量,您得到2 ^ -61(我认为)* 2 ^ -41 = 2 ^ -102。
所以对于那个大小seems safe(链接包含两次当前比特币哈希值为SHA256的数字:46626.93 TH /秒)。