[英]Java multipart RSA decryption
我正在服務器上使用phpseclib加密數據
$rsa->loadKey($encryptkey);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($str);
並在我的Java應用程序中接收它。 數據是384字節(3 * 128)。
在Java中我試圖解密它(它們的密鑰已經正確分發)但我得到了這個例外:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
以下是我正在使用的代碼。 我有2行data =
因為我很困惑這種情況是否算作多級解密,因此使用更新。 如果確實如此,我不明白如何使用update和doFinal來獲取解密數據(我的谷歌技能沒有在這里刪除它)。
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, pr);
data = cipher.update(encrypted_data);
data = cipher.doFinal();
System.out.println(data);
對於CRYPT_RSA_ENCRYPTION_PKCS1
,phpseclib將明文分解為適當大小的塊,並分別對每個塊進行RSA加密(請參閱此處從第2548行開始的代碼)。 Java拒絕這樣做 - 這是我認為的正確行為 - 只是拋出異常。
您必須在Java代碼中自己模擬phpseclib的行為。 您可以通過首先計算RSA模數的字節長度來實現此目的,例如:
int lenBytes = (((RSAKey)pr).getModulus().bitLength() + 7 ) / 8;
然后將加密數據分解為lenBytes
塊。 分別解密每個塊。 每次解密的結果將是最多lenBytes - 11
明文lenBytes - 11
長度為lenBytes - 11
個字節。 將所有明文連接在一起,可能使用像ByteArrayOutputStream
這樣的東西。
刪除update
行, doFinal
調用更改為doFinal(encrypted_data)
- 只需將其解密為單部分操作
進行多部分加密/解密的唯一原因是數據在內存中是不連續的(例如,如果您的加密數據是在3個不同的128位byte[]
,或者您正在使用IOstream) - 否則,總是通過將整個byte[]
放在doFinal
調用中來進行單部分加密/解密。 (我想也可以通過使用多部分加密/解密來並行加密/解密,但是我從來沒有足夠的懲罰來試圖實現這一點。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.