[英]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.