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

StackOverflow https://stackoverflow.com/questions/65879

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

текст ссылки

Я нашел описание HTTP Digest Auth (РФК 2617) очень полезно для понимания использования и необходимости IV/nonce.

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top