您可以使用BigInteger.isProbablePrime()生成加密安全素数吗?他们有什么确定性是“安全的”?
答案 0 :(得分:5)
我没有持有加密学位,所以请带上一粒盐。
您有两个主要关注领域:
你的素数需要无法预测随机。这意味着您需要使用SecureRandom
之类的源来生成素数。无论您的素数多么确定,如果它们是可预测的,整个密码系统都无法实现其目标。如果您使用的是BigInteger(int bitLength, int certainty, Random rnd)
构造函数,则可以将SecureRandom
作为子类Random
传递。
你的潜在素数需要合理地确定是素数(我假设你使用的算法依赖于因子的硬度)。如果你得到一个可能的素数,但是攻击者可以很好地在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。