Вектор инициализации (IV) - частота обновления

Это довольно простой вопрос, который касается вектора инициализации (IV), когда используется симметричное шифрование (например, AES) вместе с CBC.

Мой вопрос: должен ли IV меняться для каждого нового открытого текста или достаточно создать его для каждого нового сеанса?

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

Возможно, есть некоторые ресурсы для чтения по этой теме?

Спасибо:)

2 ответа

Решение

Примечание: этот ответ касается только шифрования в режиме CBC.

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

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

Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");

// repeat this for each cipher text
byte[] ivBytes = new byte[aes.getBlockSize()];
SecureRandom rnd = new SecureRandom();
rnd.nextBytes(ivBytes);
aes.init(Cipher.ENCRYPT_MODE, sk, new IvParameterSpec(ivBytes));

// now prepend the ivBytes to the output, e.g. by writing it to a stream first
// remove and use as IV at the receiving side

[РЕДАКТИРОВАТЬ]: Забыл о сокращенной записи для этого:

aes.init(Cipher.ENCRYPT_MODE, sk, new SecureRandom());
byte[] ivBytes = aes.getIV();

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

В CBC для максимальной безопасности IV должен быть непредсказуемым.

Should the IV change for each new plaintext or
does it suffice to create one for each new session?

Мне не совсем понятно, что вы даете "незашифрованному тексту" и "сеансу".

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

Perhaps there is some reading resources about this topic?

Конечно, NIST SP 800-38A, раздел 6.2.

Другие вопросы по тегам