我有这样的代码,其中在编码中我将字母转换为字节,然后用一元按位补码翻转它们〜最后将其转换为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将解密的字节数组解码为字符串
(请注意,您目前所获得的并不是真正的加密-充其量只是混淆。)