簡體   English   中英

將bytes []轉換為字符串,然后再轉換回byte []時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM