我看到英特尔似乎包含了一个新的汇编函数来获取从硬件获得的真实随机数。指令的名称是 RdRand
,但在 Internet 上似乎只有少量细节可以访问:http://en.wikipedia.org/wiki/RdRand
关于这条新指令及其在 C++11 中的使用,我的问题如下:
RdRand
生成的随机数真的是随机的吗? (每一位都是由不相关的白噪声或量子过程产生的?)是不是Ivy Bridge处理器的一个特殊功能,英特尔会在下一代cpu中继续实现这个功能吗?
如何通过C++11使用它?也许使用
std::random_device
但如果指令可用,编译器是否已经调用了RdRand
?如何在编译程序时检查是否真的调用了
RdRand
?
最佳答案
我设计了随机数生成器,为 RdRand 指令提供随机数。所以对于改变,我真的知道答案。
1) 随机数是从符合 SP800-90 AES-CTR DRBG 标准的 PRNG 生成的。 AES 使用 128 位 key ,因此数字具有高达 128 位的乘法预测阻力和超过 128 位的加法预测能力。
然而,PRNG 经常从一个完整的熵源重新播种。对于独立的 RdRand 指令,它将被重新播种。对于 4 个内核上的 8 个线程,尽可能快地拉动,重新播种的频率总是高于每 14 RdRands 一次。
种子来自真正的随机数生成器。这涉及一个 2.5Gbps 熵源,该源被馈送到使用 AES-CBC-MAC 的 3:1 压缩比熵提取器。
所以它实际上是一个 TRNG,但在重负载时会回退到短序列的加密安全 PRNG 的属性。
这正是 linux 上/dev/random 和/dev/urandom 之间的语义差异,只是快了很多。
熵最终是从量子过程中收集的,因为这是我们在自然界中所知道的唯一基本随机过程。在 DRNG 中,特别是 4 个晶体管的栅极中的热噪声驱动亚稳态锁存器的分辨率状态,每秒 25 亿次。
熵源和调节器旨在与 SP800-90B 和 SP800-90C 兼容,但这些规范仍处于草案形式。
2) RdRand 是标准英特尔指令集的一部分。 future 所有 CPU 产品都将支持它。
3) 您需要使用内联汇编或使用 RdRand 的库(如 openssl)。如果您使用一个库,该库将实现您可以直接实现的内联汇编程序。英特尔在其网站上提供了代码示例。
其他人提到了 librdrand.a。我写的。这很简单。
4) 只需在二进制文件中查找 RdRand 操作码即可。
关于c++ - C++11 和 RDRAND 的真随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29056093/