6

由于不推荐使用 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 提前感谢您的回复。

4

1 回答 1

6

可悲的是,你走错了路。

参考:

http://php.net/manual/en/function.mcrypt-encrypt.php#117667

MCRYPT_RIJNDAEL_256 不是 AES-256,它是 Rijndael 分组密码的不同变体。

https://en.wikipedia.org/wiki/Advanced_Encryption_Standard

AES 是 Rijndael 的变体,它具有 128 位的固定块大小和 128、192 或 256 位的密钥大小。相比之下,Rijndael 规范本身指定的块和密钥大小可以是 32 位的任意倍数,最小为 128 位,最大为 256 位。

所以你不能使用 OpenSSL 的 AES-256 来解密 MCrypt 的输出。

一些可能的方法:

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

  2. 在 PHP 中重写正确的 RIJNDAEL-256 密码。

于 2018-04-24T11:04:52.953 回答