2012-02-25 41 views
3

具體來說,我只是想生成一個密碼安全的隨機數字,介於0和一些數字x是否有與OpenSSL的bn_rand_range相當的java?

在OpenSSL中,這是通過函數bn_range完成的。

我可以使用Java的BigInteger(int bits, Random r)構造函數(它生成一個從0到2的數字)自己實現它。但爲了安全起見,如果可能的話,我希望使用更好的測試算法。

在Java中有這樣一個標準的方法嗎?

P.S.我實際上使用Android,但我不知道如何在標準Java中執行此操作。

編輯:x是一個大整數存儲爲BigInteger

回答

1

據我所知,這個功能是不可提供。但實施自己很容易。

Random r = new SecureRandom();  
BigInteger q = something_big; 
BigInteger ans; 

do 
    ans = BigInteger(bits_in_q, r); 
while (ans.compareTo(q) >= 0); // bn_rand_range generates numbers < q 
3

Java提供了Random類的一個子類SecureRandom類。描述包括:

該類提供了一個密碼強的隨機數發生器(RNG)。許多實現都是僞隨機數生成器(PRNG)的形式,這意味着它們使用確定性算法從真隨機種子生成僞隨機序列。其他實現方式可以產生真正的隨機數,但其他人可能使用這兩項技術

Java提供的只是一個實現中,SHA1PRNG功能,結合其details作爲一個僞隨機數生成器(PRNG)算法:

該實現遵循IEEE P1363標準,附錄G.7:「擴展源位」,並使用SHA-1作爲PRNG的基礎。它計算SHA-1哈希上的真隨機種子值與64位計數器連接,每個操作增加1。從160位SHA-1輸出中,僅使用64位。

還應當指出的是,從OpenSSL中bn_rand_range功能也considered使用僞隨機數生成器(PRNG)算法,但我找不到細節的什麼算法的功能實現。

由於SecureRandomRandom類的子類,SecureRandom對象可以使用的Random所有方法包括.nextInt(int n)方法。該nextInt方法提供:

返回一個僞隨機均勻分佈的int值介於0(含)和指定值(不包括),從該隨機數生成器的序列繪製。

因此,產生的(0,100],你可以使用如下代碼範圍內的加密的強僞隨機數:

import java.security.SecureRandom; 
class secure{ 
    public static void main(String[] args) throws Exception{ 
     SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 
     System.out.println(random.nextInt(100)); 
    } 
} 
+0

我已經在java中使用SecureRandom實現bn_rand_range。問題是,是否有一個函數的實現行爲像bn_rand_range,而不是bn_rand。 – diedthreetimes 2012-03-11 19:06:58

+0

我已更新答案以顯示代碼以模仿bn_rand_range。你提到找到0到X之間的數字,所以我只用nextInt。如果你想要一個X和Y之間的範圍,你可以使用'random.nextInt(Y-X)+ X' – amccormack 2012-03-11 19:53:32

+0

對不起,我忘了提X不是int,而是BigInteger。否則,你的方法就是我正在尋找的。 – diedthreetimes 2012-03-11 20:37:20

相關問題