AES, режим связывания блоков шифра, статический вектор инициализации и изменение данных - PullRequest
2 голосов
/ 27 января 2010

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

0x00000000someotherdatafollowsforsomenumberofblocks
0x00000001someotherdatathatmaydifferormaynotfollows

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

Ответы [ 3 ]

3 голосов
/ 27 января 2010

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

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

2 голосов
/ 27 января 2010

Марк, То, что вы описываете, в значительной степени соответствует тому, что предлагается в Приложении C NIST SP800-38a . В частности, существует два способа создания IV:

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

Второй вариант выглядит очень похоже на то, что вы предлагаете.

1 голос
/ 27 января 2010

Ну, это зависит от размера блока алгоритма шифрования. Для обычного размера блока 64 байта я не думаю, что это будет иметь какое-либо значение. Первые биты будут одинаковыми для многих блоков перед входом в блочный шифр, но результат не будет иметь какого-либо распознаваемого шаблона. Для размеров блока <4 байта (я не думаю, что это произойдет) это будет иметь значение, потому что первый блок (блоки) всегда будет одинаковым, пропуская информацию о шаблонах. Просто мое мнение. </p>

редактировать:

Нашел это

"Для CBC и CFB повторное использование IV приводит к утечке некоторой информации о первом блоке открытого текста и о любом общем префиксе, который разделяют два сообщения "

Источник: лекции моего университета:)

...