我想将TEA加密的结果(byte [])转换为String,然后再将其转换为byte []并检索相同的byte []。
//Encryption in the sending side
String stringToEncrypt = "blablabla"
byte[] encryptedDataSent = tea.encrypt(stringToEncrypt.getBytes());
String dataToSend = new BigInteger(encryptedDataSent).toString());
//Decryption side in the reception side
byte[] encryptedDataReceived = new BigInteger(dataToSend).toByteArray();
然而,当我尝试这个时:
System.out.println(new String(encryptedDataSent));
System.out.println(new String(encryptedDataReceived));
boolean equality = Arrays.equals(encryptedDataReceived,encryptedDataSent);
System.out.println("Are two byte arrays equal ? : " + equality);
输出结果为:
&安培; H7" PAtj݄IZ`H-JKF
&安培; H7" PAtj݄IZ`H-JKF
两个字节数组是否相等? :false
因此,当我们打印它时,看起来两个byte []是相同的,但它们与我们看到的“false”不完全相同,这是我之后执行的解密的问题。
我还尝试发送String with new String(byte[])
,但是当我们想要将其转换回字节[]
我希望在开头和转换字节之后具有完全相同的byte [] [] - > String-> byte []
您是否有解决方案或了解我在转换中遇到的错误?
答案 0 :(得分:3)
请勿尝试将byte[]
转换为String
,就像它是常规编码文本数据一样 - 它不是。它是一个任意的字节数组。
最简单的方法是将其转换为base64或hex - 这将导致ASCII文本可以被可逆地解码回相同的二进制数据。例如,使用public domain base64 encoder:
String dataToSend = Base64.encodeBytes(encryptedDataSent);
...
byte[] encryptedDataReceived = Base64.decode(receivedText);
答案 1 :(得分:1)
尝试在解密中使用 byte [] encode = Base64.encode(bytesToStore,Base64.DEFAULT)
答案 2 :(得分:0)
你不能。 try:
if Person.query.filter_by(id = 1).count() > 0:
do_something_when_record_exists()
except OperationalError:
do_something_when_theres_no_record()
finally:
other_code()
不是二进制数据的容器。它是UTF-16字符的容器。字符和字节之间的往返无处可靠。
答案 3 :(得分:-1)
尝试明确指定charset。 UTF-8适用于重大案例:
public static void main(String[] args) {
String in = "幸福";
try {
byte[] bytes = in.getBytes("utf-8");
String out = new String(bytes, "utf-8");
System.out.println(in + " -> " + out);
System.out.println("equals: " + out.equals(in));
} catch (UnsupportedEncodingException unsupportedEncodingException) {
// do something
}
}
请注意,当字节数组保持不变时,您将获得完全相同的结果。