首页 文章

从文件内容计算的MD5哈希的前4个字节会发生冲突的概率是多少?

提问于
浏览
8

这是一个组合学问题,需要一些哈希算法的理论 .

假设输入可以是30 kB到5 MB大小的任意随机字节序列(我想这会产生很多输入值的组合:))

对于不同的文件,从字节序列计算的MD5哈希的前4个字节(或前n个字节)的概率是多少?

如果不能专门为MD5哈希计算,那么生成均匀分布的m字节哈希值的任何哈希函数在给定输入范围的前n个字节上计算哈希与冲突的概率是多少?

6 回答

  • 4

    在没有关于字节值概率的更多信息的情况下,我想它在2 ^ 32中是1 .

    EDIT . 实际上,如果您使用的是十六进制字符而不是纯字节,那么1 ^ 2 ^ 16 .

    EDIT 基于评论:

    MD5可以被认为是计算值绝对随机的统一吗?

    MD5哈希算法的设计使得输入中的一个小变化导致完全不同的哈希,所以我会说MD5哈希字节以相同的概率分布(我不会在它上面打赌任何东西) . 无论如何,您可以对哈希值应用后处理(例如,您可以使用keyed MD5)来增加其随机性(并使其更安全,顺便说一句,因为plain MD5 hashes have been proved to be insecure) .

  • 0

    对于理想的散列函数,输出是均匀分布的,因此两次碰撞的机会是2 ^ 32中的一个 . 然而,生日悖论告诉我们,如果我们比较所有的哈希值,我们应该期望看到一次碰撞,一旦我们有2 ^ 16个哈希值,平均而言 - 所以不要只依赖于4个字节的基础上“我的 Value 低于40亿” .

    正如我们所知,MD5不是一个理想的散列函数,但这里的弱点有些偶然:在4个字节上发现碰撞完全在合理的暴力攻击范围内,所以不需要求助于加密弱点 . 如果您只关心随机选择的数据,那么您将不会看到随机性的显着统计偏差 .

  • 3

    如果你对具有相同4字节散列的两个特定输入的几率感兴趣,那么它只是1/2 ^ 32 . 如果您对具有相同赔率的一组X总输入中的两个输入的几率感兴趣,那么这将保持相当低,直到您开始接近您的集合中的2 ^ 16 = 65536个不同输入,其中它达到接近50%(这种现象被称为生日悖论) .

    通常,哈希函数在加密上有用的标准之一是所有比特的一致性 .

  • 1

    由于birthday paradox,因此在n位散列中发生碰撞的几率约为1 ^ 2 ^(n / 2) - 因此在这种情况下约为1 ^ 2 ^ 16 . 如果由于某种原因你指的是使用32位的十六进制编码,当然那只是前16个实际位,那么碰撞的几率大概是1 ^ 2 ^ 8 .

    给定一个特定的固定文件,随机选择的任何其他文件与该文件具有相同散列的几率约为2 ^ n . 在密码哈希方面,这些差异首先是碰撞,另一个是原像 .

    在这个散列大小,MD5的弱点是非常无关紧要的,因为对MD5的最着名的攻击大约需要2 ^ 32次计算,而在大约2 ^ 16次计算中,即使是理想安全的32位散列也可以产生冲突(因为仅仅选择随机输入,你有1到2 ^ 16的碰撞几率,所以在大约2 ^ 16个随机猜测之后,你可能会发现一对碰撞的输入) .

  • 8

    MD5哈希值通常为十六进制,因此每个字节有16个可能的值 . 因此,对于四个字节,存在16 * 16 * 16 * 16 = 65536种可能的组合,使得散列冲突的概率为1:65536 .

  • 3

    md5是十六进制的,因此每个字符可以是16个等位基因中的任何一个 . 所以这会使 16^n

    对于4个字符,这使得65536种不同的可能组合 .

相关问题