使用 C++ 生成真正的随机数 (Windows 10 x64)

Generate truly random numbers with C++ (Windows 10 x64)

我正在尝试创建一个密码生成器。我使用了 random 库,在阅读文档后,我发现 rand() 依赖于算法和种子 (srand()) 来生成随机数。我尝试使用当前时间作为种子 (srand(time(0))),但这并不是真正随机的。有没有办法生成真正的随机数?或者可能非常准确地获取当前时间(例如,以微秒为单位)?我的平台是 Windows 10 x64.

不,这些不是真正的随机数。真正的随机性需要硬件支持。通常,它们通过对模拟生成的白噪声信号进行采样来工作。

可能您想为随机生成器设置一个始终不同的值。调用 time() 即可,或者您也可以通过当前 pid ( getpid() ) 对其进行哈希处理。

如果您使用 rand() 根据您的问题生成密码,那么我建议您使用某种加密方法,因为它们比 [=10] 生成的数字更强大且抗冲突=].使用类似 Openssl 或类似的东西。

如果不是,那么'peterh'建议的真正随机数需要硬件支持。然而,您可以使用比 rand() 更好的函数,例如 Mersenne Twister. It is a better generator than rand() as rand just uses a simple linear congruential generator. Read about mt_19937 here

如果没有专用硬件,PC 确实无法生成真正的随机数,但请记住,每台 PC 至少连接了一个硬件随机生成器 - 该设备就是您,坐在计算机前的用户。人是一种很随机的东西。每一个都有自己的按键速度、鼠标移动模式等。可以利用这些优势。

在 Linux 上你有一个特殊的设备,/dev/random 正是使用这个。当您在 PC 上工作时,它会收集随机数据(当然不是安全敏感数据),例如您敲击键盘的速度,以及与硬件相关的数据,例如中断之间的间隔和一些磁盘 IO 信息。这一切都会产生熵,后来用于生成伪随机数据,它仍然不是 100% 随机的,而是基于更强的随机种子。

我不是 Windows 方面的专家,但快速搜索显示 Windows 提供 CryptGenRandom API,功能有些相似。

如果你想生成加密强度高的随机数据,我建议你从这里开始。请记住,这仍然不如专用硬件随机生成器强大。但这对于大多数现实世界的用例来说已经足够了。