2008-11-17 53 views
2

我有一個包含在一個字節[]中的消息,用「RSA/ECB/PKCS1Padding」加密。對其進行解密我創建Cipher c和與Java/JCE:解密用RSA加密的「long」消息

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

發起它直到現在我只解密小消息,使用doFinal()方法,返回與該解密後的字節的字節[]。

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

但是,在這種情況下,數據是大(約500個字節),和doFinal() -method拋出異常(javax.crypto.IllegalBlockSizeException:數據必須不長於128個字節)。我想我需要使用更新() - 方法,但我不知道如何讓它正常工作。這是如何完成的?

回答

3

我想使用RSA加密的任何東西,但關鍵的運輸濫用。

爲對稱密碼生成一個新密鑰,並使用該密鑰對批量數據進行加密。然後用RSA加密密鑰。將對稱加密的密文連同非對稱加密的內容加密密鑰發送給收件人。

0

使用RSA,您只能加密/解密塊的大小,直到您的密鑰長度減填充長度。如果你的數據比你的密鑰長,也許它只是合併到一個數組中,所以你應該把它分成大小與你的密鑰(128字節建議1024鍵沒有填充,我不知道是否有可能)。這裏使用update()不是這種情況。

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

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

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

0

像埃裏克森說,

你應該採取加密的步驟如下:

  1. 生成RSA密鑰對(或密鑰存儲檢索公鑰)
  2. 生成對稱密鑰(AES)
  3. 使用AES密鑰加密數據
  4. 使用公共RSA密鑰加密AES密鑰
  5. 存儲(或發送給p與私鑰erson)加密的AES密鑰,以及AES加密數據

要解密:

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