在 PHP 中将 mcrypt_encrypt 转换为 openssl_encrypt

时间:2021-07-13 07:30:48

标签: php encryption openssl mcrypt

由于 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 执行默认填充,我没有像原始代码中那样填充纯文本。我相信密钥正在转换为二进制。如果我省略了两个代码的密钥转换,那么我会得到相同的加密文本。但是如果我使用密钥转换,那么密文就不一样了。

如果我从两者中删除以下代码,则两者都返回相同的加密文本。

$key= hex2bin($sKey);

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

1 个答案:

答案 0 :(得分:0)

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

现在一切都取决于密钥长度 - 当使用我的示例字符串时,您有一个 16 个字符/字节长的 AES 密钥,它适用于 AES-128不适用于 AES-256 正如您在函数中使用的那样。

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

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