哈希和'暴力'排列

时间:2014-08-26 08:53:39

标签: security hash permutation

所以这是一个由两部分组成的问题:

  1. 是否有任何哈希函数可以保证对于相同长度的任何组合,它们会生成唯一哈希?我记得 - 大多数都是那样,但我只需要确认一下。

  2. 基于第一个问题 - 所以,给定一个文件哈希和一个长度 - 理论上是否可以“蛮力”?相同长度的所有字节排列,直到生成相同的散列 - 即。原始文件已重新创建?

  3. PS。我知道这需要很长时间(如果理论上可行),但我认为这对于小文件(大小<1KB)是可行的

2 个答案:

答案 0 :(得分:2)

1KB,那是1000 ^ 256,对吗? 1000个可能的字节组合(每个256个配置?)。这是一个真正的大数字。 1后面有768 0s。

如果你要生成所有这些,那么一个是正确的,但你会有一些碰撞。

根据这个security.SE post,md5(例如)的碰撞率约为1 ^ 2 ^ 64。所以,如果我们将原始数字除以那么,我们会得到多少种可能的组合,对吧? http://www.wolframalpha.com/input/?i=1000%5E256+%2F+2%5E64

  

~5.42×10 ^ 748

这仍然是要检查的很多文件。

如果有人在这里批评我的数学,我会感觉好多了,但重点是因为碰撞你的第一点不正确。您可以使用相同的排序数学来计算具有相同散列的两个1000个字符的密码。这是birthday problem。给了2个人,我们不太可能有同样的生日,但是如果你把房间充满,任何两个人生日相同的可能性会很快增加。如果您使用所有1000个字符的密码,其中一些将会发生冲突。您将从X字节转换为16字节。您不能将所有组合都放入16个字节。

答案 1 :(得分:0)

根据对第一点的回应进行扩展,cryptographic hash functions的一个点是不可预测的。零冲突的函数是1-1 (or one-to-one) function,因为每个输入只有一个输出,每个输出只有一个输入。

为了使函数接受任意长度&amp;复杂性输入而不产生冲突,很容易看出该函数必须具有任意长度输出。正如Gray倾斜指出的那样,大多数散列函数都有固定长度的输出。 (显然some new algorithms支持任意长度输出,但它们仍然不能保证0次冲突。)原因在常见的加密文献中没有明确说明,但考虑哈希和加密

  • 在散列中,您有消息(未更改的原始内容)和消息摘要(散列函数的输出。(Digest此处具有意思是“信息体的总和或凝聚。”)
  • 使用encryption,您可以使用纯文本密文。这意味着密文的长度和复杂程度与原始文本相同。

我将其视为具有0次冲突的加密散列函数与加密具有相同的复杂性。 (请注意,我不确定可变长度哈希输出的优点是什么,所以我asked a question关于它。)

此外,哈希函数容易受到预先计算的rainbow tables的攻击,这就是为什么所有仍被认为是安全的哈希算法都使用额外的随机输入,称为salts。加密不容易受到类似攻击的原因是加密密钥保密,您无法在不知道密钥的情况下预先计算输出值。比较symmetric key encryption(其中有一个必须保密的密钥)与public key encryption(其中加密密钥是公共的,解密密钥是私有的)。

阻止加密算法进行预计算攻击的另一个原因是任意长度输入的计算次数呈指数级增长,并且几乎不可能存储您可能感兴趣的每个输入的输出。