使用BigInteger.isProbablePrime()生成加密安全素数

时间:2014-04-17 22:02:41

标签: java cryptography primes biginteger public-key-encryption

您可以使用BigInteger.isProbablePrime()生成加密安全素数吗?他们有什么确定性是“安全的”?

3 个答案:

答案 0 :(得分:5)

我没有持有加密学位,所以请带上一粒盐。

您有两个主要关注领域:

  1. 你的素数需要无法预测随机。这意味着您需要使用SecureRandom之类的源来生成素数。无论您的素数多么确定,如果它们是可预测的,整个密码系统都无法实现其目标。如果您使用的是BigInteger(int bitLength, int certainty, Random rnd)构造函数,则可以将SecureRandom作为子类Random传递。

  2. 你的潜在素数需要合理地确定是素数(我假设你使用的算法依赖于因子的硬度)。如果你得到一个可能的素数,但是攻击者可以很好地在5分钟内将因子考虑在内,因为它有一个从未被你运行的素数测试注意到的因素,你对算法有点不合时宜。通常使用Rabin-Miller,this answer表示15的确定性足以支持32位整数。值高达40 is recommended,除此之外的任何内容都没有意义。

答案 1 :(得分:4)

这是我为加密应用程序生成安全 BigInteger的方式。

这是我的代码:

        BigInteger b = new BigInteger(25, new SecureRandom());

因为你在加密应用程序中也需要它,在我看来,获得BigInteger这种方式是正确的。 注意:请记住,SecureRandom对象的性能要求很高。所以你不应该多次初始化它们。

阅读评论后,它进一步发展 这是一种确保获得素数更加确定的方法。

 BigInteger b =BigInteger.probablePrime(25, new SecureRandom(););

答案 2 :(得分:1)

正如@hexafraction所说,您需要使用SecureRandom()来生成加密质量随机数。 Javadoc说生成的素数是2 ^ -100安全。如果您想要更高的安全性(例如,对于AES等效安全性,请使用2 ^ -128),然后在其上运行Miller-Rabin test的更多迭代。每次迭代都会给你额外的2 ^ -2安全性,所以十四次迭代会让你达到2 ^ -128。