由于 Mcrypt 已被弃用,我想在我的代码中使用 OpenSSL,因为我们已经在我们的服务器中使用 php 7.2.4。
我使用以下代码进行加密/解密。
//加密
function encrypt($text, $salt='') {
if ($text == "") {
return "";
}
if ($salt == "") {
$salt = 'DiAo74dOO09T48YESmuvbS0T';
}
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
//解密
function decrypt($text, $salt = '') {
if ($text == "") {
return "";
}
if ($salt == "") {
$salt = 'DiAo74dOO09T48YESmuvbS0T';
}
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
AFdT9sa81krHkp/GoYCSwh7/lZn/gLZLHJSldi5/QCU=
我使用上述加密函数加密了这个字符串,但我希望它使用 OPENSSL
对其进行解密。我使用以下代码对其进行解密:
$string = 'AFdT9sa81krHkp/GoYCSwh7/lZn/gLZLHJSldi5/QCU=';
$output = false;
$secret_key = 'DiAo74dOO09T48YESmuvbS0T';
$secret_iv1 = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-ECB'));
$secret_iv = bin2hex($secret_iv1);
$key = hash('sha256', $secret_key);
$iv = substr(hash('sha256', $secret_iv), 0, 16);
$output = base64_encode(openssl_encrypt($string, 'aes-256-ecb', $key, OPENSSL_RAW_DATA));
我想要解密输出为:durhs-14767-w0163j1-89047
预先感谢您的回复。
最佳答案
可悲的是,你走错了路。
引用:
http://php.net/manual/en/function.mcrypt-encrypt.php#117667
MCRYPT_RIJNDAEL_256 is not AES-256, it's a different variant of the Rijndael block cipher.
https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
AES is a variant of Rijndael which has a fixed block size of 128 bits, and a key size of 128, 192, or 256 bits. By contrast, the Rijndael specification per se is specified with block and key sizes that may be any multiple of 32 bits, with a minimum of 128 and a maximum of 256 bits.
因此您不能使用 OpenSSL 的 AES-256 来解密 MCrypt 的输出。
一些可能的方法:
通过 PECL 的 mcrypt 扩展继续使用 mcrypt(幸运的是,它仍然存在),直到您可以完全替换遗留数据。
用 PHP 重写一个正确的 RIJNDAEL-256 密码。
关于php - MCrypt rijndael-256 到 OpenSSL aes-256-ecb 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49997338/