我很想知道 STM32F4XXXX MCU 中的 RNG(随机数发生器)外设。请参阅本参考手册(第 748 页)。另一方面,我们在 stdlib 库中有 rand() 函数来执行相同的任务。现在我有两个问题:
- rand() 函数和 RNG(随机数生成器)外设之间有什么区别(优点和缺点)?
- 看这部分:
请解释这两个选项(尤其是第二个选项)。
我很想知道 STM32F4XXXX MCU 中的 RNG(随机数发生器)外设。请参阅本参考手册(第 748 页)。另一方面,我们在 stdlib 库中有 rand() 函数来执行相同的任务。现在我有两个问题:
请解释这两个选项(尤其是第二个选项)。
戴夫的回答很好地恢复了它,但要澄清一下第二个选项:
真正的硬件随机数生成器使用物理熵源。这种熵源可能是宇宙辐射、电噪声、来自反向偏置二极管(或 BJT 晶体管)的雪崩效应、chua 电路等。熵源的确定性越低,随机输出的质量就越好。理想的熵源是使用量子物理效应,或者不可能用确定性方程建模的东西。
随机数生成器的另一个重要因素是熵源每单位时间可能仅生成有限量的熵。一个很好的例子是chua电路:虽然它很随机,但速度很差,不可能用于实际应用。
在许多具有内置 RNG 的处理器/微控制器中,使用了从 2 个时钟到 4 个时钟的时钟漂移,这些时钟被故意不正确地同步。然后,他们使用模拟和数字滤波器来进一步随机化模式并将结果移入寄存器。执行此类过滤需要几个周期,这解释了在新值可用之前给定时钟所需的最小周期数。
时钟漂移不完全是量子效应,因此可以建模,但它足够随机,因为它取决于很多参数,例如温度、硅工艺、工作频率、电噪声、背景辐射等.
在硬件 RNG 没有足够吞吐量的应用程序中(例如在要求很高的加密应用程序中),使用硬件 RNG 作为伪随机数生成器的种子非常常见,例如 sdtlib 中的 rand() 函数。然而,这样的应用程序通常会提供更好的 rand() 实现,该实现是专门设计为从种子运行的,该种子可能经常被丢弃,带有真正的随机值。在具有集成硬件 RNG 的较新 Intel 处理器中,伪随机算法部分直接集成在芯片中,因此由硬件执行,产生非常高的随机吞吐量。
如果您介意 rand() 方法本身,它只是一个数学表达式,旨在生成足够大的熵。足够大,取决于应用程序:对于加密密钥生成,随机性需要比您最喜欢的音乐播放器中简单随机随机播放所需的随机性更高。很明显,随机输出的质量越高,随机数的计算成本就越高。
随机数所涉及的操作与计算文件的 MD5 哈希所涉及的操作非常相似:它们尝试使用一种位雪崩效应,以便种子值中的单个位更改会改变整个生成模式。作为旁注,我不建议使用 MD5 作为伪随机数生成器;这只是一个例子。它既低效又不那么随机,但重点是:如果您将相同的文件提供给 MD5 hasing 算法,您将始终获得相同的确定性输出,几乎与您始终获得相同输出的方式相同如果您输入相同的种子,则使用 rand() 函数,除非您的实现依赖于某些任意元素,例如当前时间。
关键区别在于rand()
库函数是一个伪随机数生成器——给定任何特定的起始(种子)值,它总是会产生相同的数字序列。
另一方面,RNG 外围设备是一个真正的随机数发生器,它会产生不可重复的数字序列。
您概述的两个主题可以相对容易地描述:
假设一个人设计了一个机械轮盘旋转器,它使电机通电一段时间,等待轮盘和球停止,并观察球在哪个口袋中。通常在每次旋转后,球和轮子会最终在一个稍微不同的地方,并且在一次旋转后球位置的微小变化可能会对它在下一次旋转时的最终位置产生巨大的影响。因此,即使电机始终通电相同的时间长度,球在一次旋转中落入的口袋也将独立于它在之前的旋转中落入的位置。
然而,现在假设其中一些数字具有或发展出轻微的凹陷,并且电机的轴承发展出扁平点。然后一些旋转将是随机的,但是在导致球落入凹陷处并且轴承位于平坦点的旋转之后,下一次旋转很可能会偏向于与发生的最后一次旋转具有相同的结果。如果大多数旋转没有同时击中草皮和平坦点,它们的存在可能不会对事情产生太大影响。另一方面,如果一个草皮/平面组合恰好放置在正确的位置,使得那里的球可以合理地一致地落在第二个,并且恰好放置一个以便将球送回第一个,那么一个最终会出现一些极其扭曲的行为。
如果在 4 和 23 降落后,下一个旋转是 4,这并不一定表示有问题。在这种情况下,4 应该出现大约 1/38 的时间。此外,随机数据的采集应该只捕获袋号,因为对于球应该多久停在袋的各个部分中没有任何有用的信息。尽管如此,对于记录数字的任何人来说,也可以“观察”球在口袋中停止的位置并观察任何不寻常的模式,这可能是有用的。位置的分布可能会向前或向后倾斜而不表示存在问题,但如果分布中出现狭窄的尖峰,则可能会引起关注。
如果来自随机发生器的连续读数在统计上是独立的,那么补偿偏差并不困难(尽管所需的时间是不确定的)。然而,如果生成器处于读数不独立的状态(例如上述车轮的循环状态),则补偿基本上变得不可能——因此需要硬件 RNG 包括检测此类行为的电路。