我了解伪随机数生成器的用法。在这些和“真实”随机数生成器之间我并没有感到困惑。

但是,我不知道使用了什么真正的随机数生成器。
如果不确定性是不确定的,如何在算法中使用它?

评论

您需要一个真正的随机数生成器来播种伪随机数生成器。此外,大多数真正的随机数生成器都需要对随机输出进行后处理,这通常使用伪随机数生成器来完成。

@jug是的,熵源甚至可能对值0或1的位有特定的偏见。通常,您至少需要白化技术才能使某些东西看起来像一个随机数。将其作为种子植入PRNG无疑有助于获得正确的质量。注意不要将熵源与安全的随机数生成器混淆。

#1 楼

对于某些类型的算法(或协议),我们仅需要(攻击者)不可猜测的位数/数字,而不需要可再现的不可猜测的位数/数字(例如确定性PRNG)。

在这种情况下,从理论上讲,“真实”随机数(即从信息论的角度来看,而不是密码学上)更好,因为即使攻击者可以破坏我们的PRNG,也无法猜测(甚至影响)它们。

我现在可以想到的某些情况下,我们不需要确定性随机数:


密钥生成(对称和非对称)
用于分组密码操作模式的初始化矢量(通常与消息一起发送,因此相同的明文将不会导致下一条消息的密文可识别)
非对称加密中的随机填充(例如OAEP)
用于密码存储的盐(它们与哈希一起存储)
零知识证明中的挑战(发送给合作伙伴)
用于数字密码的随机值点火(DSA中的k

一个时间片(OTP)(在这里,为了安全起见,我们实际上需要“真实”随机数。)
在实践中,伪随机位更便宜,并且对于真实世界的攻击者一样安全(例如的资源受地球质量和宇宙生命的限制),只要PRNG不会中断并且有足够的熵输入作为开始。

(如果攻击者可以控制“真正的“随机”生成器,这甚至比好的PRNG还差。)

通常,对于这些用途,我们使用密码安全(确定性)PRNG和熵池的组合,该池被填充(并且重新填充)由操作系统收集的随机位。这将是不确定的PRNG。

评论


$ \ begingroup $
因此,基本上,REAL随机数生成器的用途是创建随机位,以减少熵,因为人类无法想到真正随机的数据
$ \ endgroup $
– Limzebedee
2011-09-20 5:43

$ \ begingroup $
增加熵。
$ \ endgroup $
–foo
16-09-6在10:17

#2 楼

True RNG的许多用法属于通常的生成类别,而无需持久存储,该值与其他确定的值极有可能发生差异。

与根据其他方式确定的任何值的概率在密码协议中非常有用。例如,在经典的CBC加密中,用同一密钥加密了多个消息,IV必须与先前的IV不同(这对于隐藏明文的可能重复是必要的),并且不同于IV的第一块的XOR。具有已输入或将要输入的分组密码的任何值的纯文本(在假定所有其他纯文本已知的情况下,确保第一个纯文本块的机密性是必需的)。
持久存储”要求排除了伪RNG,并大大简化了操作:在PRNG的情况下,需要对持久存储进行保密和/或完整性保护,这在基本的“女仆引导USB”常规计算机上是不可能实现的坚持”的安全威胁。有时候,没有持久性存储(从CD-ROM引导),或者速度有点慢。攻击,通常称为“掩盖”过程。例如,针对智能卡中使用的加密引擎的防止DPA的保护将随机数据用于此目的。在这里使用伪RNG会产生鸡与蛋的问题(因为安全PRNG使用加密算法);虽然这可能是可以解决的,但使用TRNG却更简单,更快。

#3 楼

这就是重点。使用伪随机数生成器,一个人可以(理论上)重复似乎是随机选择的相同数字序列(一个人只需要知道种子),而使用真正的随机数生成器则不能(需要知道输出的所有位。)

这对于生成对称和非对称密码系统的私钥很有用。通过使用真正的随机数生成器,密码分析程序无法像使用蛮力攻击那样轻易地猜测私钥。 (当然,如果PRNG的种子和状态足够大,那么实际上也没有办法。)这就是为什么每次生成私有文件时都要重新种子化(伪)随机数生成器是值得的键。