gpt4 book ai didi

php - 使用 openssl 解密 mcrypt

转载 作者:行者123 更新时间:2023-12-04 16:45:34 25 4
gpt4 key购买 nike

由于 mcrypt 被认为已过时,我的任务是升级当前代码以使用 openssl。听起来很简单,但是……经过几天的尝试和失败后,我觉得自己快疯了。

我要问你的问题是:有什么办法可以用以前用 mcrypt 加密的 openssl 数据解密?我已经阅读了很多关于这个问题的帖子,他们中的大多数人都说在运行 mcrypt 之前需要手动填充数据。
问题是 mcrypt 编辑的数据已经加密(使用 mcrypt 提供的自动空填充)并驻留在数据库中,因此不可能和/或不希望对其进行修改。

提及:

  • 使用的算法是带有 32 字节 key 的 rijndael-128 cbc(所以我将 aes-256-cbc 用于 openssl)。
  • 我正在为 php (php-crypto) 使用 openssl 包装器。
  • 如果它们不是字母数字,我已经设法通过简单地剥离结束解码的字符来使逆运算工作(使用 mcrypt 解码 openssl)。
  • 在 mcrypt-ing 之前手动填充数据,然后使用 openssl 解密它就像一个魅力,但这不是这里的问题。

  • 一些代码片段:
    // Simple mcrypt encrypt, decrypt with php-crypto example
    // This doesn't work and produces a "Finalizing of cipher failed" error
    $data = "This is a text";
    $strMcryptData=mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);

    $algorithm = 'aes-256-cbc';
    $cipher = new Cipher($algorithm);
    $sim_text = $cipher->decrypt($strMcryptData, $key, $iv);

    // Simple mcrypt encrypt with padding, decrypt with php-crypto
    // Works and produces the correct text on decryption
    $pad = $blocksize - (strlen($data) % $blocksize);
    $text = $data;
    $text .= str_repeat(chr($pad), $pad);
    $strPaddedData=mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);

    $sim_text = $cipher->decrypt($strPaddedData, $key, $iv);

    最佳答案

    如果你在 mcrypt 中加密而不手动添加 PKCS7,mcrypt 会很高兴地用 NUL 填充你的明文。字节。

    每当使用 aes-X-cbc 时,OpenSSL 都会为您做 PKCS7 填充。 .这样做的不幸后果是,如果您有 AES-CBC(NULL_PADDED(plaintext))并尝试解密它,openssl_decrypt将尝试删除填充并失败。

    比较 http://3v4l.org/bdQe9对比 http://3v4l.org/jr68fhttp://3v4l.org/K6ZEU

    OpenSSL 扩展目前没有为您提供一种方法来说“此字符串未填充,请不要为我剥离填充”然后删除 NUL你自己的字节。您必须使用 PKCS7 填充加密才能成功解密。

    尽管这是 OpenSSL 的一个限制,但需要强调的是,您遇到它的唯一原因是 mcrypt is terrible .

    关于php - 使用 openssl 解密 mcrypt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520311/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com