Проблема при преобразовании bytes [] в строку, а затем обратно в byte [] - PullRequest
0 голосов
/ 26 марта 2011

При попытке установить защищенное соединение с использованием AES и RSA я обнаружил, что когда я пытался преобразовать ключ в строку для отправки его по сети, он снова преобразовался в байт [].Значения изменились.Вы можете увидеть код ниже, чтобы понять мою идею.

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

  }
}

Ответы [ 3 ]

4 голосов
/ 26 марта 2011

Это из-за преобразования необработанного байтового массива в строку UTF-8.Поскольку не каждая последовательность байтов является допустимой строкой UTF-8, конструктор String может изменить ее при преобразовании в сортировку допустимой строки.

4 голосов
/ 26 марта 2011

Когда вы используете конструктор String(byte[], String), вы говорите: «Вот кодированная версия некоторого текста, а это кодировка».

Это не дело здесь. У вас нет закодированного текста - у вас есть непрозрачные двоичные данные. Это просто не текстовые данные. Используйте Base64, чтобы безопасно преобразовать его в чисто ASCII-строку. Существует кодер / декодер Java общего пользования , который вы можете использовать.

0 голосов
/ 26 марта 2011

Вот почему вы должны использовать шестнадцатеричное (или лучше - base64) представление для передачи байтовых массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...