目前,Boost仅为Linux(可能是* nix)系统实现random_device
类。有谁知道其他OS-es的现有实现?理想情况下,这些实现是开源的。
如果不存在,我应该如何为Windows和Mac OS X实施非确定性RNG?在提供此功能的任一环境中是否存在API调用?谢谢(抱歉所有问题)!
答案 0 :(得分:2)
在MacOSX上,您可以使用/ dev / random(因为它是* nix)。
在Windows上,您可能需要CryptGenRandom功能。我不知道是否有使用它的boost :: random_device的实现。
答案 1 :(得分:1)
取决于您想要使用RNG for。
一般而言,您将种子数据提供到缓冲区中,生成缓冲区的哈希值,将计数器混合到结果中并将其哈希值更多。使用哈希函数的原因是,良好的哈希值旨在从输入数据中产生随机效果,结果更加结构化。
如果你想将它用于加密,事情会变得更加毛茸茸。你需要跳过更多的箍,以确保你的RNG在合理安全的限度内重复模式。我可以推荐Bruce Schneier的“Practical Cryptography”(关于RNG的介绍,以及一个示例实现)。他还有一些关于他yarrow RNG的RNG相关内容。
答案 2 :(得分:0)
如果boost依赖于/ dev / random,那么很可能它也适用于MacOS(就像它一样)。
在Windows上,CryptoAPI是操作系统的一部分,它提供了加密质量的RNG。
另外,我相信现代英特尔CPU在芯片上有一个硬件RNG - 但是你必须弄清楚如何在每个操作系统上实现这一点。使用更高级别的API可能是更好的选择。
编辑:这是英特尔RNG工作原理的link
答案 3 :(得分:0)
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个args。请注意,CryptoAPI似乎要求用户在为您提供随机数之前正确设置完整的本地配置文件(C:\ Documents and Settings \ user \ Local Settings)。
CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext