Шифрование AES - ключ против IV - PullRequest
58 голосов
/ 29 января 2012

Приложение, над которым я работаю, позволяет пользователю шифровать файлы.Файлы могут быть любого формата (электронная таблица, документ, презентация и т. Д.).

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

Алгоритм AES требует два различных параметра для шифрования, ключ и вектор инициализации (IV).

Я вижу три варианта создания файла ключа:

  1. Вставить жестко закодированный IV в приложение и сохранить ключ в файле ключа.
  2. Вставить жестко закодированный ключ вприложение и сохраните IV в файле ключа.
  3. Сохраните ключ и IV в файле ключа.

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

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

Ответы [ 3 ]

74 голосов
/ 29 января 2012

Как видно из других ответов, наличие уникального IV для каждого зашифрованного файла имеет решающее значение, но почему это так?

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

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

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

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

Итак, теперь давайте вернемся к предложенным вами вариантам:

Вариант 1. Вставьте жестко закодированный IV в приложение исохранить ключ в файле ключа.

Вариант 2. Вставить жестко закодированный ключ в приложение и сохранить IV в файле ключа.

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

Вариант 3. Сохраните ключ и IV в файле ключа.

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

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

28 голосов
/ 29 января 2012

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

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

Если вы собираетесь использовать свои собственные режимы шифрования, как это, пожалуйста, ознакомьтесь с соответствующими стандартами.NIST имеет хороший документ о режимах шифрования здесь: http://dx.doi.org/10.6028/NIST.SP.800-38A IV генерация документирована в Приложении C. Криптография - тонкое искусство .Не поддавайтесь искушению создавать вариации обычных режимов шифрования;В 99% случаев вы создаете что-то, что выглядит более безопасным, но на фактически менее безопасным.

12 голосов
/ 29 января 2012

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

...