2012-02-25 38 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

相关问题