是否有一个等同于OpenSSL的bn_rand_range的java?

时间:2012-02-25 05:36:56

标签: java android security openssl

具体来说,我只想生成一个介于0和某个数字 x 之间的加密安全随机数。

在OpenSSL中,这是使用函数bn_range完成的。

我可以使用Java的BigInteger(int bits, Random r)构造函数(生成0到2 位的数字)来实现它。但是,如果可能的话,我希望为了安全起见使用更好的测试算法。

在Java中有没有一种标准的方法可以做到这一点?

P.S。我实际上在使用Android,但我不知道如何在标准Java中使用它。

编辑: x 是一个存储为BigInteger的大整数。

2 个答案:

答案 0 :(得分:3)

Java提供了Random类的子类,SecureRandom类。描述包括:

  

该类提供加密强随机数生成器(RNG)。许多实现采用伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真随机种子生成伪随机序列。其他实现可以产生真正的随机数,而其他实现可以使用两种技术的组合

Java只提供一个实现,即SHA1PRNG函数,它details作为伪随机数生成(PRNG)算法:

  

此实现遵循IEEE P1363标准,附录G.7:“源位扩展”,并使用SHA-1作为PRNG的基础。它计算与64位计数器连接的真随机种子值的SHA-1哈希值,该计数器对每个操作递增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));
    }
}

答案 1 :(得分: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