Перейти к основному содержимому

InvalidAlgorithmParameterException: неправильная длина IV

· 2 мин. чтения

1. Обзор

Advanced Encryption Standard ( AES) — это широко используемый алгоритм симметричного блочного шифрования. Вектор инициализации (IV) играет важную роль в алгоритме AES.

В этом руководстве мы объясним, как сгенерировать IV в Java. Кроме того, мы опишем , как избежать исключения InvalidAlgorithmParameterException , когда мы генерируем IV и используем его в алгоритме шифрования .

2. Вектор инициализации

Алгоритм AES обычно имеет три входа: открытый текст, секретный ключ и IV. Он поддерживает секретные ключи длиной 128, 192 и 256 бит для шифрования и расшифровки данных блоками по 128 бит. На рисунке ниже показаны входы AES:

./16023552a72da21b9042efdcc1fdb462.png

Цель IV состоит в том, чтобы увеличить процесс шифрования. IV используется вместе с секретным ключом в некоторых режимах работы AES . Например, режим цепочки блоков шифров (CBC) использует IV в своем алгоритме.

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

Он имеет тот же размер, что и зашифрованный блок. Следовательно, размер IV равен 16 байтам или 128 битам.

3. Генерация IV

Рекомендуется использовать класс java.security.SecureRandom вместо java.util.Random для создания случайного IV. Кроме того, рекомендуется, чтобы IV был непредсказуемым. Кроме того, мы не должны жестко кодировать IV в исходном коде.

Чтобы использовать IV в шифре, мы используем класс IvParameterSpec . Давайте создадим метод для генерации IV:

public static IvParameterSpec generateIv() {
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
return new IvParameterSpec(iv);
}

4. Исключение

Алгоритм AES требует, чтобы размер IV составлял 16 байт (128 бит). Итак, если мы предоставим IV, размер которого не равен 16 байтам, будет выброшено исключение InvalidAlgorithmParameterException .

Чтобы решить эту проблему, нам придется использовать IV размером 16 байт. Пример фрагмента кода, касающегося использования IV в режиме AES CBC, можно найти в этой статье .

5. Вывод

Таким образом, мы узнали, как создать вектор инициализации (IV) в Java. Кроме того, мы описали исключение, относящееся к поколению IV. Исходный код, используемый в этом руководстве, доступен на GitHub .