我在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如何实现而无需特殊的硬件支持即可产生实数?
答案 0 :(得分:0)
首先,您确定您的PC中没有专门设计的物理设备吗?英特尔在2013年将此类硬件添加到CPU中,而AMD在2015年采用了这种硬件。
第二,可以通过测量诸如物理过程之类的定时中的抖动来获得相当好的熵。
对于台式机或笔记本电脑而言,获得良好的熵并不难。 更具挑战性的地方是在受限环境中,例如智能卡或IoT设备在首次启动时(那里没有很多网络数据包-但您希望生成一个良好的公钥/私钥对)。