2014-12-04 31 views
0

我想生成RSA密鑰生成的兩個素數。我認爲,爲了增加兩個素數的隨機性,隨機可能爲以下產生:如何正確使用SecureRandom中的setSeed()方法生成RSA素數

SecureRandom r = SecureRandom.getInstance("SHA1PRNG"); 
r.setSeed(1232); 
p = BigInteger.probablePrime(1024, r); 
q = BigInteger.probablePrime(1024, r); 

我的問題是:你認爲使用SecureRandom會增加pq隨機性?如果是這樣,我怎樣才能隨機設置setSeed()的值而不是固定值(這裏我選擇了1232)?

+2

我根本就不會調用'setSeed'。當您不調用'setSeed'時,'SecureRandom'會自動播種。 – CodesInChaos 2014-12-04 16:13:53

回答

1

在CodesInChaos已經顯示,SUN提供程序的默認實現自動使用系統隨機數生成器自行播種。由於Java本身沒有(顯式的)熵源,它或多或少依賴於系統的種子。

在SUN提供檢索從"SHA1PRNG"數據,這將使你的RNG(隨機數發生器)爲確定性RNG之前,您應該調用setSeed - 它將使用給定的種子,而不是添加種子的國家。換句話說,它將始終生成相同的僞隨機比特或值的流。

setSeed的初始呼叫可能因供應商不同而不同。有時候它會使用種子作爲種子,但它也可能只是將種子添加到當前狀態。在後來的Android版本(4.2版以後)中,種子剛剛添加到隨機狀態,因此"SHA1RNG"將保持完全隨機。

可能產生的隨機數發生器的最好辦法就是

SecureRandom r = new SecureRandom(); 

,讓Java運行時找出最佳的一個。

,如果你想使用一個明確的算法(它,然而,由SUN/Oracle的不適所描述的),那麼你可以使用:

SecureRandom r = SecureRandom.getInstance("SHA1PRNG"); 

在你的代碼。如果你想添加,使用方法:

// just used to make sure that the SecureRandom is seeded by the OS 
r.nextBytes(new byte[8]); 
r.setSeed(1232); 

的常數值或文字不包含多少(如果有的話)的熵。熵的一般來源是當前時間(或者甚至更好,System.nanoTime()),鼠標移動等


對於Java 8有一個新的方法getInstanceStrong()結合下面的描述:

返回一個SecureRandom通過使用securerandom.strongAlgorithms Security屬性中指定的算法/提供程序選擇的對象。

有些情況下需要較強的隨機值,例如創建RSA公鑰/私鑰等高價值/長期存在的密鑰時。爲了幫助指導應用程序選擇合適的強大的SecureRandom實現,Java發行版在securerandom.strongAlgorithms Security屬性中包含已知強SecureRandom實現的列表。

應該用哪個替代對構造函數的調用。被警告,這可能會返回一個阻止 RNG,即:一個RNG可能會阻塞你的線程,直到有足夠的熵可用。它也可能會耗盡您的操作系統熵池阻止其他應用程序,所以只能謹慎使用它。

+0

太棒了!謝謝:) – Mike 2014-12-05 09:56:05

+0

@ user2999915添加了Java 8的重要更新... – 2014-12-05 10:02:48

相關問題