2

我有这样的代码,在编码中我将字母转换为字节,然后用一元按位补码翻转它们〜最后将其转换为字符串。

之后我想用类似的方法解密它。问题是,对于两个相似的输入字符串(但不相同),我得到具有相同哈希码的相同编码字符串。

String(bytes) 方法是否会因为字节为负数而丢失信息,或者我可以在不更改加密部分的情况下以某种方式检索它?

谢谢

static String encrypt(String s){
        byte[] bytes=s.getBytes();
        byte[] enc=new byte[bytes.length];

        for (int i=0;i<bytes.length;i++){

            enc[i]=(byte) ~bytes[i];
        }


        return new String(enc);
    }

 static String decrypt(String s){
 ...
4

2 回答 2

7

永远不应该使用new String(...)来编码任意二进制数据。这不是它的目的。

此外,您应该很少使用默认平台编码,这是您在调用时得到的String.getBytes()并且new String(byte[])没有指定编码。

通常,加密将二进制数据转换为二进制数据。因此,将字符串加密为字符串的正常过程是:

  • 将字符串转换为已知编码的字节(例如 UTF-8)
  • 加密二进制数据
  • 使用 base64 将加密的二进制数据转换回字符串。

Base64 用于以无损方式将任意二进制数据编码为 ASCII 数据。解密只是颠倒步骤的问题:

  • 将 base64 文本转换回字节数组
  • 解密字节数组
  • 使用 UTF-8 将解密的字节数组解码为字符串

(请注意,您目前所拥有的并不是真正的加密——充其量只是混淆。)

于 2013-06-26T14:28:14.177 回答
4

您有效地将任意字节数据转换为String.

不是构造函数的用途。

采用 a的String构造函数byte[]旨在将平台默认编码中的文本转换为String. 由于您拥有的不是文本,因此行为将是“坏的”。

例如,如果您的平台默认编码是 8 位编码(例如 ISO-8859-*),那么您将“仅”获得随机字符。

如果您的平台默认编码是 UTF-8,您可能会得到随机字符和一些用于格式错误的字节序列的替换字符。

总结一下:不要那样做。我不能告诉你该怎么做,因为你想要达到的目标并不明显。

于 2013-06-26T14:27:32.410 回答