2009-01-06 67 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