Подтвердить что ты не робот

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

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

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

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

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

Любое руководство оценивается.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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