Должен ли я использовать вектор инициализации (IV) вместе с моим шифрованием?
Рекомендуется ли использовать вектор инициализации для шифрования / дешифрования моих данных? Это сделает вещи более безопасными? Это одна из тех вещей, которые нужно оценивать в каждом конкретном случае?
Чтобы поместить это в реальный контекст, функция криптографии Win32 CryptSetKeyParam позволяет установить вектор инициализации для ключа перед шифрованием / дешифрованием. Другие API также допускают это.
Что вообще рекомендуется и почему?
7 ответов
IV важен, когда один и тот же ключ может быть использован для шифрования нескольких сообщений.
Причина в том, что в большинстве режимов шифрования два сообщения, зашифрованные одним и тем же ключом, могут быть проанализированы вместе. Например, в простом потоковом шифре, XOR двух зашифрованных текстов, зашифрованных одним и тем же ключом, приводит к XOR двух сообщений, из которых открытый текст может быть легко извлечен с использованием традиционных методов криптоанализа.
Слабый IV является частью того, что сделало WEP ломким.
IV в основном смешивает некоторые уникальные, не секретные данные в ключе, чтобы один и тот же ключ никогда не использовался дважды.
В большинстве случаев вам следует использовать IV. Поскольку IV генерируется случайным образом каждый раз, если вы дважды шифруете одни и те же данные, зашифрованные сообщения будут разными, и наблюдатель не сможет сказать, совпадают ли эти два сообщения.
Внимательно посмотрите на изображение (см. Ниже) режима CBC. Вы быстро поймете, что злоумышленник, зная IV, похож на злоумышленника, знающего предыдущий блок зашифрованного текста (и да, он уже знает об этом много).
Вот что я говорю: большинство "проблем" с IV=0 - это общие проблемы с режимами блочного шифрования, когда вы не гарантируете целостность данных. Вы действительно должны обеспечить целостность.
Вот что я делаю: используйте надежную контрольную сумму (криптографический хеш или HMAC) и добавьте ее перед открытым текстом перед шифрованием. Это ваш известный первый блок зашифрованного текста: это IV того же самого без контрольной суммы, и вам нужна контрольная сумма по миллиону других причин.
Наконец, любая аналогия между CBC и потоковыми шифрами не очень проницательна, ИМХО.
Просто посмотрите на изображение в режиме CBC, я думаю, вы будете приятно удивлены.
Вот картинка:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
Если один и тот же ключ используется несколько раз для нескольких разных секретов, в зашифрованных результатах могут появиться шаблоны. IV, который должен быть псевдослучайным и использоваться только один раз с каждым ключом, служит для того, чтобы скрыть результат. Никогда не следует использовать один и тот же IV дважды с одним и тем же ключом, что противоречит его цели.
Чтобы не беспокоить отслеживание IV, проще всего добавить или добавить его к полученному зашифрованному секрету. Таким образом, вам не нужно много думать об этом. Тогда вы всегда будете знать, что первый или последний N бит - это IV.
При расшифровке секрета вы просто разделяете IV, а затем используете его вместе с ключом для расшифровки секрета.
Я обнаружил, что запись HTTP Digest Auth ( RFC 2617) очень полезна для понимания использования и потребности в IV / nonces.
Это одна из тех вещей, которые нужно оценивать в каждом конкретном случае?
Да, это. Всегда читайте о шифре, который вы используете, и о том, как он ожидает, что его входные данные будут выглядеть. Некоторые шифры не используют IV, но требуют, чтобы соли были безопасными. ИВ могут быть разной длины. Режим шифра может изменить то, для чего используется IV (если он вообще используется) и, как следствие, какие свойства он должен быть защищен (случайный, уникальный, инкрементный?).
Обычно это рекомендуется, поскольку большинство людей привыкли использовать AES-256 или аналогичные блочные шифры в режиме, называемом "цепочка блоков шифрования". Это хороший, разумный вариант по умолчанию для многих инженерных целей, и для этого нужно, чтобы у вас был соответствующий (неповторяющийся) IV. В этом случае это не является обязательным.
IV позволяет зашифровать открытый текст, так что зашифрованный текст будет сложнее расшифровать для злоумышленника. Каждый бит IV, который вы используете, удваивает возможности зашифрованного текста из заданного простого текста.
Например, давайте зашифруем "привет мир", используя длину в один символ IV. IV выбирается случайным образом, чтобы быть "х". Затем зашифрованный текст называется "мир xhello", что, скажем, asdfghjkl. Если мы снова зашифруем его, сначала сгенерируем новый IV - скажем, на этот раз мы получим "b" - и зашифруем как обычно (таким образом зашифровав "мир bhello"). На этот раз мы получаем "qwertyuio".
Дело в том, что злоумышленник не знает, что такое IV, и поэтому должен вычислить все возможные IV для данного простого текста, чтобы найти соответствующий зашифрованный текст. Таким образом, IV действует как соль для пароля. Чаще всего IV используется с цепочечным шифром (потоковым или блочным шифром). В цепочечном блочном шифре результат каждого блока простого текста подается в алгоритм шифрования, чтобы найти зашифрованный текст для следующего блока. Таким образом, каждый блок соединяется вместе.
Итак, если у вас есть случайный IV, используемый для шифрования простого текста, как вы расшифровываете его? Просто. Передайте IV (в виде простого текста) вместе с вашим зашифрованным текстом. Используя наш первый пример выше, окончательный зашифрованный текст будет "xasdfghjkl" (IV + зашифрованный текст).
Да, вы должны использовать IV, но не забудьте выбрать его правильно. Используйте хороший источник случайных чисел, чтобы сделать это. Никогда не используйте один и тот же IV дважды. И никогда не используйте постоянную IV.
Статья Википедии о векторах инициализации дает общий обзор.