在 PHP 中将 mcrypt_encrypt 转换为 openssl_encrypt

Converting mcrypt_encrypt to openssl_encrypt in PHP

由于 mcrypt_encrypt 从 PHP 8 中删除,我需要将以下代码转换为使用 openssl_encrypt

function encryptValue($input,$sKey)
{   
    $key = hex2bin($sKey);
    
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $pad = $block - (strlen($input) % $block);
    $input .= str_repeat(chr($pad), $pad);
    
    $encrypted_text = bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_ECB));  

    return $encrypted_text;
}

我已将其替换为以下内容:

function encryptData($input, $sKey)
    {
        $key= hex2bin($sKey);

        $encrypted_text = bin2hex(openssl_encrypt($input, 'AES-256-ECB', $key, OPENSSL_RAW_DATA));
        return $encrypted_text;
    }

由于openssl默认填充,我没有像原始代码那样填充明文。我相信密钥正在转换为二进制文件。如果我从两个代码中都省略了密钥转换,那么我会得到相同的加密文本。但是如果我使用密钥转换,那么加密的文本就不一样了。

如果我从两者中删除下面的代码,那么两者 returns 相同的加密文本。

$key= hex2bin($sKey);

但是如果没有这个,它将无法与外部 API。

您的代码 "$key .= chr(hexdec($sKey[$i].$sKey[$i+1]))" 是一个“十六进制字符串到字符串”转换器,例如输入“31323334353637386162636465666768”被转换为“12345678abcdefgh”。

现在一切都取决于密钥长度 - 当使用我的示例字符串时,您有一个 16 characters/bytes 长的 AES 密钥,适用于 AES-128不是您在函数中使用的 AES-256

使用双重输入密钥需要在您的 openssl 代码中使用 AES-256

如果我的回答没有解决您的问题,您可以提供一个示例密钥和生成的密文,这可能会有所帮助。