使用 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,功能有些相似。
如果你想生成加密强度高的随机数据,我建议你从这里开始。请记住,这仍然不如专用硬件随机生成器强大。但这对于大多数现实世界的用例来说已经足够了。
我正在尝试创建一个密码生成器。我使用了 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,功能有些相似。
如果你想生成加密强度高的随机数据,我建议你从这里开始。请记住,这仍然不如专用硬件随机生成器强大。但这对于大多数现实世界的用例来说已经足够了。