boost :: random_device的非Linux实现

时间:2009-01-06 21:56:47

标签: windows boost portability non-deterministic random

目前,Boost仅为Linux(可能是* nix)系统实现random_device类。有谁知道其他OS-es的现有实现?理想情况下,这些实现是开源的。

如果不存在,我应该如何为Windows和Mac OS X实施非确定性RNG?在提供此功能的任一环境中是否存在API调用?谢谢(抱歉所有问题)!

4 个答案:

答案 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