繁体   English   中英

使用BigInteger probablePrime函数进行RSA加密是否安全?

[英]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()应该是。 如果用于素数生成的随机数不是密码安全的,那么攻击者就有机会根据其他信息(例如时间或弱随机性源的先前输出)简单地重新创建那些随机数。

没有教科书RSA

您自己在做“所有事情”,看来您实际上是想使用它进行认真的加密。 如果是的话,那么您就缺少了一些关键的东西,那就是填充方案。

使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM