【发布时间】:2021-10-01 04:41:01
【问题描述】:
从今天开始,我遇到了一个与 byte[] 到字符串转换相关的非常奇怪的错误。
代码如下:
private static final byte[] test_key = {-112, -57, -45, 125, 91, 126, -118, 13, 83, -60, -119, 57, 38, 118, -115, -52, -92, 39, -24, 75, 59, -21, 88, 84, 66, -125};
public static void main(String[] args) {
byte[] encryptedArray = xor("ciao".getBytes(), test_key);
System.out.println("Encrypted arrray: " + Arrays.toString(encryptedArray));
final String encrypted = new String(encryptedArray);
System.out.println("Length: " + new String(encryptedArray).length());
System.out.println(Arrays.toString(encrypted.getBytes()));
System.out.println("Encrypted value: " + encrypted);
System.out.println("Decrypted value: " + new String(xor(encrypted.getBytes(), test_key)));
}
private static byte[] xor(byte[] data, byte[] key) {
byte[] result = new byte[data.length];
for (int i = 0; i < data.length; i++) {
result[i] = (byte) (data[i] ^ key[i % key.length]);
}
return result;
}
我的输出是:
Encrypted arrray: [-13, -82, -78, 18]
Length: 2
[-17, -65, -67, 18]
Encrypted value: �
Decrypted value: xno
为什么 length() 返回 2?我错过了什么?
【问题讨论】:
-
将密文转换为字符串并返回
byte[]时,您应用字符集编码。由于您没有定义特殊编码(顺便说一句,这很糟糕,应该始终指定编码!),因此使用默认编码,这显然会破坏密文。我可以使用 UTF-8 编码重现您的结果。对于任意二进制数据(如密文)的转换,必须应用像 Base64 这样的二进制到文本编码。或者,使用二进制数据,即直接解密encryptedArray而不是encrypted.getBytes()。 -
不使用base64和不直接解密
encryptedArray就没有办法得到正确的输出? -
您还可以应用字符集编码,在字节和字符之间进行 1:1 映射,例如ISO-8859-1。看看here。为此,您必须相应地设置默认编码或为每个编码 (
getBytes()) / 解码 (new String()) 明确指定编码。但这更像是一种解决方法,而不是长期解决方案。 -
Java 不是 C。不要使用字符串来保存任意字节序列。这就是字节数组的用途。
标签: java arrays encryption type-conversion xor