Так как время движется по mcrypt, это будет в PHP 7.2. Конечно, есть альтернатива: openssl.
Мне сложно переключаться с mcrypt на openssl, используя AES 256 CBC и сохраняя IV. Я вроде как новичок в криптографии, поэтому я действительно не знаю всего, но я понимаю основы.
Допустим, у меня есть следующий код
function encrypt($masterPassword, $data) { $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM); $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize); $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv); return base64_encode($iv . $encrypted); } function decrypt($masterPassword, $base64) { $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize); $data = base64_decode($base64); $iv = substr($data, 0, $ivSize); $encrypted = substr($data, $ivSize, strlen($data)); $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv); return trim($decrypted); }
Как я могу «преобразовать» этот код, чтобы использовать openssl insted of mcrypt?
Вы не можете его преобразовать, потому что Rijndael-256 не AES-256, а расширение OpenSSL не поставляется с поддержкой Rijndael-256.
AES-256 – это Rijndael-128 с 256-битным (32-байтовым) ключом.
К сожалению, вам придется повторно шифровать все ваши данные.
Изменить: Кроме того, у схемы, которую вы используете, есть некоторые проблемы:
mb_substr()
) Хорошей новостью является то, что OpenSSL будет автоматически заполнять PKCS # 5, но вы должны пойти еще дальше и использовать сплошную библиотеку шифрования, такую как defuse / php-encryption .