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

时间:2018-04-24 08:53:56

标签: php openssl php-7.2

由于Mcrypt已被弃用,我想在我的代码中使用OpenSSL,因为我们已经在服务器中使用了php 7.2.4。

我使用以下代码进行加密/解密。

// ENCRYPTION

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))));
    }

// DECRYPTION

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 / gLZLHJSdi5 / 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” 在此先感谢您的回复。

1 个答案:

答案 0 :(得分:4)

可悲的是,你走错了路。

参考:

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密码。