【问题标题】:Hash Cryptographic Function Output Anomolies哈希加密函数输出异常
【发布时间】:2012-01-13 19:03:12
【问题描述】:

任何人都知道 MD5、Whirlpool、SHA[n] 等是否有任何“特殊”输入可能会得到十六进制摘要输出以对齐:

  • 所有数字字符
  • 所有字母字符
  • 所有相同的字符/模式一致或完全重复

python中的示例:

>>> from hashlib import sha1
>>> hash = sha1('magic_word').hexdigest()
>>> hash
4040404040404040404040404040404040404040
>>> hash = sha1('^3&#b d   *#"').hexdigest()
aedefeebadcdccebefadcedddcbeadaedcbdeadc

这甚至可能吗?我对散列函数的了解仅限于在数据库中应用它们来存储密码,这基本上是没有的。

但有时我想知道,在测试碰撞时,是否会出现这类情况......

【问题讨论】:

    标签: cryptography hash hash-collision


    【解决方案1】:

    一个散列函数模拟一个随机预言机:对于每个输入,如果它之前还没有被查询过,我们会掷一些骰子来找到一个输出,然后把它记在书上。如果再次查询输入,只需返回这个旧值即可。

    通过将 16 面骰子投掷 40 次(对于每个输入),我们获得了足够的输出,可用于类似 SHA-1 的预言机。 (对于 MD5,我们只需要 32 次。)

    所以,我们可以计算“40 次只有字母”的概率为 (6/16)^40 ≈ 9.15·10^-18,“40 次只有数字”的概率为 (10/16)^40 ≈ 6.8 ·10^-9.

    由于“直到第一次成功所需的尝试次数”是几何分布的,我们平均需要 1/p 次尝试,即大约 10^17 次尝试“仅字母”,1.5 ·10^8 次尝试“仅数字” ”。

    (现在,SHA-1 不是真正的随机预言机,但没有已知的弱点可以说明 SHA-1 对其中之一的概率更好或更差。而现在,蛮力似乎真的是做到这一点的最佳方式。)

    【讨论】:

    • 我喜欢你回答的后半部分:如果你解释这一点,我会给你一个接受的答案投票:for each input, if it was not yet queried before, we throw some dice to find an output, then note it to some book。你在这里说的是数学,我猜?你在说什么书?
    • 这就是人们可以想象的随机预言机的工作原理......请查看Thomas' explanation on crypto.SE了解更多详细信息。
    • 您的链接破坏了我对全球银行卡和 ATM 的信任。 :D
    【解决方案2】:

    我确信通过正确的输入,这些类型的输出是可能的。为什么这有关系?只是好奇?

    【讨论】:

    • 在大多数情况下,是的,我只是好奇。我不是在寻找一种更有效地浏览彩虹表的方法或任何东西,请注意;)。每当我想到这样的愚蠢问题时,我就喜欢充实自己的知识。
    【解决方案3】:

    是的,这是可能的。给定正确的输入,可以输出任何所需的位模式。不过,可能需要几百万年才能找到正确的输入。

    对于相当宽的目标,例如所有 0-9 十六进制或所有 hex a-f,它应该相对容易。计算可接受输出在所有可能输出中的比例将帮助您估算运行时间。蛮力或随机搜索最终会找到击中目标的东西。对于像 MD4 这样的损坏的哈希,您可能能够减少预期时间。

    【讨论】:

      猜你喜欢
      • 2021-01-23
      • 2021-11-23
      • 2021-11-19
      • 2013-05-05
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多