1. Обзор
Расширенный стандарт шифрования (AES) – это широко используемый алгоритм симметричного блочного шифрования. Вектор инициализации (IV) играет важную роль в алгоритме AES.
В этом уроке мы объясним, как создать IV в Java. Кроме того, мы опишем как избежать InvalidAlgorithmParameterException когда мы генерируем IV и используем его в алгоритме шифрования .
2. Вектор инициализации
Алгоритм AES обычно имеет три входа: открытый текст, секретный ключ и IV. Он поддерживает секретные ключи 128, 192 и 256 бит для шифрования и дешифрования данных в блоках по 128 бит. На рисунке ниже показаны входы AES:
Цель IV состоит в том, чтобы расширить процесс шифрования. IV используется в сочетании с секретным ключом в некоторых режимах работы AES . Например, режим цепочки блоков шифрования (CBC) использует IV в своем алгоритме.
В общем случае IV-это псевдослучайное значение, выбранное отправителем. IV для шифрования должен быть таким же при расшифровке информации.
Он имеет тот же размер, что и зашифрованный блок. Таким образом, размер IV составляет 16 байт или 128 бит.
3. Генерация IV
Рекомендуется использовать java.security.SecureRandom класс вместо java.util.Random для генерации случайного 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 .