我有一个使用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
答案 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_DATA
和OPENSSL_ZERO_PADDING
作为选项。
我看到的唯一另一个问题是密钥是否太小或太大。在这种情况下,mcrypt库将填充零字节或修剪最右边的字节。因此,如果加密/解密失败,您可能需要自己做。
祝您好运,请尝试摆脱这种可怕的协议并尽快编写代码。