Как создать вектор инициализации?
Я уверен, что на этот вопрос нет ответа, а просто пытается найти общий подход.
Используя Java 1.4.2, мне нужно сгенерировать ключ и IV для использования в симметричном алгоритме. Эти значения будут предварительно переданы получателю через защищенный канал.
Ключ, который я могу сгенерировать с помощью KeyGenerator.keyGenerate(). Но если я не пропущу его, нет никакой функции для генерации случайного IV.
Должен ли я делать что-то совершенно произвольное, например, извлекать 16 случайных байтов из памяти? Или существует предпочтительный способ генерации достаточно случайных векторов инициализации?
Любое руководство оценивается.
Ответы
Ответ 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 с высокой энтропией.