[英]Is using the BigInteger probablePrime function safe for RSA encryption?
我编写了一个代码,该代码能够生成2048位素数p&q并将其用于加密RSA中的消息。 我生成这些数字的方式是使用java.math.BigInteger包的probablePrime()函数。 我的问题是这些函数生成的素数在加密方面的加密强度如何。
这是我生成这些数字的代码,isPrime只是我编写的用于检查数字是否为质数的布尔函数。
BigInteger definitePrime(int bits, Random rnd) {
BigInteger prime = new BigInteger("4");
while (!isPrime (prime)) {
prime = BigInteger.probablePrime(bits, rnd);
}
return prime;
}
正如Stephen C在他的答案中指出的那样,素数对于RSA加密可能是可以的。
我要补充一点,您实际上不应使用任何Random
实例,而应仅使用系统最佳的SecureRandom
实现。
new Random()
不是加密的随机性源,而new SecureRandom()
应该是。 如果用于素数生成的随机数不是密码安全的,那么攻击者就有机会根据其他信息(例如时间或弱随机性源的先前输出)简单地重新创建那些随机数。
您自己在做“所有事情”,看来您实际上是想使用它进行认真的加密。 如果是的话,那么您就缺少了一些关键的东西,那就是填充方案。
使用BigInteger
方法来实现RSA使其易于工作是很容易的,但是不足以使其安全。 您需要使用填充方案,例如PKCS#1 v1.5(不再推荐)或PKCS#1v2 OAEP(推荐)。
与其为您的“手工” RSA实现这些填充方案,不如使用Java的Cipher
实例为RSA提供这些填充方案:
RSA/ECB/PKCS1Padding
RSA/ECB/OAEPWithSHA-256AndMGF1Padding
BigInteger.probablePrime()
的Javadoc说:
返回带有指定bitLength的正BigInteger(可能是素数)。 此方法返回的BigInteger合成的概率不超过 2 -100 。
2 -100表示在1,267,650,600,228,229,401,496,703,205,376中的一次机会; 即在〜1.267 * 10 30中有 1次机会
由于您尝试生成2个素数,因此大约10 30中有2次生成弱RSA密钥对的机会。
我以为那已经足够好了,但是如果您不这样认为,则可以使用BigInteger.isProbablePrime(certainty)
对您的主要候选人进行更高程度的确定性测试。
我的问题是这些函数生成的素数在加密方面的加密强度如何。
我不知道是否存在一种数学上严格的方法来量化加密算法的强度。 但是上面的分析告诉您,给定生成的密钥对将很弱/容易破解的可能性。
如果使用java.util.Random之类的东西代替SecureRandom的实例,则生成的素数是不安全的。 您的代码段没有告诉我们您正在使用什么,因此无法验证您的代码。 当然,您可能应该只使用JCE生成新的RSA密钥。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.