我想加密消息,该消息工作并将其作为字节数组返回。然后,我将这个字节数组转换为一个字符串,以便通过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