什么是 mcrypt_get_block 替代方案以及如何使用它

我有一个使用 symfony 框架构建的旧 wordpress 插件,它使用mcrypt_get_block_size('tripledes', 'ecb'). 但是,我刚刚将服务器上的 php 升级到 7.3 版,现在我得到了一个Fatal error: Call to undefined function HealthShieldForm\mcrypt_encrypt().


我读过几篇他们建议使用openssl_encrypt(). 不幸的是,我不知道从哪里开始用彼此替换功能并确保我得到相同的结果。


我目前的代码是这样的:


private function encrypt($data)

    {

        //Pad for PKCS7

        $blockSize = mcrypt_get_block_size('tripledes', 'ecb');

        $len = strlen($data);

        $pad = $blockSize - ($len % $blockSize);

        $data .= str_repeat(chr($pad), $pad);


        //Encrypt data

        $encData = mcrypt_encrypt('tripledes', $this->key, $data, 'ecb');


        return base64_encode($encData);

    }


    private function decrypt($data)

    {

        $data = base64_decode($data);


        $data = mcrypt_decrypt('tripledes', $this->key, $data, 'ecb');


        $block = mcrypt_get_block_size('tripledes', 'ecb');

        $len = strlen($data);

        $pad = ord($data[$len - 1]);


        return substr($data, 0, strlen($data) - $pad);

    }

更新


我改编了彼得的例子来反映我的代码:


function encrypt($data)

    {

        $ciphertext = openssl_encrypt($data, 'des-ede3-ecb', $this->key, OPENSSL_RAW_DATA);

        return base64_encode($ciphertext);

    }


    function decrypt($data)

    {

        $ciphertext = base64_decode($data);

        $plaintext = openssl_decrypt($ciphertext, 'des-ede3-ecb', $this->key, OPENSSL_RAW_DATA);

        return $plaintext;

    }

但是,现在我收到此错误: Warning: openssl_encrypt(): Unknown cipher algorithm


大话西游666
浏览 403回答 2
2回答

繁星coding

您正在使用带有 PKCS#5 / 7 填充的 ECB(未明确提及,但这是手动应用的填充)。该填充是 OpenSSL 的默认值,因此您只需使用'des-ede3'withoutOPENSSL_RAW_DATA和OPENSSL_ZERO_PADDINGas 选项。我看到的唯一其他问题是密钥是否太小或太大。在这种情况下,mcrypt lib 将填充零字节或修剪最右边的字节。因此,如果加密/解密失败,您可能需要自己执行此操作。祝你好运,尽快摆脱这种可怕的协议和代码。
打开App,查看更多内容
随时随地看视频慕课网APP