我正在尝试加密消息,该消息可以正常工作并将其作为字节数组返回。然后我将此字节数组转换为字符串,以便通过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);
输出:
ENCRYPTED MESSAGE字节长度:256
加密消息字符串长度:235
ENCRYPTED MESSAGE字节长度: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 :(得分: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);
答案 1 :(得分:2)
这是一个编码问题。
1)你有一个字节数组。它包含字节
2)您将其转换为字符串。 一旦执行此操作,您就拥有UTF16编码的字符串。所以你已经取了字节并将它们改成了字符
3)您现在将这些字符转换回字节。但如果原始字节不是UTF8或UTF16,则可能没有相同的字节数。如果平台的默认编码是MacRoman,那么在步骤3中,您将UTF16字符串转换为字节,但将字符视为MacRoman。
答案 2 :(得分:0)
我想有一个很好的理由手动进行加密,但以防万一......您是否考虑使用SSLSocket?