0

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

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

python中的示例:

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

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

但有时我想知道,在测试碰撞时,可能会出现这种情况......

4

3 回答 3

3

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

通过将 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 对其中一个具有更好或更差的概率。就目前而言,蛮力似乎是最好的方法来做到这一点。)

于 2011-12-06T18:22:44.250 回答
1

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

于 2011-12-06T04:53:13.240 回答
0

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

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

于 2011-12-06T15:00:46.757 回答