2014-01-24 1 views
1

Я изучаю шифрование и используя 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?

ответ

1

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

Это зависит от режима. Для режима ECB нет. На самом деле режим ECB не принимает IV. Однако, как только вы шифруете данные, размер которых превышает размер блока, вы теряете семантическую безопасность. То есть, что-либо по размеру блока шифрования будет утечка информации. См. Изображение Тукса в Block Cipher Modes of Operation.

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

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

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

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

+0

Благодарим за подробное объяснение! – SudoKill

0

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

0

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

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

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