目前,Boost 只random_device
为 Linux(可能是 *nix)系统实现类。有谁知道其他操作系统的现有实现?理想情况下,这些实现将是开源的。
如果不存在,我应该如何为 Windows 和 Mac OS X 实现非确定性 RNG?API 调用是否存在于提供此功能的任一环境中?谢谢(对所有问题感到抱歉)!
目前,Boost 只random_device
为 Linux(可能是 *nix)系统实现类。有谁知道其他操作系统的现有实现?理想情况下,这些实现将是开源的。
如果不存在,我应该如何为 Windows 和 Mac OS X 实现非确定性 RNG?API 调用是否存在于提供此功能的任一环境中?谢谢(对所有问题感到抱歉)!
在 MacOSX 上,您可以使用 /dev/random(因为它是 *nix)。
在 Windows 上,您可能需要 CryptGenRandom 函数。我不知道是否有使用它的 boost::random_device 的实现。
取决于你想用你的RNG做什么。
一般而言,您会将种子数据输入缓冲区,生成缓冲区的哈希值,将计数器混合到结果中并对其进行更多哈希处理。使用散列函数的原因是良好的散列旨在从更结构化的输入数据中产生看起来随机的结果。
如果你想将它用于密码学,事情会变得更加棘手。您需要跳过更多的障碍,以确保您的 RNG 在合理的安全范围内保持重复模式。我可以推荐 Bruce Schneier 的“Practical Cryptography”(关于 RNG 的介绍和示例实现)。他还收集了一些关于他的yarrow RNG 的与 RNG 相关的内容。
如果 boost 依赖于 /dev/random,它很可能也可以在 MacOS 上运行(因为它有)。
在 Windows 上,有 CryptoAPI 作为操作系统的一部分,它提供了加密质量的 RNG。
此外,我相信现代英特尔 CPU 在芯片上具有硬件 RNG - 但是您必须弄清楚如何在每个操作系统上实现这一点。使用更高级别的 API 可能是更好的选择。
编辑:这是英特尔 RNG 工作原理的链接
OpenSSL 有一个不错的。
#include <openssl/rand.h>
...
time_t now = time(NULL);
RAND_seed(&now, sizeof(now)); // before first number you need
int success = RAND_bytes(...);
if (!success) die_loudly();
RAND_cleanup(); // after you don't need any more numbers
Microsoft CryptoAPI 在 Win32 上有一个。它需要更多的函数调用。此处不包括详细信息,因为每个调用都有 2 到 5 个参数。请注意,CryptoAPI 似乎要求用户正确设置完整的本地配置文件(C:\Documents and Settings\user\Local Settings),然后才能为您提供随机数。
CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext