这篇文章指出
尽管 Mersenne Twister 是一个非常优秀的伪随机数生成器,但由于一个非常简单的原因,它本身在密码学上并不安全。可以根据生成器在任何给定时间的状态来确定生成器的所有未来状态,并且 624 个 32 位输出或 19,937 个一位输出足以提供该状态。建议在 Mersenne Twister 的输出上使用加密安全的散列函数,例如 SHA-1,作为获取密码学中有用的密钥流的一种方法。
但是没有关于为什么消化输出会使其更安全的参考资料。老实说,我不明白为什么会这样。Mersenne Twister 的周期为 2^19937-1,但我认为我的推理也适用于任何周期性 PRNG,例如线性同余生成器。由于安全单向函数 h 的属性,可以将 h 视为单射函数(否则我们可能会产生冲突),因此只需将值从其域以一对一的方式映射到其范围。
考虑到这一点,我认为散列值将产生与原始 Mersenne Twister 完全相同的周期性行为。这意味着如果您观察一个时期的所有值并且这些值开始重现,那么您完全能够预测所有未来值。
我认为这与基于密码的加密(PKCS#5)中应用的相同原理有关 - 因为密码域没有提供足够的熵,简单地散列密码不会增加任何额外的熵 - 这就是你需要的原因在散列密码之前对密码进行加盐。我认为同样的原则也适用于此。
一个最终说服我的简单例子:假设你有一个非常糟糕的 PRNG,它总是会产生一个“随机数”1。那么即使 SHA-1 是一个完美的单向函数,将 SHA-1 应用于输出也会总是产生相同的值,从而使输出的可预测性不亚于以前。
尽管如此,我还是愿意相信那篇文章是有道理的,所以我肯定忽略了一些东西。你能帮我吗?在很大程度上,我从我的论点中遗漏了种子值——也许这就是魔法发生的地方?