2009-01-06 79 views
1

目前,Boost仅实现Linux(可能是* nix)系统的random_device类。有谁知道其他操作系统的现有实现?理想情况下,这些实现将是开源的。boost :: random_device的非Linux实现

如果不存在,我应该如何去实现一个非确定性的RNG for Windows以及Mac OS X? API调用是否存在于可提供此功能的任一环境中?谢谢(并对所有问题抱歉)!

回答

2

在MacOSX上,您可以使用/ dev/random(因为它是* nix)。

在Windows上,您可能需要CryptGenRandom函数。我不知道是否有使用它的boost :: random_device的实现。

1

取决于你想使用你的RNG。

一般而言,您可以将种子数据提供给缓冲区,生成缓冲区的哈希值,将计数器混合到结果中并进行哈希处理。使用哈希函数的原因是,良好的哈希被设计用于从更结构化的输入数据中产生随机的结果。

如果你想使用它来进行密码学,事情会变得非常麻烦。你需要跳过更多的篮圈,以确保你的RNG在合理的安全范围内保持重复模式。我可以推荐Bruce Schneier的“Practical Cryptography”(有关RNG的介绍和示例实现)。他还获得了一些有关RNG的RNG相关内容。

+0

更好地使用该平台的加密RNG,而不是自己实现一个 – orip 2009-01-06 22:17:20

+0

@orip:再次取决于使用情况。为了加密的目的,一些平台的RNG留下了一些需要的东西。 – 2009-01-06 22:20:26

0

如果boost依赖于/ dev/random,它也可能在MacOS上正常工作(就像它那样)。

在Windows上,CryptoAPI作为操作系统的一部分,并提供加密品质的RNG。另外,我相信现代英特尔CPU在芯片上有一个硬件RNG - 但是你必须弄清楚如何在每个操作系统上实现这一点。使用更高级别的API可能是更好的选择。

编辑:这里有一个link英特尔RNG是如何工作的

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个参数。请注意,CryptoAPI似乎要求用户在给予您一个随机数之前已经正确设置了完整的本地配置文件(C:\ Documents and Settings \ user \ Local Settings)。

CryptAcquireContext // see docs 
CryptGenRandom 
CryptReleaseContext