8

我有一个客户端和服务器 java 应用程序,它们需要加密文本相互传递。我正在使用 XOR 加密来加密我想要的文本。

问题是 readline() 不接受已异或的字符串,并且仅当它以字节为单位时才接受。

所以我在客户端将我的纯文本(字符串)转换为字节数组,并尝试在服务器端转换回字符串。

可悲的是,我正在寻找的结果仍然是胡言乱语,而不是我寻求的明文。

有谁知道如何使字节数组变回原始字符串?还是有更好的方法通过 readline() 函数发送 XOR 加密文本?

4

3 回答 3

19

在应用了 XOR 之类的东西之后,您最终会得到任意二进制数据——而不是编码字符串。

将任意二进制转换为文本的传统安全方法是使用base64 -不要试图从它创建一个新字符串。所以你的过程会是这样的:

  • 以纯文本作为字符串开始。
  • 使用 UTF-8、UTF-16 或类似的东西对纯文本进行编码。不要使用平台默认编码,或者像 ASCII 这样的限制性编码。你现在有一个字节数组。
  • 应用您的加密。(XOR 很弱,但让我们把它放在一边。)你仍然有一个字节数组。
  • 应用 base64 编码来获取字符串。

那么当你需要解密时...

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

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

于 2009-10-19T06:54:27.643 回答
7

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

            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);
于 2010-11-15T15:40:22.523 回答
1

首先,不要调用 XORing 加密。说真的,如果您需要保护您的数据,CipherOutputStream 和 CipherInputStream 就在那里。

感谢流链接,您可以拥有 DataOutputStream -> CipherOutputStream -> ByteArrayOutputStream。这将为您提供正确加密的字节。在另一端使用反向 API,你会得到你的字符串。

于 2009-10-19T08:03:32.230 回答