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)算法,但我找不到細節的什麼算法的功能實現。
由於SecureRandom
是Random
類的子類,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));
}
}
我已經在java中使用SecureRandom實現bn_rand_range。問題是,是否有一個函數的實現行爲像bn_rand_range,而不是bn_rand。 – diedthreetimes 2012-03-11 19:06:58
我已更新答案以顯示代碼以模仿bn_rand_range。你提到找到0到X之間的數字,所以我只用nextInt。如果你想要一個X和Y之間的範圍,你可以使用'random.nextInt(Y-X)+ X' – amccormack 2012-03-11 19:53:32
對不起,我忘了提X不是int,而是BigInteger。否則,你的方法就是我正在尋找的。 – diedthreetimes 2012-03-11 20:37:20