правильные методы шифрования PHP mcrypt?

Хорошо, я попытался создать свои собственные методы шифрования / дешифрования с помощью PHP mcrypt , и когда я отправил их некоторое время назад, некоторые называли их «мусор». Они упоминали о «Инициализационных векторах» и т. Д. В принципе, как я могу сделать эти методы криптографии лучше:

 function encrypt($key, $data){ $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT); return base64_encode($encrypted_data); } function decrypt($key, $encryptedData){ $dec = base64_decode($encryptedData); $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT); return trim($decrypt); } 

Я хочу, чтобы они работали как можно лучше, кроме как я утка в совершенно новом мире, когда дело доходит до mcrypt , любые предложения приветствуются, спасибо!

Вот фрагмент функций mcrypt, которые я использую. Они используют mcrypt_generic и mdecrypt_generic , которые должны использоваться в соответствии с руководством PHP .

 function encrypt($key, $data){ $b = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($enc), MCRYPT_DEV_URANDOM); mcrypt_generic_init($enc, md5($key), $iv); // PKCS7 Padding from: https://gist.github.com/1077723 $dataPad = $b-(strlen($data)%$b); $data .= str_repeat(chr($dataPad), $dataPad); $encrypted_data = mcrypt_generic($enc, $data); mcrypt_generic_deinit($enc); mcrypt_module_close($enc); return array( 'data' => base64_encode($encrypted_data), 'iv' => base64_encode($iv) ); } function decrypt($key, $iv, $encryptedData){ $iv = base64_decode($iv); $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($enc, md5($key), $iv); $encryptedData = base64_decode($encryptedData); $data = mdecrypt_generic($enc, $encryptedData); mcrypt_generic_deinit($enc); mcrypt_module_close($enc); // PKCS7 Padding from: https://gist.github.com/1077723 $dataPad = ord($data[strlen($data)-1]); return substr($data, 0, -$dataPad); } 

Я тоже мало знаю о mcrypt , поэтому я просто их взломал. Я md5 ключ, так что это всегда 32 символа (максимальная длина ключа), и я случайно вычисляю «Инициализационный вектор».

Использование PKCS7 Padding лучше, потому что вы можете иметь строки, которые заканчиваются в белом пространстве (поскольку trim удалит это), также шифрование более эффективно, когда строка является определенной длиной.

Я использую AES 256 (MCRYPT_RIJNDAEL_256) здесь, но AES 192 (MCRYPT_RIJNDAEL_192) тоже будет работать.

Демо: http://ideone.com/WA5Tk

Вы можете создать iv с помощью mcrypt_create_iv() , используя соответствующий размер для вашего режима шифрования.

 $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); 

Затем передайте его в mcrypt_cbc() в качестве необязательного 5-го параметра. Единственные изменения, которые я сделал здесь для ваших первоначальных функций, – это пройти в $iv :

 function encrypt($key, $data, $iv){ $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT, $iv); return base64_encode($encrypted_data); } function decrypt($key, $encryptedData, $iv){ $dec = base64_decode($encryptedData); $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT, $iv); return trim($decrypt); }