簡體   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