我有这样的代码,在编码中我将字母转换为字节,然后用一元按位补码翻转它们〜最后将其转换为字符串。
之后我想用类似的方法解密它。问题是,对于两个相似的输入字符串(但不相同),我得到具有相同哈希码的相同编码字符串。
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 将解密后的字节数组解码为字符串
(请注意,您当前所拥有的并不是真正的加密 - 充其量只是混淆。)
关于java - 具有负值的字节数组转换为字符串时是否会丢失信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322825/