2011-05-20 123 views
10

我想編碼一個簡單的字符串「測試」來回。Java RSA加密

public static String encode(Key publicKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    byte[] byteData = data.getBytes(); // convert string to byte array 

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object 
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); // initialize object's mode and key 

    byte[] encryptedByteData = cipher.doFinal(byteData); // use object for encryption 

    return new String(encryptedByteData); // convert encrypted byte array to string and return it 

} 

public static String decode(Key privateKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    byte[] byteData = data.getBytes(); // convert string to byte array 

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object 
    cipher.init(Cipher.DECRYPT_MODE, privateKey); // initialize object's mode and key 

    System.out.println(byteData.length); 

    byte[] decryptedByteData = cipher.doFinal(byteData); // use object for decryption 

    return new String(decryptedByteData); // convert decrypted byte array to string and return it 

} 

然而,儘管加密工作得很好(算法是「RSA」),試圖解密我剛剛從加密「測試」得到的字符串時,我得到異常以下:

javax.crypto.IllegalBlockSizeException:數據長度不能超過256字節

我應該將加密的字節分成256塊以便能夠解密嗎?

回答

9

您不能可靠地將隨機字節轉換爲String。結果將取決於您在運行此計算機的機器上默認的字符編碼。使用許多編碼,密文將被破壞,信息將會丟失。

修改代碼以使用byte[],而不是(在了「doFinal()`方法的結果。

如果您需要將byte[]轉換爲字符串,請使用類似的Base-64的編碼。

+0

啊,完美,謝謝,完美無缺!是的,我猜想腐敗是當我將加密的字節數組轉換爲字符串。 – arik 2011-05-20 21:05:44

4

here

RSA算法只能加密具有在比特RSA密鑰長度的最大字節長度 與八個減去11填充 字節劃分,即最大字節數的數據=鍵長度以位/ 8 - 11. 如果要加密較大的數據,則使用較大的密鑰,例如 4096位的密鑰將允許您加密501字節的數據。

+1

儘管我已經使用與Google搜索結果完全相同的措辭閱讀了該句子,但將鍵設置得更高對我來說並不適用。我測試了加密的字節數組長度,並注意到在將密鑰長度從2048提高到4096時,字節數組的長度也是如此,在任何情況下都不適合,在這兩種情況下,我都有異常。 – arik 2011-05-20 21:02:05

3

如果你有一個很長的數據,你應該把它分成適合和加密/解密每個數據塊的數據塊(不是一個好主意),或者使用對稱算法(AES/DES/RC4/etc)對它們進行加密/解密),用RSA公鑰對對稱密鑰進行加密併發送給另一側(更好的主意)

第二種方法是一種非常常見的方法,因爲非對稱加密算法比對稱算法(用於加密和解密)要昂貴得多。

+0

謝謝。當數據實際上超過限制時,我會這樣做,但這不是加密像「test」這樣的簡單字符串時出現的問題。 – arik 2011-05-20 21:12:36

+0

是的,我誤解了你的問題,但我認爲這對未來是一個很好的建議。祝你好運! – MByD 2011-05-20 21:15:25