给定两个不同的消息,A 和 B(可能是 20-80 个文本字符,如果大小很重要),A 的 MD5 摘要与 B 的 MD5 摘要和 A 的 SHA1 摘要相同的概率是多少?和 B 的 SHA1 摘要一样吗?那是:

(MD5(A) == MD5(B)) && (SHA1(A) == SHA1(B))

假设没有恶意意图,即不是为了发现冲突而选择消息。我只想知道这种情况自然发生的几率。

我认为可能性是“天文数字低”,但我不确定如何验证这一点。

更多信息:可能消息池的大小受到限制,但很大(数亿)。生日悖论的情况正是我所担心的。

最佳答案

假设随机字符串在 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%。如果按比例缩放(我不确定是否确实如此),这意味着当您有2^288 个哈希值的 6%。 2^288 的 6% 约为 2^284。您的 N(几亿)值(value)远不及此。与你的 S 相比,它实际上微不足道,所以我认为你没有什么可担心的。碰撞的可能性不大。

关于math - 两条消息具有相同的 MD5 摘要和相同的 SHA1 摘要的可能性有多大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1323013/

10-14 05:57