簡體   English   中英

Java多部分RSA解密

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

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