【问题标题】:Theoretically hashing something 2^128 times with the MD5 algrithm [closed]理论上使用 MD5 算法散列 2^128 次 [关闭]
【发布时间】:2013-12-25 20:39:20
【问题描述】:

这纯粹是一个假设性的问题,但是如果您从 128 位开始,然后将它们散列 2^128 次,例如使用 MD5 算法,您最终会回到原来的位吗?是否会使用所有可能的组合?如果没有,是否有某些 nuber 比其他人更快地“回馈给自己”?

我认为这实际上是不可能实现的(在查看了我的计算器对 2^128 的答案之后...),我很确定不同算法的答案会有所不同,但这并不能阻止理论化,是吗?

是的,就是这样,希望有人对这个主题有更多的了解。期待看到答案,提前致谢!

编辑: 澄清一下:我对这个问题最感兴趣的是它是否会经历所有可能的位组合,或者是否有几个较小的循环,如果有任何额外的、相关的和有趣的信息,我们将不胜感激。 p>

【问题讨论】:

  • 对我来说,如果你有 128 位,那么你的集合中只有 2^128 个组合/项目。所以在某些时候,如果你将一个值散列 2^128 次,你会遇到冲突。
  • 显然必须有一些循环,因为值的数量是有限的。但并非每个数字都必须是循环的成员。这可能有点像康威的生命游戏:有一些周期性的配置,以及最终落入其中之一的其他配置。
  • 有些哈希是破坏性的,有些则不是。不知道MD5。使用破坏性哈希,您将永远不会(嗯,几乎永远不会)循环回来,但最终会“稳定”在少数模式上。
  • 这个问题是理论上的,不是实际的。
  • 一个排列可以分解为一组循环。将 128 位映射到 128 位时的 MD5 不是置换。相反,这看起来像一个循环和“尾巴”的集合。如果你迭代哈希 2^128 次,你必须以一个循环结束。

标签: math hash md5 theory


【解决方案1】:

一个好的加密哈希应该有一些但不能太多的循环,这使得为它创建彩虹表变得更加困难。这发生在 MD5 中 - 实际上 MD5 的一个问题是它有点容易为算法的给定哈希找到哈希冲突。这一弱点使得在使用 MD5 散列进行验证的文件中注入恶意数据在计算上是可行的。

我认为您认为 MD5 有一些 Fermat's little theorem 属性,但事实并非如此。散列函数可能很快就会开始循环,而且应该会。

还有一种非常节省内存的方法可以找到MD5 cycles。也可以看看MD5CRK

如果您真的想要一个 128 位 ID 的唯一“散列”,您应该使用特定数字和密钥的普通加密算法,例如 AES。这为您提供了一个“随机”、唯一的数字行,形成一个递增的 id,因为您始终可以以唯一的方式解密信息,给定用于加密数据的相同密钥。

【讨论】:

  • 在您的最后一段中,您拼错了“如果您真的想要 [...] 的唯一“散列”,您应该使用 HMAC en.wikipedia.org/wiki/Hash-based_message_authentication_code 的现有实现”
  • 嗯,不。如果您想要一个独特的、伪随机的 2^128 项长周期,您可以使用可逆加密/解密算法(AES 或其他),以保证您的 128 位递增 ID 的双射。如果你只是想要不时发生碰撞的东西,请使用 HMAC。
  • 对不起,我没有看到循环。您似乎建议使用块密码来获得 0 到 2^128-1 之间数字的随机排列。如果您需要的是一个排列,那就太好了,但是这个排列很少有机会成为 2^128 循环。
  • 你是对的,没有循环。您可以随时重置被加密的号码。
猜你喜欢
  • 2013-07-22
  • 2018-10-17
  • 2014-06-04
  • 2016-11-03
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多