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

Я изучаю шифрование и использую openssl_encrypt в PHP. У меня есть шифрование и дешифрование, работающие с 2 функциями, соответственно. Я просто передаю данные, которые должны быть зашифрованы / расшифрованы, и уникальный идентификатор, который принадлежит пользователю. Функция возвращает зашифрованные / дешифрованные данные.

Когда вызывается функция, я получаю предупреждение PHP о том, что "openssl_encrypt(): использование пустого вектора инициализации (iv) потенциально небезопасно и не рекомендуется".

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

Моя функция шифрования настроена так:

function EncryptData($inputString,$uniqueID)
{

global $encryptKey;  // Pulls out encryption key stored in a separate file
$method = 'aes256';  //Encryption Method

return openssl_encrypt($inputString,$method,$encryptKey.$uniqueID);

}

Функция дешифрования практически идентична, за исключением того, что она расшифровывает и возвращает данные.

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

3 ответа

Решение

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

Это зависит от режима. Для режима ECB нет. На самом деле режим ЕЦБ не занимает IV. Однако, как только вы шифруете данные, размер которых превышает размер блока, вы теряете семантическую безопасность. То есть все, что превышает размер блока шифра, приведет к утечке информации. Смотрите изображение Tux в Режимах работы блочного шифра.

Другие режимы, такие как CBC, OFC, FBC, CTR и другие, требуют IV. Требования IV отличаются между режимами, хотя. Некоторые допускают уникальный IV, другие требуют случайного IV, а некоторые запрещают повторное использование IV в ключе.

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

Есть ли преимущество по-прежнему использовать IV или недостаток не использовать IV здесь?

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

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

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

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

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

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