![](/img/trans.png)
[英]What is the openssl equivalent of using java's KeyPairGenerator?
[英]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)算法,尽管我找不到该函数实现的算法的细节。
因为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));
}
}
据我所知,没有提供此功能。 但是很容易实现自己。
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.