Math 两条消息具有相同MD5摘要和相同SHA1摘要的可能性有多大?

Math 两条消息具有相同MD5摘要和相同SHA1摘要的可能性有多大?,math,md5,sha1,digest,hash-collision,Math,Md5,Sha1,Digest,Hash Collision,给定两个不同的消息,A和B(如果大小很重要,可能是20-80个字符的文本),A的MD5摘要与B的MD5摘要相同,A的SHA1摘要与B的SHA1摘要相同的概率是多少?即: (MD5(A) == MD5(B)) && (SHA1(A) == SHA1(B)) 假设没有恶意意图,即未选择消息以查找冲突。我只是想知道这种情况自然发生的几率 我认为可能性是“天文数字上的低”,但我不确定如何验证这一点 更多信息:可能消息池的大小受到限制,但很大(数亿)。生日悖论的情况正是我所担心的。假设随

给定两个不同的消息,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)

所以

同样,如果你有一个字符串池,并且你试图确定与该池发生冲突的概率,那么你在的域中,而我在这里计算的概率不适用。这和散列并不像它们应该的那样一致。实际上,碰撞率会高得多,但仍然很小


编辑

由于您正在处理生日悖论的情况,请应用与生日悖论解决方案相同的逻辑。让我们从一个散列函数的角度来看:

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亿)

简言之,我甚至不想考虑计算这个数字。我甚至不知道你怎么去估计它。你至少需要一个任意精度的计算器,可以处理巨大的阶乘而不会死亡

请注意,当
N=1或2
时,概率将遵循一条从接近0开始的曲线,当
N>=2^288
时,概率将达到1,形状类似于维基百科页面上的生日悖论


N=23
时,生日悖论达到
p=.5
。换句话说,当N是S的6%时,冲突的概率是50%。如果按比例计算(我不确定是否如此),这意味着当您有6%的2^288个哈希时,冲突的概率将是50%。2^288的6%约为2^284。你的价值N(几亿)远没有达到这个水平。与你的s相比,它实际上微不足道,所以我认为你没有什么可担心的。冲突不太可能发生。

如果消息大小不受限制,则概率接近100%,因为可能存在无限多的消息和有限数量的散列


(注意:编辑到问题使这一点不再那么重要了)

韦尔博格文章的附录:

大阶乘的比率可以通过以下方式计算,而无需使用任意精度的算法:

n!≈ sqrt(2πn)*(n/e)n

所以(S!)/(S^N*(S-N)!)≈ sqrt(2πS)/sqrt(2π(S-N))*(S/e)S/((S-N)/e)S-N/SN

=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≈ eax作为n持有→ ∞ (或者至少变得非常大)

**这意味着(1+(N/(S-N)))S-N≈ eN代表S-N>>N

所以我希望

(S!)/(S^N*(S-N)!)≈ sqrt(1+N/(S-N))*eN*e-N=sqrt(1+N/(S-N)),用于S-N>>N

除了这个大于1。。。所以其中一个近似值不够好:p


(**注意:N/S必须很小:对于N=22,S=365,这是2的一个系数)

通常,当随机选取N个元素时,计算预期碰撞次数比计算碰撞概率更容易。由于预期的碰撞次数不能小于碰撞概率,因此可以经常将其用作合适的上限

假设p是两个随机选取的元素碰撞的概率。如果我们选取N个随机元素,则有N*(N-1)/2对元素,因此预期的碰撞次数为

p*N*(N-1)/2

例如,如果我们假设MD5和SHA1的碰撞概率均为p=2-288,那么即使随机选取2100个元素,我们仍然只预期约2-89次碰撞


另一个例子:如果我们选取230个随机元素,只计算MD5。假设两个MD5哈希之间的冲突为p=2-128,则冲突数量的预期数量为2-59。因此,即使MD5散列对两个输入发生冲突的概率也已经非常小。

选择的答案是不正确的,因为它使用了错误的概率。我今天花了很大一部分时间研究这个问题(你可以在对答案的评论中看到我的思考过程),并相信实际答案如下(对于比你所说的稍大的消息的生日攻击):

*=2^79中的一次碰撞

如果可以将这些概率相乘(我不确定)

这是可以做到的(不到几个月,每年下降)由超级计算机今天

注意,这是基于足够大的消息池(使生日悖论有意义)。这也是你所说的你所关心的情况

现在,另一种情况是为特定消息的一对哈希(SHA1和MD5)查找冲突。这将带你走出bday悖论的领域,难度要大几个数量级。我不确定这是2^(-61*2)*2^(-18*2)还是其他什么<如果有人知道那是什么
P(both) = 2^-128 * 2^-160 = 2^-288 ~= 2.01 x 10^-87
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)!)
P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)