2009-11-23 3 views
14

Я уверен, что на этот вопрос нет ответа, а просто пытается найти общий подход.Как создать вектор инициализации?

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

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

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

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

ответ

7

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

Многих реализации SecureRandom находятся в виде псевдо-случайных чисел генератора (ПСЧ), что означает, что они используйте детерминированный алгоритм для генерации псевдослучайной последовательности из истинного случайных семян. Другие реализации могут производить истинные случайные числа, и все же другие могут использовать сочетание методов .

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

+1

@schnaader - nit-pick - SHA1PRNG - не настоящий RNG. Это PRNG с (по ссылке, на которую вы ссылались) истинное случайное семя. –

+0

Вы правы, отредактировал ответ. – schnaader

13

Это зависит от режима, в котором вы используете свой шифр. Если вы используете 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, он потерпел неудачу.

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

6

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

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

1

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

Смежные вопросы