gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:15:58 29 4
gpt4 key购买 nike

我看到英特尔似乎包含了一个新的汇编函数来获取从硬件中获取的真实随机数。该指令的名称是 RdRand,但在 Internet 上似乎只能找到少量详细信息:http://en.wikipedia.org/wiki/RdRand

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

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

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

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

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

最佳答案

我设计了为 RdRand 指令提供随机数的随机数生成器。所以换个方式,我真的知道答案。

1) 随机数由符合 SP800-90 AES-CTR DRBG 的 PRNG 生成。 AES 使用 128 位 key ,因此这些数字具有高达 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 指令集的一部分。 future 所有CPU产品都会支持。

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

其他人提到了 librdrand.a。我是这么写的。这很简单。

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

关于c++ - 使用 C++11 和 RDRAND 的真随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17616960/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com