什么是mcrypt_get_block替代品,以及如何使用它

时间:2019-05-28 14:57:44

标签: php wordpress symfony encryption

我有一个使用symfony框架构建且使用mcrypt_get_block_size('tripledes', 'ecb')的旧wordpress插件。但是,我刚刚将服务器上的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);
    }

更新

我改编了Peter的示例以反映我的代码:

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

2 个答案:

答案 0 :(得分:1)

首先,这可能是更新加密货币的绝佳机会。通常,三重DES很好,但是仅使用三重DES是因为它可以在硬件(例如智能卡)中非常有效地实现。对于服务器和PC而言,这种AES具有相同甚至更好的性能特征(现代CPU由于在TLS中普遍使用而对AES有特殊说明)。

如果可以帮助,请不要使用ECB,无论您选择哪种分组密码。 You can see penguins through it

如果您可以自由选择,请使用libsodium并选择the AEAD constructions中的一个(PHP文档几乎不存在,但是您可以相当容易地将官方文档与匹配的包装函数相关联在PHP中)。

In只能建议不要使用OpenSSL(例如,它具有无数的尖锐边缘;例如,甚至不会告诉您密钥是否太短),但是如果您坚持要滚动它,则:

OpenSSL没有返回给定密码的块大小的函数。但是,您在这里也不需要它,因为openssl_encrypt默认情况下会应用PKCS#7:

function encrypt(string $plaintext, string $key): string 
{
    $ciphertext = openssl_encrypt($plaintext, 'des-ede3-ecb', $key, OPENSSL_RAW_DATA);
    return base64_encode($ciphertext);
}

function decrypt(string $ciphertext64, string $key): string 
{
    $ciphertext = base64_decode($ciphertext64)
    $plaintext = openssl_decrypt($ciphertext, 'des-ede3-ecb', $key, OPENSSL_RAW_DATA);
    return $plaintext;
}

答案 1 :(得分:0)

您正在将ECB与PKCS#5/7填充一起使用(未明确提及,但这是手动应用的填充)。该填充是OpenSSL的默认设置,因此您只需使用'des-ede3'而不将OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING作为选项。

我看到的唯一另一个问题是密钥是否太小或太大。在这种情况下,mcrypt库将填充零字节或修剪最右边的字节。因此,如果加密/解密失败,您可能需要自己做。

祝您好运,请尝试摆脱这种可怕的协议并尽快编写代码。