【发布时间】:2014-06-02 09:06:51
【问题描述】:
你可以使用 BigInteger.isProbablePrime() 来生成密码安全的素数吗?他们需要什么确定性才能“安全”?
【问题讨论】:
标签: java cryptography primes biginteger public-key-encryption
你可以使用 BigInteger.isProbablePrime() 来生成密码安全的素数吗?他们需要什么确定性才能“安全”?
【问题讨论】:
标签: java cryptography primes biginteger public-key-encryption
我没有加密学位,所以对此持保留态度。
您有两个主要关注领域:
您的素数必须是不可预测的随机性。这意味着您需要使用诸如SecureRandom 之类的源来生成素数。无论您多么确定原始性,如果它们是可预测的,整个密码系统都无法实现其目标。如果您使用BigInteger(int bitLength, int certainty, Random rnd) 构造函数,则可以传入SecureRandom,因为它是Random 的子类。
您的潜在质数需要合理确定是质数(我假设您使用的算法依赖于因式分解的难度)。如果你得到一个可能的素数,但攻击者很有可能在 5 分钟内将其分解,因为它有一个从未被你运行的素数测试注意到的因素,那么你的算法有点不走运。通常使用 Rabin-Miller,this answer 声明 15 的确定性对于 32 位整数就足够了。最大为 40 is recommended 的值,超出此范围的任何值均无意义。
【讨论】:
这就是我为我的加密应用程序生成一个安全 BigInteger 的方式。
这是我的代码:
BigInteger b = new BigInteger(25, new SecureRandom());
由于加密应用程序也需要它,所以在我看来,获得BigInteger 是正确的。
注意:请记住,SecureRandom 对象在性能方面的成本很高。所以你不应该多次初始化它们。
在阅读了 cmets 之后,它进一步解决了 这是一种确保您更确定地获得质数的方法。
BigInteger b =BigInteger.probablePrime(25, new SecureRandom(););
【讨论】:
正如@hexafraction 所说,您需要使用SecureRandom() 来生成加密质量随机数。 Javadoc 说生成的素数是 2^-100 安全的。如果您想要更高的安全性(例如 2^-128 的 AES 等效安全性),则在其上运行更多的 Miller-Rabin test 迭代。每次迭代都会为您提供额外的 2^-2 安全性,因此 14 次迭代将使您达到 2^-128。
【讨论】: