2014-04-12 63 views
1

我需要爲密碼學中的學生作業生成隨機數。爲了加密的目的,在C中生成一個僞隨機數最簡單的方法是什麼?

起初我想用

srand(time(NULL)); 
int r = rand(); 

但是我讀了不應該用它來加密。 我想如果可能不是寫我自己的僞隨機數發生器。

爲了加密的目的,在C中生成僞隨機數的最快/最簡單的方法是什麼?

我在Linux上,我不介意答案不是跨平臺的。

+2

從/ dev/urandom中讀取 – paj28

+3

這是一個技巧性問題。有簡單的方法,有很好的方法,但沒有簡單的方法。密碼RNG是__hard__。 –

+0

除非你的解決方案有你沒有提到的要求,否則使用'/ dev/random'可能對學生作業足夠好,而使用'srand(time)'(實際上'rand( )')不是。 –

回答

2

沒有跨平臺的解決方案。在Linux上,從/dev/urandom(如果您喜歡複雜性,請撥打freadread)閱讀。從/dev/urandom讀取的字節適用於加密使用,除了新開始的嵌入式系統或缺乏熵的服務器。

文檔過於保守(源自安全性的理論概念,攻擊者擁有無限的計算能力,而不僅僅是使用全球所有計算機);在大多數情況下,it is perfectly fine to use /dev/urandom to generate cryptographic keys

如果你需要生成大量的隨機字節,你可能想實現一個pseudo-random number generator你的代碼中,並使用/dev/urandom只與熵種子吧。如果您只是生成幾個鍵和類似的少量材料,或者需要生成大量隨機數,但/dev/urandom的速度不是瓶頸,或者如果這是學校練習並且實施PRNG不是練習的重點,那麼只需從/dev/urandom讀取就可以了。

2

只有一個僞隨機數發生器是不夠的。你需要用足夠的熵播種它來啓動它。您可以通過設置通常從其中一個操作系統調用中檢索到的種子來完成此操作。你應該使用哪一個取決於你使用它的方法。如果你想要更高質量的隨機數,你可以在以後混入種子。

對於Linux系統:/dev/random返回的熵最大,/dev/urandom本身就是種子PRNG,可以直接由應用程序使用。 /dev/random然而,如果沒有足夠的熵可用,我建議/dev/urandom爲大多數目的。從/dev/random/中讀取太多可能會導致整個機器發生故障,因爲任何請求它的熵可能會停止。在其他操作系統上,/dev/random/dev/urandom只需鏈接到種子PRNG。

對於Windows請看this article on MSDN

+0

增加了另一個答案,我讀到你想編程你自己的PRNG,道歉。刪除了Java SHA1PRNG示例代碼。其餘的答案仍然有效,但我會推薦OpenSSL作爲API。 –

+0

由於OpenSSL的問題,我刪除了我的其他帖子。 –

相關問題