【问题标题】:Hashing and 'brute-force' permutations散列和“蛮力”排列
【发布时间】:2014-08-27 04:11:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 1) 否(鸽巢原则)2) 因为 1 是否:否。如果您尝试,将找到多种解决方案。很久以后……

标签: security hash permutation


【解决方案1】:

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 个字节中。

【讨论】:

    【解决方案2】:

    扩展对您的第一点的响应,cryptographic hash functions 的一个点是不可预测的。零冲突的函数是 1-1 (or one-to-one) function,之所以这么称呼是因为每个输入都有一个输出,每个输出也只有一个输入。

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

    • 在散列中,您有 message(未更改的原件)和 message digest(散列函数的输出。(Digest 这里的意思是“大量信息的总和或浓缩。”)
    • 使用encryption,您有纯文本密文。这意味着密文与原始文本具有相同的长度和复杂性。

    我将其视为具有 0 个冲突的加密哈希函数,其复杂性与加密相同。 (请注意,我不确定可变长度哈希输出的优势是什么,所以我asked a question 对此进行了讨论。)

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

    防止加密算法受到预计算攻击的另一件事是,任意长度输入的计算次数呈指数增长,实际上不可能存储您可能感兴趣的每个输入的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多