真正的随机值生成器
要生成可用于加密的真随机值,必须将 std::random_device
用作生成器。
#include <iostream>
#include <random>
int main()
{
std::random_device crypto_random_generator;
std::uniform_int_distribution<int> int_distribution(0,9);
int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10000; i++) {
int result = int_distribution(crypto_random_generator);
actual_distribution[result]++;
}
for(int i = 0; i < 10; i++) {
std::cout << actual_distribution[i] << " ";
}
return 0;
}
std::random_device
的使用方式与使用伪随机值生成器的方式相同。
然而,如果非确定性源(例如,硬件设备)不可用于实现,则可以根据实现定义的伪随机数引擎来实现 std::random_device
。
通过 entropy
成员函数 (当生成器完全确定时返回零) 可以检测到这样的实现,但许多流行的库(GCC 的 libstdc ++和 LLVM 的 libc ++)总是返回零,即使它们使用高质量的外部随机性。