Байтовый массив в строку возвращает ноль - PullRequest
0 голосов
/ 12 мая 2018

Я пишу программу для шифрования данных.Я создал случайный IV следующим образом:

byte[] ivBytes = new byte[16];
IvParameterSpec iv = new IvParameterSpec(ivBytes);

И использовал его для шифра.Теперь я хочу сохранить этот IV в файле конфигурации, чтобы я мог перенести его в функцию расшифровки, и для этого мне нужно преобразовать IV в строковый формат.

Я использовал byte curIV[] = cipher.getIV();, чтобы получить IVи выводит его значение на консоль, но когда я преобразую его в строку, таким образом String ivString = new String(curIV);, ничего не возвращается.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Ваш код работает правильно

Массив инициализируется размером 16, где каждый из этих 16 байтов равен 0.

Теперь давайте посмотрим натаблица ascii для поиска правильного символа для 0.

enter image description here

Ага, символ для 0 является символом NUL.

Если вы сделаете new String(cipher.getIV());, вы станете действительным значением String, не содержащим никакой информации.

Как решить

Просто преобразуйте строку размера 16 в байты.

byte[] ivBytes = "123456789abcdef".getBytes();

Безопасность

Компьютеры хороши в расчетах, но плохи в случайных значениях.Случайные значения трудно оценить.Это делает случайные значения важными для безопасности.Это делает массив байтов 16x0 плохой идеей.

Конфигурация

Наконец, вам необходимо сохранить эту информацию в конфигурации.Хм, так как этот символ не читаемый, трудно сохранить его в текстовой конфигурации.

Сосредоточившись на безопасности, вы не должны допускать 16x0 IV.Поэтому 16x0 IV не должны быть сохранены в конфигурации.

Предложение

Используйте это вместо:

String ivString = "blahblah"; // read from configuration if required
IvParameterSpec iv = new IvParameterSpec(ivString.getBytes());
ivString = new String(iv.getIV()); //write to configuration if required
0 голосов
/ 12 мая 2018
byte[] ivBytes = new byte[16];

Это создает массив из 16 байтов, инициализированный в 0.0x00 не является печатаемым символом (это управляющий символ ), поэтому у вас могут возникнуть проблемы с отображением его на печати (либо проблема с печатью, либо проблема с просмотром напечатанного результата).

В зависимости от ваших потребностей, вы можете:

  • Распечатать его, используя Arrays.toString(), как предложено @TmTron (но вы ожидаете, что не увидите должным образом напечатанный результат в некоторых программах, вам понадобится hexaсредство просмотра, чтобы увидеть его правильно)
  • Распечатать его в шестнадцатеричном представлении
  • Кодировать его, используя Base64
...