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

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

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){
 ...

最佳答案

绝对不要使用new String(...)编码任意二进制数据。那不是它的目的。

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

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


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


Base64用于以无损方式将任意二进制数据编码为ASCII数据。解密仅需逆转步骤即可:


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


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

10-05 21:13
查看更多