使用C++ 11和RDRAND的真随机数

Vin*_*ent 16 c++ random assembly c++11 rdrand

我已经看到英特尔似乎已经包含了一个新的汇编函数来获取从硬件获得的真实随机数.该指令的名称是RdRand,但在互联网上只能看到少量细节:http://en.wikipedia.org/wiki/RdRand

关于这条新指令及其在C++ 11中的使用我的问题如下:

  1. 生成的随机数是否RdRand真的随机?(每个位是由不相关的白噪声或量子过程产生的?)

  2. 它是Ivy Bridge处理器的一个特殊功能,英特尔是否会继续在下一代CPU中实现此功能?

  3. 如何通过C++ 11使用它?也许有,std::random_deviceRdRand如果指令可用,编译器是否已经调用?

  4. 如何RdRand在编译程序时检查是否真的被调用?

Dav*_*ton 47

我设计了随机数发生器,为RdRand指令提供随机数.所以对于改变,我真的知道答案.

1)随机数是从符合SP800-90 AES-CTR DRBG的PRNG生成的.AES使用128位密钥,因此数字具有高达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是标准intel指令集的一部分.它将来会在所有CPU产品中得到支持.

3)您需要使用内联汇编或使用RdRand的库(如openssl).如果使用库,则库正在实现可以直接实现的内联汇编程序.英特尔在其网站上提供了代码示例.

其他人提到了librdrand.a.我写了那个.这很简单.

4)只需在二进制文件中查找RdRand操作码.


Pla*_*aHH 5

  1. 这当然取决于你对宇宙决定论的看法,因此更多的是一个哲学问题,但很多人认为它是随机的.
  2. 只有英特尔会知道,但由于有需要添加它,它可能会有需要保留它
  3. std::random_device不需要硬件驱动,即使它是,也不需要使用rdrand.您可以询问其double entropy() const noexcept成员函数是否是硬件驱动的.使用rdrand这是一个QoI问题,但我希望每个有理论的实现都可以这样做(我已经看过例如gcc这样做).如果不确定,您可以随时检查装配,但其他硬件随机性方法应该足够好(还有其他专用硬件可用).
  4. 如上所述,如果您对其是否只有硬件entropy感兴趣,请使用,如果对rdrand感兴趣,请扫描生成的机器代码.