Хорошо, я попытался создать свои собственные методы шифрования / дешифрования с помощью 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); }