任何人都知道MD5,Whirlpool,SHA [n]等是否有任何“特殊”输入可能会将hexdigest输出对齐到:
python中的示例:
>>> from hashlib import sha1
>>> hash = sha1('magic_word').hexdigest()
>>> hash
4040404040404040404040404040404040404040
>>> hash = sha1('^3&#b d *#"').hexdigest()
aedefeebadcdccebefadcedddcbeadaedcbdeadc
这甚至可能吗?我对散列函数的了解仅限于在数据库中应用它们来存储密码的范围,基本上没有。
但有时我想知道,在测试碰撞时,可能会出现这种情况......
答案 0 :(得分:3)
哈希函数模拟随机预言:对于每个输入,如果之前尚未查询,我们会抛出一些骰子来查找输出,然后将其记录到某本书中。如果再次查询输入,只需返回旧值。
通过投掷16个骰子40次(对于每个输入),我们获得足够的输出用于像oracle这样的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对其中一个有更好或更差的概率。而现在,蛮力似乎真的如此是最好的方法。)
答案 1 :(得分:1)
我确信在正确的输入下,这些输出是可能的。为什么这有关系?只是好奇吗?
答案 2 :(得分:0)
是的,有可能。给定正确的输入,可以输出任何所需的位模式。可能需要几百万年才能找到正确的输入。
对于一个相当宽的目标,如所有十六进制0-9或所有十六进制a-f,它应该相对容易。在所有可能的输出中计算可接受输出的比例将帮助您估算运行时间。蛮力或随机搜索最终会找到击中目标的东西。对于破碎的散列,如MD4,您可能能够在预期的时间内完成某些操作。