我必须使用openssl_encrypt替换已弃用的函数mcrypt_encrypt。 我的旧mcrypt函数使用'des'密码和'ecb'模式。 我尝试了所有密码选项(openssl_get_cipher_methods),但我找不到相同的结果。请帮忙
$key = '04647132';
$message = hex2bin('046471324B3680');
$mcrypt = base64_encode(mcrypt_encrypt('des', $key, $message, 'ecb'));
foreach (openssl_get_cipher_methods(true) as $cipher) {
$openSsl = base64_encode(@openssl_encrypt($message, $cipher, $key, OPENSSL_RAW_DATA));
if ($openSsl == $mcrypt) {
echo 'FOUND - ' . $cipher . ' = ' . $openSsl;
exit;
}
}
答案 0 :(得分:0)
这是因为不同的数据填充 - 用于MCrypt的PKCS#5和用于OpenSSL的PKCS#7。
您可以自己预先填充$message
(标准可行,但PKCS#7更好)并使用OPENSSL_ZERO_PADDING
标记和OPENSSL_RAW_DATA
。这也意味着你必须在解密后手动剥离填充 - 所有分组密码模式就是这种情况。
但这是你问题中最少的......
今天没有人应该使用ECB或DES;你应该尽快离开这两个地方。如果您维护旧系统,这是可以理解的,但您不必以这种方式加密新数据。
当你最终转移到另一种模式时,不要忽视IV要求 - ECB坏的原因正是因为它没有使用IV。
此外,我知道这只是示例代码,但您示例中的$key
不是正确的密钥...请使用random_bytes()
生成一个代码。
如果你只是使用一个受欢迎的,经过严格审查的加密库,所有这些,以及你甚至不知道的更多问题都可以得到解决 - 它只需一个简单的步骤即可为你完成所有工作。 /> 请认真考虑这一点 - 即使是专业的密码学家也更喜欢第三方库而不是编写自己的代码,而且有很好的理由。