Security 可预测随机数生成器在SHA-1输出后如何(如果有的话)变得更安全?

Security 可预测随机数生成器在SHA-1输出后如何(如果有的话)变得更安全?,security,random,cryptography,prng,entropy,Security,Random,Cryptography,Prng,Entropy,声明 尽管Mersenne Twister是一个非常好的伪随机数生成器,但由于一个非常简单的原因,它本身并不是加密安全的。可以根据发电机在任何给定时间的状态确定发电机的所有未来状态,624 32位输出或19937一位输出足以提供该状态。在Mersenne Twister的输出上使用加密安全的散列函数(如SHA-1)已被推荐为获取加密中有用的密钥流的一种方法 但没有人提到为什么消化输出会使它更安全。老实说,我不明白为什么会这样。Mersenne龙卷风的周期为2^19937-1,但我认为我的推理也适

声明

尽管Mersenne Twister是一个非常好的伪随机数生成器,但由于一个非常简单的原因,它本身并不是加密安全的。可以根据发电机在任何给定时间的状态确定发电机的所有未来状态,624 32位输出或19937一位输出足以提供该状态。在Mersenne Twister的输出上使用加密安全的散列函数(如SHA-1)已被推荐为获取加密中有用的密钥流的一种方法

但没有人提到为什么消化输出会使它更安全。老实说,我不明白为什么会这样。Mersenne龙卷风的周期为2^19937-1,但我认为我的推理也适用于任何周期PRNG,例如线性同余发生器。由于安全单向函数h的特性,人们可以将h视为内射函数(否则我们可能会产生冲突),从而以一对一的方式将值从其域映射到其范围

考虑到这一点,我认为散列值将产生与原始Mersenne Twister完全相同的周期性行为。这意味着,如果您观察一个周期的所有值,并且这些值开始重复出现,那么您完全能够预测所有未来的值

我假设这与基于密码的加密()中应用的相同原理有关-因为密码域没有提供足够的熵,简单地散列密码不会增加任何额外的熵-这就是为什么在散列密码之前需要对密码进行盐处理。我认为在这里也适用同样的原则

一个简单的例子最终说服了我:假设你有一个非常糟糕的PRNG,它总是会产生一个1的“随机数”。然后,即使SHA-1是一个完美的单向函数,将SHA-1应用于输出将始终产生相同的值,从而使输出的可预测性不低于以前


尽管如此,我还是想相信那篇文章有一些道理,所以我肯定忽略了什么。你能帮我吗?在很大程度上,我忽略了我的参数中的种子值-也许这就是神奇发生的地方?

梅森扭转器的状态由先前的
n
输出定义,其中
n
是重复的程度(一个常数)。因此,如果您直接从mersenne捻线机向攻击者提供
n
输出,他们将立即能够预测所有未来值


通过SHA-1传递值会变得更加困难,因为现在攻击者必须尝试反转RNG。然而,对于32位字大小,这不太可能严重阻碍确定的攻击者;他们可以建立一个彩虹表或使用其他一些标准方法来反转SHA-1,并且在发生碰撞的情况下,通过它们是否产生所观察到的RNG流来过滤候选。因此,mersenne twister不应用于加密敏感的应用程序、SHA-1掩蔽或no。可以使用多种方法来替代。攻击者能够基于相对较少的输出预测MT的输出,而不是因为它在如此短的时间内重复(不会),但是因为输出泄露了PRNG内部状态的信息。散列输出会掩盖泄漏的信息。正如@bdonlan所指出的,如果输出大小很小(例如32位),这没有帮助,因为攻击者可以很容易地枚举所有有效的明文并预先计算它们的哈希


使用超过32位的PRNG输出作为散列的输入将使这不切实际,但如果您需要此属性,则加密安全的PRNG仍然是一个更好的选择。

您的简单示例不是很有用,因为周期很小。相反,一个简单的例子是一个输出1,2,3,…,2^32-1,0,1,…,的生成器,。。。。状态是几个字节,周期很大。预测下一个值需要一个输出,但如果该值用秘密salt散列,则不需要输出。