我想加密消息,該消息工作並將其作爲字節數組返回。然後,我將這個字節數組轉換爲一個字符串,以便通過tcp網絡消息發送。另一方面,我將字符串轉換回一個字節數組,然而結果數組更大,我找不到原因。我認爲這可能與編碼有關,就像我使用「MacRoman」一樣,我沒有這個問題,但是程序需要能夠在不支持這種編碼的系統上運行,所以我決定使用UTF -8。字節數組 - >字符串 - >字節用於加密文本的數組:不相同的大小
String message="222233332221";
//Encrypt message
byte[] encryptedMsg = encryptString(message, temp.loadCASPublicKey());
System.out.println("ENCRYPTED MESSAGE byte Length: "+encryptedMsg.length);
//Convert to String in order to send
String stringMessage = new String(encryptedMsg);
System.out.println("ENCRYPTED MESSAGE String Length: "+stringMessage.length());
//Convert String back to Byte[] and decrpt
byte[] byteMessage = stringMessage.getBytes("UTF-8");
System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);
輸出:
加密的消息字節長度:256
加密的消息字符串長度:235
加密的消息字節長度:446
任何一個可以請指出我爲何選擇正確的方向結果字節數組是446個字節而不是256個字節。
encryptString部分如下。我相信這會返回一個UTF-8的字節數組?
private static byte[] encryptString(String message, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherData = cipher.doFinal(message.getBytes("UTF-8"));
return cipherData;
}
你爲什麼不直接通過套接字發送字節?爲什麼要改成字符串? – Nikhar 2012-04-24 13:30:26
@Nikhar - 這將是我最喜歡的方式,但不幸的是我正在集成到一個現有的系統,所以不是一個選項。 – Joseph 2012-04-24 13:44:28
您應該將字符集傳遞給String構造函數。 – 2012-04-24 13:48:16