我有一个这样的代码,在编码中我将字母转换为字节,然后用一元按位补码翻转它们〜最后将它转换为字符串。
之后我想用类似的方法解密它。问题是,对于两个相似的输入字符串(但不相同),我得到相同的编码字符串,具有相同的哈希码。
String(字节)方法是否会丢失信息,因为字节是负数,或者我可以以某种方式检索它而不更改我的加密部分?
感谢名单
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){
...
答案 0 :(得分:7)
你应该从不使用new String(...)
来编码任意二进制数据。这不是它的用途。
此外,您应该只非常很少使用默认平台编码,这是您在未指定编码的情况下调用String.getBytes()
和new String(byte[])
时获得的。
通常,加密会将二进制数据转换为二进制数据。因此,将字符串加密为字符串的正常过程是:
Base64用于以无损方式将任意二进制数据编码为ASCII数据。解密只是扭转步骤的问题:
(请注意,您目前所拥有的并不是真正的加密 - 它充其量只是混淆。)
答案 1 :(得分:4)
您有效地将任意字节数据转换为String
。
那是不构造函数的用途。
采用String
的{{1}}构造函数旨在将平台默认编码中的文本转换为byte[]
。由于你所拥有的是 not 文本,因此行为将是“糟糕的”。
例如,如果您的平台默认编码是8位编码(例如ISO-8859- *),那么您将“仅”获取随机字符。
如果您的平台默认编码是UTF-8,那么可能会获取字符序列错误的随机字符和一些替换字符。
总结一下:不要这样做。我无法告诉你该怎么做,因为你想要实现的目标并不明显。