Как мне сгенерировать вектор инициализации?

Я уверен, что нет одного ответа на этот вопрос, но просто пытаюсь найти общий подход.

Используя Java 1.4.2, мне нужно сгенерировать ключ и IV для использования в симметричном алгоритме. Эти значения будут предварительно переданы получателю через защищенный канал.

Ключ, который я могу сгенерировать с помощью KeyGenerator.keyGenerate(). Но если я не пропустил это, нет функции для генерации случайного IV.

Должен ли я сделать что-то совершенно произвольное, как извлечь 16 случайных байтов из памяти? Или есть предпочтительный способ генерации достаточно случайных векторов инициализации?

4 ответа

Решение

Для некоторых реализаций класс SecureRandom поможет вам, создавая истинные случайные числа:

Многие реализации SecureRandom имеют форму генератора псевдослучайных чисел (PRNG), что означает, что они используют детерминированный алгоритм для создания псевдослучайной последовательности из истинного случайного начального числа. Другие реализации могут создавать истинные случайные числа, а третьи могут использовать комбинацию обоих методов.

У него есть два метода, getProvider() а также getAlgorithm() который должен дать вам некоторую информацию о том, какая реализация используется. Из этой страницы кажется, что генератор псевдослучайных сигналов SHA1PRNG (который заполнен истинными случайными данными) является одним из них или даже единственным доступным в настоящее время.

Это зависит от режима, в котором вы используете свой шифр. Если вы используете CBC, байты из SecureRandom являются самыми легкими и, вероятно, самыми безопасными... до тех пор, пока ваш RNG хорош.

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

cipher.init(Cipher.ENCRYPT_MODE, secret);
IvParameterSpec spec = 
   cipher.getParameters().getParameterSpec(IvParameterSpec.class);
byte[] iv = spec.getIV();

Это позволяет провайдеру выбрать подходящий метод для создания самого IV. Но если бы вы использовали тот же метод на шифре в режиме ECB, он потерпел бы неудачу.

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

Как и другие ответы, используйте безопасный генератор случайных чисел для создания IV.

Кроме того, вам не нужно отправлять IV по безопасному каналу - обычно просто добавьте его к сообщению. Помните, что гораздо важнее, чтобы вы использовали новый IV для каждого сообщения, чем то, что вы держите IV в секрете. Предварительное совместное использование IV одновременно с ключом подразумевает либо повторное использование IV (плохо), либо ограничение количества отправляемых сообщений.

Если вы используете GUI или у вас есть доступ к системным вызовам оборудования ввода данных пользователя (предпочтительно мыши), вы можете создать вектор пар координат указателя мыши по мере его перемещения пользователем. Добавьте их в какую-нибудь строку. Чем использовать вашу любимую хеш-функцию в строке, чтобы создать совершенно случайный IV с высокой энтропией.

Другие вопросы по тегам