我设计了随机数生成器,为 RdRand 指令提供随机数。所以换一个,我真的知道答案。
1) 随机数由符合 SP800-90 AES-CTR DRBG 的 PRNG 生成。AES 使用 128 位密钥,因此这些数字具有高达 128 位的乘法预测阻力和超过 128 位的加法预测阻力。
然而,PRNG 经常从全熵源重新播种。对于孤立的 RdRand 指令,它将重新播种。对于 4 个内核上的 8 个线程尽可能快地拉动,它的重新播种总是比每 14 个 RdRands 一次更频繁。
种子来自真正的随机数生成器。这涉及使用 AES-CBC-MAC 将 2.5Gbps 熵源输入到 3:1 压缩比熵提取器中。
因此,它实际上是一个 TRNG,但它在重负载时会回退到用于短序列的加密安全 PRNG 的属性。
这正是 Linux 上 /dev/random 和 /dev/urandom 之间的语义差异,只是快了很多。
熵最终是从一个量子过程中收集的,因为这是我们在自然界中所知道的唯一基本随机过程。在 DRNG 中,特别是 4 个晶体管栅极中的热噪声驱动亚稳态锁存器的分辨率状态,每秒 25 亿次。
熵源和调节器旨在符合 SP800-90B 和 SP800-90C,但这些规范仍处于草案形式。
2) RdRand 是标准 intel 指令集的一部分。未来所有CPU产品都会支持。
3)您要么需要使用内联汇编,要么需要使用 RdRand 的库(如 openssl)。如果您使用库,则该库正在实现您可以直接实现的内联汇编器。英特尔在其网站上提供了代码示例。
其他人提到了 librdrand.a。我是这么写的。这很简单。
4) 只需在二进制文件中查找 RdRand 操作码。