2015-05-27 5 views
5

У меня есть следующий код, который отлично работает на PHP 5.5.9.mcrypt_encrypt не работает должным образом на PHP 5.6.9

function index() 
{ 
    echo $this->encryptText_3des('TEST','JHHKJH9879'); 
} 

function encryptText_3des($plainText, $key) { 
    $key = hash("md5", $key, TRUE); 
    for ($x=0;$x<8;$x++) { 
     $key = $key.substr($key, $x, 1); 
    } 
    $padded = $this->pkcs5_pad($plainText, 
    mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC)); 
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC)); 
    return $encrypted; 
} 

function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

Шифрование происходит fine.But в 5.6.9, то в PHP документ из mcrypt_encrypt, они упоминают, что

Недопустимый ключ и IV размеры больше не принимаются. mcrypt_encrypt() теперь выдает предупреждение и возвращает FALSE, если входы недействительны. Раньше клавиши и IV были дополнены байтами '\ 0' до следующего допустимого размера.

Как изменить текущий код с пятым параметром без изменения алгоритма шифрования?

Я попытался

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

и дал $ в.в. в качестве пятого параметра.

Но это не сработало. Шифрование было отличным от предыдущего.

ответ

2

Найденный ответ в случае, если кто нужен

$ivSize = 8; 
$iv = str_repeat("\0", $ivSize); 

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv)); 

Проходят 5-й параметр вручную, что более ранняя версия делает сам по себе!

4

Не эмулируйте старые версии PHP для слабого поведения для инициализации IV.

Использование mcrypt_create_iv().

Они удалили auto zero-byte iv для причины .

+0

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

+0

@ArtjomB. Хорошая точка, чтобы обеспечить дешифрование «устаревших» зашифрованных текстов, необходимо использовать «старый» iv. – DanFromGermany

+1

Убедитесь, что вы также используете 'MCRYPT_DEV_URANDOM'! –

0

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

  • Не используйте 3DES, используйте AES. Правильная константа mcrypt для AES равна MCRYPT_RIJNDAEL_128, независимо от вашего желаемого размера ключа. Mcrypt is pretty terrible.
  • Не используйте md5() в качестве функции деривации ключа. Если вам понадобится KDF (например, потому что вы используете пароль вместо хранения ключа шифрования), используйте hash_pbkdf2() с SHA-256.
  • Вы шифруете, но не аутентифицируете свой зашифрованный текст. Secret-key encryption without message authentication is NOT secure in any language! Шифруйте-Затем-MAC пожалуйста.

Если вы собираетесь использовать Mcrypt (наши рекомендации по secure data encryption in PHP должны использовать libsodium, если вы можете, в противном случае defuse/php-encryption, в противном случае OpenSSL), убедитесь, что вы передаете правильную константу mcrypt_create_iv().

Bad:

$iv = mcrypt_create_iv(16, MCRYPT_RAND); // BAD EXAMPLE 

Хорошо:

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); // YES!