2012-04-24 46 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的呢?