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

MCrypt rijndael-256 to OpenSSL aes-256-ecb conversion

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

我为 Encryption/Decryption 使用了以下代码。

//加密

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