Java字符串转换为字节数组再转回字符串

8
我有一个客户端和服务器端的Java应用程序,需要在彼此之间传递加密文本。我正在使用XOR加密来加密所需的文本。
问题是readline()不接受经过XOR处理的字符串,只有在它是字节时才会被接受。
因此,我已经在客户端将明文(字符串)转换为字节数组,并尝试在服务器端将其转换回字符串。
可悲的是,我期望的结果仍然是乱码,而不是我要求的明文。
有人知道如何使字节数组变回原始字符串吗?或者是否有更好的方法通过readline()函数发送XOR加密文本?
3个回答

19

当你使用XOR之类的方法后,你会得到任意二进制数据 - 而不是编码后的字符串。

将任意二进制数据转换为文本的传统安全方式是使用base64 - 不要尝试直接从中创建一个新字符串。因此,您的过程应该是这样的:

  • 以纯文本字符串开始。
  • 使用UTF-8、UTF-16或类似编码对纯文本进行编码。 不要使用平台默认编码或任何限制性的编码(如ASCII)。现在你有了一个字节数组。
  • 应用加密算法。(XOR相当薄弱,但我们把它放在一边。)你仍然有一个字节数组。
  • 应用base64编码以获取字符串。

然后,当您需要解密时...

  • 应用base64 解码 将您的字符串转换为字节数组。
  • 应用您的二进制解密过程(例如再次使用XOR)。你仍然有一个字节数组。
  • 现在解码该字节数组以获取字符串,例如使用new String(data, utf8Charset)来获取原始字符串。

有各种Java base64库可用,例如Apache Commons Codec中的this class。(您需要encodeToString(byte [])decode(String)方法。)


+1. @NewJavaProgrammer- base64并没有被加密,但是它被编码了。 - RichardOD
1
@RichardOD - 实际上,@Jon的方法生成的base64既被编码又被加密了。 - Stephen C
是的-我不知何故没有看到“应用您的加密”这一部分。早上太早了! - RichardOD

7

来自http://www.mkyong.com/java/how-do-convert-byte-array-to-string-in-java/的答案:

在Java中,将字节数组转换为字符串的最佳方式是使用String类的构造函数。这个构造函数接受一个字节数组作为参数,并返回一个字符串。以下是示例代码:

// 字节数组
byte[] bytes = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100 };

// 将字节数组转换为字符串
String str = new String(bytes);

System.out.println(str); // 输出 "Hello World"

            String example = "This is an example";
               //Convert String to byte[] using .getBytes() function
            byte[] bytes = example.getBytes();
               //Convert byte[] to String using new String(byte[])      
            String s = new String(bytes);

1
首先,不要把XOR运算称为加密。如果你需要保护数据,CipherOutputStream和CipherInputStream是为你准备的。
感谢流链接,你可以使用DataOutputStream -> CipherOutputStream -> ByteArrayOutputStream来获取正确加密的字节。在另一端使用相反的API,你就能得到字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接