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

Должен ли я использовать вектор инициализации (IV) вместе с моим шифрованием?

Рекомендуется ли использовать вектор инициализации для шифрования/дешифрования моих данных? Будет ли это сделать вещи более безопасными? Это одна из тех вещей, которые необходимо оценивать в каждом конкретном случае?

Чтобы включить это в реальный контекст, функция криптографии Win32, CryptSetKeyParam позволяет установить вектор инициализации на ключ до шифрования/дешифрования. Другие API также допускают это.

Что обычно рекомендуется и почему?

4b9b3361

Ответ 1

IV необходим, когда один и тот же ключ может когда-либо использоваться для шифрования более одного сообщения.

Причина в том, что в большинстве режимов шифрования два сообщения, зашифрованные одним и тем же ключом, могут быть проанализированы вместе. В простом поточном шифре, например, XORing двух зашифрованных текстов, зашифрованных одним и тем же ключом, приводит к XOR двух сообщений, из которых простой текст можно легко извлечь, используя традиционные методы криптоанализа.

Слабый IV является частью того, что делало WEP ломающимся.

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

Ответ 2

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

Ответ 3

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

Вот что я говорю: большинство "проблем" с IV = 0 являются общими проблемами с режимами блочного шифрования, когда вы не гарантируете целостность данных. Вы действительно должны обеспечить целостность.

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

Наконец: любая аналогия между CBC и потоковыми шифрами не ужасно проницательна IMHO.

Просто посмотрите на картинку режима CBC, я думаю, вы будете приятно удивлены.

Вот изображение:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

текст ссылки

Ответ 4

Я нашел запись HTTP Digest Auth (RFC 2617) очень полезно в понимании использования и необходимости для IVs/nonces.

Ответ 5

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

Например, позвольте зашифровать "hello world", используя один длинный символ. IV выбирается случайным образом как "x". Затем текст, который затем зашифровывается, является "хелловым миром", который, как говорят, "asdfghjkl". Если мы снова зашифруем его, сначала создадим новый IV - скажем, мы получим "b" на этот раз - и зашифруем как обычно (таким образом, шифруя "мир белло" ). На этот раз мы получим "qwertyuio".

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

Итак, если у вас есть случайный IV, используемый для шифрования обычного текста, как вы его расшифровываете? Просто. Передайте IV (в обычном тексте) вместе с зашифрованным текстом. Используя наш первый пример выше, окончательный текст шифрования будет "xasdfghjkl" (IV + шифрованный текст).

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

Статья Википедии о векторах инициализации дает общий обзор.

Ответ 6

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

Чтобы не беспокоиться о том, чтобы отслеживать IV, проще всего добавить или добавить его в полученный зашифрованный секрет. Таким образом, вам не нужно много об этом думать. Вы всегда будете знать, что первый или последний N бит - это IV.

Когда вы дешифруете секрет, вы просто разделите IV, а затем используйте его вместе с ключом, чтобы расшифровать секрет.

Ответ 7

Это одна из тех вещей, которые нужно оценивать в каждом конкретном случае основа?

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

Обычно рекомендуется, потому что большинство людей используются для использования AES-256 или подобных блочных шифров в режиме "Cipher Block Chaining". Это хороший, разумный дефолт для многих инженерных целей, и вам нужно, чтобы у вас был подходящий (не повторяющийся) IV. В этом случае это необязательно.