Вектор инициализации - лучшие практики (симметричная криптография) - PullRequest
0 голосов
/ 02 февраля 2019

Я хотел бы спросить о передовых методах использования вектора инициализации (IV) и ключа для алгоритмов симметричной криптографии.

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

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

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

1 Ответ

0 голосов
/ 03 февраля 2019

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

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

Из наиболее распространенных специфических режимов работы:

  • CBC требует, чтобы IV генерировался равномерно случайным образом.Не используйте счетчик как IV для CBC.Кроме того, если вы шифруете некоторые данные, содержащие части, которые вы получаете от третьей стороны, не раскрывайте IV до тех пор, пока вы полностью не получите данные.
  • CTR использует IV в качестве начального значениясчетчика, который увеличивается для каждого блока , а не для каждого сообщения, и значение счетчика должно быть уникальным для каждого блока.Блок составляет 16 байтов для всех современных симметричных шифров (включая AES, независимо от размера ключа).Таким образом, для CTR, если вы шифруете сообщение из 3 блоков (от 33 до 48 байт) с 0 в качестве IV, следующее сообщение должно начинаться с IV = 3 (или больше), а не IV = 1.
  • Modernтакие режимы, как Chacha20, GCM, CCM, SIV и т. д., используют nonce в качестве IV.Когда режим описывается как использование одноразового номера, а не IV, это означает, что единственным требованием является то, что IV никогда не используется повторно с одним и тем же ключом.Он не должен быть случайным.

При шифровании данных в базе данных, как правило, небезопасно использовать идентификатор строки (или значение, полученное из нее) в качестве IV.Использование идентификатора строки безопасно только в том случае, если строка никогда не обновляется и не удаляется, потому что в противном случае данные второго раза, сохраненные с использованием того же идентификатора, будут повторять IV.Злоумышленник, который видит два разных сообщения, зашифрованных одним и тем же ключом и IV, вполне может расшифровать оба сообщения (детали зависят от режима и от того, насколько злоумышленник может догадаться о содержании сообщения; обратите внимание, что даже слабые предположения, такие как «его можно печатать в формате UTF-8 ».

Если у вас нет веской причины поступить иначе (просто сохранение нескольких байтов на строку не считается очень веской причиной), а криптограф изучил конкретныеспособ хранения и извлечения данных:

  • Используйте режим аутентифицированного шифрования, такой как GCM, CCM, SIV или Chacha20 + Poly1305.

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

    1. Увеличивайте счетчик.
    2. Используйте новое значение счетчика в качестве одноразового номера для аутентифицированного шифрования.

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

  • Если у вас нет такого счетчика, используйте максимальную длину одноразового номера и сгенерируйте случайный счетчик.Причиной использования максимальной длины одноразового номера является то, что из-за парадокса дня рождения случайный n -битный одноразовый номер, как ожидается, повторится, когда число сообщений приблизится к 2 * 1056.* n / 2 .

  • В любом случае вам необходимо сохранить одноразовый номер в строке.

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

...