std :: random_device的实现方式

时间:2018-10-29 02:41:19

标签: c++ random

我在Win7上使用MSVC 2017测试了以下迷你示例:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;
    std::cout << "entropy: " << rd.entropy() << std::endl;
    return 0;
}

令我惊讶的是,它输出“熵:32”。这意味着rd生成实随机数而不是伪随机数。我期待“熵:0”。据我了解,没有有限长度的代码能够生成实数,它需要一个真正的特殊设计的物理设备来生成。没有这样的设备连接到我的测试PC。

我的问题是:std :: random_device如何实现而无需特殊的硬件支持即可产生实数?

1 个答案:

答案 0 :(得分:0)

首先,您确定您的PC中没有专门设计的物理设备吗?英特尔在2013年将此类硬件添加到CPU中,而AMD在2015年采用了这种硬件。


第二,可以通过测量诸如物理过程之类的定时中的抖动来获得相当好的熵。

  • 网络数据包
  • 硬盘(如果硬盘是SSD则没什么用)
  • 鼠标移动
  • 键盘点击

对于台式机或笔记本电脑而言,获得良好的熵并不难。 更具挑战性的地方是在受限环境中,例如智能卡或IoT设备在首次启动时(那里没有很多网络数据包-但您希望生成一个良好的公钥/私钥对)。