具体来说,我只想生成一个介于0和某个数字 x 之间的加密安全随机数。
在OpenSSL中,这是使用函数bn_range
完成的。
我可以使用Java的BigInteger(int bits, Random r)
构造函数(生成0到2 位的数字)来实现它。但是,如果可能的话,我希望为了安全起见使用更好的测试算法。
在Java中有没有一种标准的方法可以做到这一点?
P.S。我实际上在使用Android,但我不知道如何在标准Java中使用它。
编辑: x 是一个存储为BigInteger
的大整数。
答案 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)算法,但我找不到有关什么算法的详细信息功能实现。
由于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));
}
}
答案 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