我有一个像这样的代码,在编码中我将字母转换为字节,然后用一元按位补码翻转它们〜最后将它转换为字符串.
之后,我想用类似的方法解密它.问题是,对于两个相似的输入字符串(但不相同),我得到具有相同哈希码的相同编码字符串.
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){
...
Run Code Online (Sandbox Code Playgroud)
您永远不应该使用new String(...)编码任意二进制数据.这不是它的用途.
此外,你应该只非常罕见使用默认的平台编码,也就是当你调用你所得到的String.getBytes(),并new String(byte[])没有指定的编码.
通常,加密将二进制数据转换为二进制数据.因此,将字符串加密为字符串的正常过程是:
Base64用于以无损方式将任意二进制数据编码为ASCII数据.解密只是扭转步骤的问题:
(请注意,您目前所拥有的并不是真正的加密 - 它充其量只是混淆.)