是否保证哈希函数的每个输出(例如SHA1,MD5等)都是可能的,或者相反,是否存在无法通过任何输入创建的任何输出值?换句话说,哈希函数是否是宾语?

如果这样,什么可以保证呢?如果不是,是否有可能通过比蛮力更快的攻击来发现这种不可能的输出?

评论

相关(但不一样,因为您的输入长度没有限制):散列单个512位块时,SHA-512是双射的吗?

在stackoverflow上重复:密码哈希函数是否达到每个可能的值,例如他们是客气的吗?

#1 楼

没有证据表明某些输入可以到达公用散列函数的每个输出,但是可以预期它是正确的。尚无比蛮力更好的方法来进行检查,而蛮力是完全不切实际的。

通过优惠券的收集器参数,预计需要$ 2 ^ n \ cdot(n \ cdot \ ln( 2)+ \ gamma)+ 1/2 + o(1)$随机值以达到所有$ n $位值,其中$ \ gamma \ approx 0.577216 $。

转换为哈希,大约假设这些散列充当随机函数,则要求$ 2 ^ {134.5} $(对于MD5)或$ 2 ^ {166.8} $(对于SHA-1)不同的消息才能达到所有输出值。这个假设是合理的,因为这是这些哈希的舍入函数的设计目标。

更新:正如Jon Callas在另一个答案中所述,可以构造明显不包含的哈希函数达到他们的全部产出;甚至某些在计算上是安全的。一个示例是$ \ mathcal {H'} = \ mathcal {H}(\ mathcal {H}(m)| 1)$,其中$ | $是按位OR,而$ \ mathcal {H} $是常见的哈希函数。 $ \ mathcal {H'} $的输出空间明显少于其输出空间的一半,但根据其他所有实验指标,除速度之外,它的精度都可能与$ \ mathcal {H} $相同。

评论


$ \ begingroup $
即使H(H(m))也可能不会达到很多输出空间。
$ \ endgroup $
– CodesInChaos
2012年5月30日19:54

$ \ begingroup $
是的,但不是很明显:-)
$ \ endgroup $
–fgrieu♦
2012年5月30日23:04



$ \ begingroup $
@fgrieu-没有可演示的。 H(m)将{0,1} ^ Infinity映射到{0,1} ^ N以获得N位哈希函数。因此,外部函数调用中的H(H(m))以{0,1} ^ N作为输入并将其映射到{0,1} ^ N。因此,如果我们假设存在一个碰撞(对于任何哈希函数,我们都以极大的可能性期望它们发生-它们打算作为随机预言而不是排列来进行攻击),那么根据信鸽原理,整个输出空间是无法达到的。
$ \ endgroup $
– jimbob博士
2013年6月9日7:47

$ \ begingroup $
@dr jimbob:随机预言$ R $达到$ R(R(m))$到达所有输出空间的可能性非常低。但是(从数学上使用的意义上)无法证明这一点到具体的哈希函数$ H $(例如SHA1或MD5)的结果。
$ \ endgroup $
–fgrieu♦
2013年6月9日10:55



#2 楼

没有一般性的答案,因为没有关于所有哈希函数的一般性声明。它取决于哈希函数以及它的压缩方式。它至少是一个区分符,最有可能表明存在较大的缺陷,但是该缺陷的大小取决于很多事情。

请考虑此512位哈希函数G = SHA512(MD5 (M))。

它不能生成所有512位可能的输出,因为它的输入仅限于MD5的输出。它还将与任何具有MD5碰撞的M和M'相撞。但出于其他目的,例如从PBKDF2的密码中获取密钥,就可以正常工作。 Ish。

Jon