硬件与软件 RNG
您提到的第一件事是硬件噪声源。一些亚稳态现象的高精度测量足以产生不可预知的数据。这可以通过反向偏置齐纳二极管、环形振荡器、ADC,甚至盖革计数器来完成。我甚至可以测量击键之间的纳秒级延迟。如果硬件本身开始出现故障,这些噪声源可能会出现故障。例如,如果晶体管不是专门设计为在高电压下反向运行,它可能会发生故障。尽管这些技术具有不同程度的脆弱性,但这并不是您引用的文本中讨论的内容。
您提到的第二种 RNG 是一种称为伪随机数生成器 (PRNG * ) 的软件 RNG。这是一种算法,它需要一个种子,就像一个加密密钥,并将其扩展为无穷无尽的数据流。它试图确保在不知道算法开始时使用的秘密随机种子的情况下,无法预测数据,或者除了纯粹的随机性之外无法告知数据。在这种情况下,PRNG 是在纯软件中实现的,所以破解它只需要在代码中引入一个错误,这就是你引用的文本所说的。它只是脆弱的代码,如果对代码的更改偏离了算法的预期行为,则可能会完全失败。
PRNG 可以被认为是一种重新使用的加密算法。事实上,您可以通过使用像 AES 这样的密码来加密计数器来创建加密安全的 PRNG。只要加密密钥(种子)是秘密的,就无法预测输出,也无法发现种子。当你以这种方式思考时,就会更容易理解代码中一个小的、无关紧要的更改是如何完全破坏算法的安全性的。
收集随机性
那么现代设备实际上是如何收集随机性的呢?让我们在某个数据中心的某个地方安静地运行一个服务器。为了支持 TLS 之类的东西,它需要大量完全不可预测的数据,这些数据无法与真正的随机流区分开来。如果没有专用的硬件噪声源,随机性必须来自内部。计算机努力实现完全确定性,但它们有大量来自非确定性设备的输入。进入……打断!
在现代硬件中,中断是硬件发出的信号,用于提醒 CPU 状态变化。它允许 CPU 避免快速轮询每个硬件设备以获取更新,而是相信设备会在时机成熟时异步提醒它。当中断发生时,会调用中断处理程序来处理信号。事实证明,这个处理程序是获得随机性的理想场所!当您测量纳秒级的中断时序时,您可以快速获得相当多的随机性。这是因为各种事情都会触发中断,从到达 NIC 的数据包到从硬盘驱动器读取的数据。其中一些中断源是高度不确定的,例如依赖于执行器物理运动的硬盘驱动器。
一旦操作系统收集到足够的随机位,就可以将至少 128 位的小种子输入加密安全的 PRNG,以生成无限的伪随机数据流。除非有人能够准确地预测过去每次中断发生的时间,精确到纳秒级,否则他们将无法推导出种子,也无法预测未来的 PRNG 输出。这使得输出完全适合 TLS 密钥。
* 面向安全的 PRNG 称为加密安全 PRNG,或 CSPRNG。当应用程序调用 CSPRNG 时使用常规 PRNG 可能会导致安全漏洞。