繁体   English   中英

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

[英]Is there a java equivalent to OpenSSL's bn_rand_range?

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

在OpenSSL中,这是通过函数bn_range完成的。

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

有没有一种标准的方法在Java中执行此操作?

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

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

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

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

Java提供只是一个实现中, SHA1PRNG功能,它详细介绍作为一个伪随机数生成器(PRNG)算法:

该实现遵循IEEE P1363标准,附录G.7:“源位扩展”,并使用SHA-1作为PRNG的基础。 它计算与64位计数器连接的真随机种子值的SHA-1哈希值,该计数器对每个操作递增1。 从160位SHA-1输出,仅使用64位。

还应该注意的是,OpenSSL的bn_rand_range函数也被认为使用了伪随机数生成(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));
    }
}

据我所知,没有提供此功能。 但是很容易实现自己。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM