在 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。
如果我的回答没有解决您的问题,您可以提供一个示例密钥和生成的密文,这可能会有所帮助。
由于 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。
如果我的回答没有解决您的问题,您可以提供一个示例密钥和生成的密文,这可能会有所帮助。