2012-04-24 86 views
2

我想加密消息,該消息工作並將其作爲字節數組返回。然後,我將這個字節數組轉換爲一個字符串,以便通過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; 
} 
+0

你爲什麼不直接通過套接字發送字節?爲什麼要改成字符串? – Nikhar 2012-04-24 13:30:26

+0

@Nikhar - 這將是我最喜歡的方式,但不幸的是我正在集成到一個現有的系統,所以不是一個選項。 – Joseph 2012-04-24 13:44:28

+0

您應該將字符集傳遞給String構造函數。 – 2012-04-24 13:48:16

回答

4

管理使用Base64解決它。

 byte[] encryptedMsg = Base64.encodeBase64(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, "UTF-8"); 
     System.out.println("ENCRYPTED MESSAGE String Length: "+stringMessage.length()); 

     //Convert String back to Byte[] and decrpt 
     byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8")); 
     System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length); 
+0

感謝您發佈您的答案。對我正在嘗試做的事情有所幫助,以及使用Base64進行編碼的簡單解釋以及對它的很好用法。 – rwarner 2013-11-08 19:46:19

2

這是一個編碼問題。你有一個字節數組。它包含字節
2)您將其轉換爲字符串。 只要你這樣做,你有一個UTF16編碼字符串。所以你已經把這些字節變成了字符。
3)現在您可以將這些字符轉換回字節。但是,如果原始字節不是UTF8或UTF16,則可能沒有相同的字節數。如果平臺的默認編碼是MacRoman,則在第3步中,您將UTF16字符串轉換爲字節,但將字符視爲MacRoman。

+0

好的。我用encryptString函數更新了我的問題。這不意味着原始字節數組也是UTF-8?另外,我已經將UTF-8默認爲日食。 – Joseph 2012-04-24 13:34:58

0

我想有手動做加密的一個很好的理由,但以防萬一...你考慮使用SSLSocket的呢?