php - MCrypt rijndael-256 到 OpenSSL aes-256-ecb 转换

标签 php openssl php-7.2

由于 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 的输出。

一些可能的方法:

  1. 通过 PECL 的 mcrypt 扩展继续使用 mcrypt(幸运的是,它仍然存在),直到您可以完全替换遗留数据。

  2. 用 PHP 重写一个正确的 RIJNDAEL-256 密码。

关于php - MCrypt rijndael-256 到 OpenSSL aes-256-ecb 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49997338/

相关文章:

php - 具有复杂用户管理的社交网络 CMS

c++ - Openssl需要使用CA捆绑文件(中级证书)

c++ - boost::asio::ssl::context::add_verify_path

Ubuntu 服务器 - HANDSHAKE_FAILURE。如何正确设置证书?

PHP fatal error : Uncaught Error: Call to undefined function idn_to_ascii() on PHP 7. 2.13

php - 为什么 php 将空字节添加到私有(private)和 protected 属性名称?

php - ini_set 无法设置 session 变量 – PHP 7.2.0 及更高版本

PHP vs Golang http 调用得到不同的结果

javascript - 从 MySQL 查询到 PHP 数组的 jQuery 自动完成/提前输入

php - 仅在元素未被拖动时获取输出