Должен ли я использовать вектор инициализации (IV) вместе с моим шифрованием? - PullRequest
37 голосов
/ 15 сентября 2008

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

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

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

Ответы [ 7 ]

25 голосов
/ 15 сентября 2008

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

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

Слабый IV - это часть того, что сделало WEP хрупким.

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

9 голосов
/ 15 сентября 2008

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

5 голосов
/ 15 сентября 2008

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

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

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

Наконец: любая аналогия между CBC и потоковыми шифрами не очень проницательна, ИМХО.

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

Вот картинка:

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

текст ссылки

2 голосов
/ 24 июля 2013

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

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

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

2 голосов
/ 15 сентября 2008

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

1 голос
/ 25 сентября 2013

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

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

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

0 голосов
/ 15 сентября 2008

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...