[英]Problem when converting bytes [] to string, then back to byte[]
在嘗試使用AES和RSA建立安全連接時,我發現當我嘗試將密鑰轉換為字符串以通過網絡發送時,然后再次將其轉換為byte []。 值已更改。 您可以查看下面涉及的代碼以了解我的想法。
public class test {
public static String asHex (byte buf[]) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10)
strbuf.append("0");
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
String r = new String(raw,"UTF-8");
System.out.println(asHex(raw));// prints for example fd812245c9bfc4106294d51bf27e3796
byte[] t = r.getBytes("UTF-8");
System.out.println(asHex(t)); // prints for example : efbfbd2245c9bfefbfbd1062efbfbdefbfbd1befbfbd7e37efbfbd
}
}
這是因為原始字節數組轉換為UTF-8字符串。 由於並非每個字節序列都是有效的UTF-8字符串,因此String構造函數可以在轉換為有效字符串時對其進行修改。
當您使用String(byte[], String)
構造函數時,您會說:“這是某些文本的編碼版本,這就是編碼。”
這里不是這樣。 您沒有編碼的文本-您有不透明的二進制數據。 根本不是文本數據。 使用Base64將其安全地轉換為純ASCII字符串。 您可以使用一個公共領域的Java編碼器/解碼器 。
這就是為什么您應該使用十六進制(或更好的base64)表示形式傳輸字節數組的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.