【问题标题】:mcrypt_encrypt to openssl_encrypt ecb desmcrypt_encrypt 到 openssl_encrypt ecb des
【发布时间】:2018-02-05 08:31:03
【问题描述】:

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

【问题讨论】:

    标签: php deprecated mcrypt


    【解决方案1】:

    这是因为不同的数据填充 - MCrypt 的 PKCS#5 和 OpenSSL 的 PKCS#7。

    您可以自己预先填充$message(任何一种标准都可以,但PKCS#7 更好)并将OPENSSL_ZERO_PADDING 标志与OPENSSL_RAW_DATA 一起使用。这也意味着您必须在解密后手动剥离填充 - 这是所有分组密码模式的情况。

    但这是你最小的问题......

    今天没有人应该使用 ECB 或 DES;你应该尽快远离两者。如果您维护旧系统,这是可以理解的,但您不必以这种方式加密数据。
    当你最终转向另一种模式时,不要忽视 IV 要求 - ECB 不好的原因正是因为它没有使用 IV。

    另外,我知道这只是示例代码,但您示例中的 $key 不是正确的键...使用 random_bytes() 生成一个。

    如果您简单地使用一个流行的、经过严格审查的密码库,那么所有这些以及您甚至不知道的更多问题都可以得到解决 - 它可以一步完成所有工作。
    请认真考虑这一点 - 即使是专业的密码学家也更喜欢第三方库而不是编写自己的代码,这是有充分理由的。

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 1970-01-01
      • 2021-09-22
      • 2016-11-16
      • 2016-08-02
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多