【发布时间】:2012-04-24 13:24:45
【问题描述】:
我正在尝试加密一条消息,该消息有效并将其作为字节数组返回。然后我将此字节数组转换为字符串,以便通过 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 - 这将是我的首选方式,但不幸的是我正在集成到现有系统中,所以这不是一个选择。
-
您应该将一个字符集传递给 String 构造函数。
-
将您的字符串构造为:
String stringMessage = new String(encryptedMsg, "UTF-8"); -
字符串旨在存储文本,而不是二进制数据。您不应该期望能够将二进制文件存储在字符串、写入器或读取器等文本组件中而不会损坏。