Ваш код работает правильно
Массив инициализируется размером 16
, где каждый из этих 16
байтов равен 0
.
Теперь давайте посмотрим натаблица ascii для поиска правильного символа для 0
.
![enter image description here](https://i.stack.imgur.com/qwcOd.gif)
Ага, символ для 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