所以这是一个由两部分组成的问题:
是否有任何哈希函数可以保证对于相同长度的任意组合,它们都会生成唯一哈希值?我记得 - 大多数都是这样,但我只需要确认这一点。
基于第一个问题 - 因此,给定文件哈希和长度 - 理论上是否可以“强力”相同长度的所有字节排列,直到生成相同的哈希 - 即。原始文件已重新创建?
PS。我知道这将需要很长时间(如果理论上可能的话),但我认为这对于小文件(大小 < 1KB)是可行的
最佳答案
1KB,那就是 1000^256,对吧? 1000 种可能的字节组合(每种有 256 种配置?)。这是一个真正的大数字。 1 后面有 768 个 0。
如果您要生成所有这些,其中一个是正确的,但会发生一定数量的冲突。
根据这个security.SE post ,md5(例如)的碰撞率约为 2^64 中的 1。那么,如果我们将原始数字除以该数字,我们会得到多少种可能的组合,对吗? http://www.wolframalpha.com/input/?i=1000%5E256+%2F+2%5E64
~5.42 × 10^748
还有很多文件需要检查。
如果有人在这里批评我的数学,我会感觉好多了,但关键是你的第一点由于冲突而不正确。您可以使用相同的排序数学来计算具有相同哈希值的两个 1000 个字符的密码。这是birthday problem 。给定 2 个人,我们不太可能有相同的生日,但如果你住满一个房间,任何两个人有相同生日的可能性会很快增加。如果您使用全部 1000 个字符的密码,其中一些密码将会发生冲突。您将从 X 字节变为 16 字节。您无法将所有组合放入 16 个字节中。
关于security - 哈希和 'brute-force' 排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25501714/