簡體   English   中英

Java/JCE:解密用 RSA 加密的“長”消息

[英]Java/JCE: Decrypting "long" message encrypted with RSA

我有一個包含在 byte[] 中的消息,用“RSA/ECB/PKCS1Padding”加密。 為了解密它,我創建了一個 Cipher c 並用

c = Cipher.getInstance("RSA/ECB/PKCS1Padding");

到目前為止,我只使用doFinal()方法解密了小消息,返回一個帶有解密字節的字節 []。

c.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptetBytes = c.doFinal(encryptedBytes);

但在這種情況下,數據更大(大約 500 字節),並且doFinal()方法拋出異常(javax.crypto.IllegalBlockSizeException:數據不得超過 128 字節)。 我想我需要使用update() - 方法,但我不知道如何讓它正常工作。 這是怎么做的?

我認為將 RSA 加密用於除密鑰傳輸之外的任何事情都是濫用。

為對稱密碼生成一個新密鑰並用它加密您的批量數據。 然后用 RSA 加密密鑰。 將對稱加密的密文與非對稱加密的內容加密密鑰一起發送給您的收件人。

使用 RSA,您只能加密/解密大小不超過您的密鑰長度減去填充長度的塊。 如果您的數據比您的密鑰長,那么它可能只是合並到一個數組中,因此您應該將其拆分為具有密鑰大小的塊(128 字節建議 1024 密鑰沒有填充,我不確定是否可能)。 在這里使用 update() 不是這種情況。

簡單地說,您必須知道這個數組是如何創建的。

一般來說,RSA 不應該用於加密大量數據,因為它非常耗時。 應該用於加密對稱密碼的密鑰,如 AES。

看看這里: https : //www.owasp.org/index.php/Digital_Signature_Implementation_in_Java

就像埃里克森說的,

您應該采取的加密步驟是:

  1. 生成 RSA 密鑰對(或從密鑰庫中檢索公鑰)
  2. 生成對稱密鑰 (AES)
  3. 使用 AES 密鑰加密數據
  4. 使用公共 RSA 密鑰加密 AES 密鑰
  5. 存儲(或使用私鑰發送給個人)加密的 AES 密鑰和 AES 加密數據

解密:

  1. 獲取與用於加密的密鑰對關聯的私鑰
  2. 使用私鑰解密 AES 密鑰
  3. 使用 AES 密鑰解密數據
  4. 使用數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM