mcrypt_encrypt to openssl_encrypt ecb des

时间:2017-08-28 06:17:30

标签: php deprecated mcrypt

我必须使用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;
    }
}

1 个答案:

答案 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()生成一个代码。

如果你只是使用一个受欢迎的,经过严格审查的加密库,所有这些,以及你甚至不知道的更多问题都可以得到解决 - 它只需一个简单的步骤即可为你完成所有工作。 /> 请认真考虑这一点 - 即使是专业的密码学家也更喜欢第三方库而不是编写自己的代码,而且有很好的理由。