本文 http://www.quadibloc.com/crypto/co4814.htm指出
尽管 Mersenne Twister 是一个非常好的伪随机数生成器,但由于非常简单的原因,它本身并不具有加密安全性。可以从生成器在任何给定时间所具有的状态确定生成器的所有未来状态,并且 624 个 32 位输出或 19,937 个一位输出足以提供该状态。建议在 Mersenne Twister 的输出上使用加密安全散列函数(例如 SHA-1)作为获取加密学中有用的密钥流的一种方法。
但没有任何参考资料说明为什么消化输出会使其更加安全。老实说,我不明白为什么会这样。 Mersenne Twister 的周期为 2^19937-1,但我认为我的推理也适用于任何周期性 PRNG,例如线性同余发生器也是如此。由于安全单向函数 h 的属性,人们可以将 h 视为单射函数(否则我们可能会产生冲突),从而简单地将值从其域以一对一的方式映射到其范围。
考虑到这一想法,我认为散列值将产生与原始 Mersenne Twister 完全相同的周期性行为。这意味着,如果您观察一个时期的所有值并且这些值开始重复出现,那么您完全能够预测所有未来值。
我认为这与基于密码的加密中应用的相同原理有关(PKCS#5 http://www.rsa.com/rsalabs/node.asp?id=2127) - 因为密码域没有提供足够的熵,简单地散列密码不会添加任何额外的熵 - 这就是为什么你需要在散列密码之前对密码进行加盐。我认为同样的原则也适用于此。
一个最终说服我的简单例子:假设你有一个非常糟糕的 PRNG,它总是会产生一个“随机数”1。那么即使 SHA-1 是一个完美的单向函数,将 SHA-1 应用于输出也会始终产生相同的值,从而使输出的可预测性不低于以前。
尽管如此,我还是相信那篇文章有一定道理,所以我肯定忽略了一些东西。你能帮我吗?在很大程度上,我从我的论点中遗漏了种子价值——也许这就是神奇发生的地方?
梅森扭曲器的状态由之前的定义n
输出,其中n
是复发程度(常数)。因此,如果你给攻击者n
直接从梅森扭曲器输出,他们将立即能够预测所有未来值。
通过 SHA-1 传递值会使事情变得更加困难,因为现在攻击者必须尝试反转 RNG。然而,对于 32 位字长来说,这对于坚定的攻击者来说不太可能是一个严重的障碍;他们可以构建彩虹表或使用其他一些标准方法来反转 SHA-1,并且在发生冲突时,根据候选者是否产生观察到的 RNG 流来过滤候选者。因此,梅森扭曲器不应用于加密敏感应用程序、SHA-1 掩码或无加密的应用程序。有许多标准 CSPRNG http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Standards可以用它来代替。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)