Шифрование php mcrypt без IV

Мне нужно использовать механизм шифрования. Я выбрал mcrypt, поскольку он доступен и для его примеров. Но я вижу, что время генерации слишком велико. Когда я использую IV, как в приведенных примерах, это занимает много времени, а когда я его удаляю, он мгновенно генерирует зашифрованное значение.

// Code example using IV
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_RANDOM);

$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB, $iv);
return base64_encode($encryptedString);

// Code example without IV    
$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB);
return base64_encode($encryptedString); 

Итак, есть ли какие-либо серьезные проблемы с безопасностью при шифровании без использования IV?


person kuldeep.kamboj    schedule 15.05.2015    source источник
comment
Почему вы специально используете MCRYPT_DEV_RANDOM. Попробуйте MCRYPT_DEV_URANDOM и посмотрите, будет ли это быстрее. Кроме этого, вам следует дождаться эксперта по криптографии, но, насколько я знаю, вам определенно нужен IV.   -  person deceze♦    schedule 15.05.2015
comment
@deceze Ваше решение верное, производительность с MCRYPT_DEV_URANDOM очень хорошая. Но я бы остался больше, чтобы проверить описательные ответы.   -  person kuldeep.kamboj    schedule 15.05.2015
comment
Возможный дубликат stackoverflow.com/questions/11173803/ ?   -  person Siguza    schedule 15.05.2015


Ответы (1)


DEV_RANDOM генерирует случайные целые числа из /dev/random или эквивалента, который прослушивает непредсказуемые данные, такие как движение мыши, нажатия клавиш и т. д., для создания безопасных данных. Если нет нажатий клавиш и т. Д., Он просто ждет, пока не будет достаточно данных ... и поэтому он медленный.

DEV_URANDOM использует /dev/urandom или его эквивалент, и хотя он может также использовать данные выше, в дополнение к этому он сочетает в себе генераторы псевдослучайных чисел, чтобы предоставить вам случайные данные в режиме реального времени (что более предсказуемо, но это часто не имеет значения).

Они используются для определения способа построения IV.


Теперь на капельницы.

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

Вы используете ECB. Первое, на что следует обратить внимание, это то, что ECB не использует IV, поэтому то, что вы написали, не имеет смысла; если вы используете ECB, вы можете вообще не создавать IV, и вы сможете без проблем расшифровать свои данные. Но с другой стороны, вы не должны использовать ECB. ECB кодирует ваши данные таким образом, что каждый блок с одними и теми же данными будет выглядеть одинаково. CBC, с другой стороны, удаляет каждый блок данными из предыдущего блока (и для этого ему нужен IV). Чтобы продемонстрировать разницу между ними, посмотрите на это:

Слева направо: исходное изображение, изображение, закодированное в режиме ECB, и изображение, закодированное в режиме CBC.

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

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


TL;DR: используйте CBC с общедоступными IV, повторно созданными для каждых данных отдельно.

(Кроме того... если вас не волнует расшифровка, вас могут заинтересовать криптографические хэши.)

person rr-    schedule 15.05.2015
comment
При использовании DEV_URANDOM или DEV_RANDOM есть какие-либо различия в безопасности? - person kuldeep.kamboj; 16.05.2015
comment
Это было хорошо объяснено в связанном ответе. В большинстве случаев достаточно использовать /dev/urandom; /dev/random следует использовать, только если вы действительно параноик. Вот статья, в которой это очень хорошо объясняется. - person rr-; 16.05.2015