PHP 使用 openssl 解密数据(使用 mcrypt 加密)

Posted

技术标签:

【中文标题】PHP 使用 openssl 解密数据(使用 mcrypt 加密)【英文标题】:PHP Decrypt data (encrypted with mcrypt) using openssl 【发布时间】:2019-04-13 09:17:27 【问题描述】:

我有一个数据库,其中包含使用 php Mcrypt 库加密的 3DES (ECB) 加密数据。由于不推荐使用 Mcrypt,我需要切换到 OpenSSL 来解密它。所有数据将使用 xchacha20-poly1305-ietf 重新加密。

所以我不需要关于 3DES 不安全和 ECB 坏等的 cmets,我们知道,这就是我们尝试解密以获得更好的加密算法的原因。

我在下面提供了用于使用 mcrypt 进行加密的代码以及我们尝试使用 (openssl) 对其进行解密的 1 行。它总是返回 false,我们想知道为什么。

我开始怀疑问题出在 mcrypt 库使用 8 字节 IV 而打开 SSL 时说它必须是 0 字节。

如果能找到使用 openssl 解密值的方法,我们将不胜感激。

提前致谢。

代码如下:

$sEncryptionKey = 'aaaabbbbccccddddeeeeffff';
$sDataToEncrypt = 'Foo bar';

echo "Data to be Encrypted: $sDataToEncrypt\n";

$rMcrypt = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
$iIvSize = mcrypt_enc_get_iv_size($rMcrypt); //This gives 8 bytes

$sInitializationVector = mcrypt_create_iv($iIvSize, MCRYPT_RAND);
$iKeySize = mcrypt_enc_get_key_size($rMcrypt);

if ($iKeySize != strlen($sEncryptionKey)) 
    throw new Exception ('Invalid key length: '.$iKeySize);


mcrypt_generic_init($rMcrypt, $sEncryptionKey, $sInitializationVector);
$sEncryptedString = base64_encode(mcrypt_generic($rMcrypt, $sDataToEncrypt));

echo "Data Encrypted: $sEncryptedString\n";
$sDecryptedString = trim(mdecrypt_generic($rMcrypt, base64_decode($sEncryptedString)));

echo "Data Decrypted: $sDecryptedString\n";
mcrypt_generic_deinit($rMcrypt);
mcrypt_module_close($rMcrypt);

$sDecryptedString2 = openssl_decrypt(base64_decode($sEncryptedString), 'des-ede3', $sEncryptionKey, 0, ''); //this returns false.
echo "Data Decrypted (open SSL): $sDecryptedString2\n";

$sDecryptedString2 = openssl_decrypt(base64_decode($sEncryptedString), 'des-ede3', $sEncryptionKey, 0, $sInitializationVector); //Warning: openssl_decrypt(): IV passed is 8 bytes long which is longer than the 0 expected by selected cipher, truncating
?>

程序的输出显示:

Data to be Encrypted: Foo bar
Data Encrypted: 5Mraf9swmaI=
Data Decrypted: Foo bar
Data Decrypted (open SSL): 

Warning: openssl_decrypt(): IV passed is 8 bytes long which is longer than the 0 expected by selected cipher, truncating in /usr/local/www/appcluster01.ezmax.ca/pub/web/test/ian/test.cmd on line 31

【问题讨论】:

任何 2 路对称加密在网络服务器上本质上都是不安全的。因为网络服务器也将拥有解密它的密钥。如果您不需要(通常)解密的数据,请查看非对称加密。但是对于您的问题,您必须使用用于加密它的相同 IV 来解密它。除此之外,我不认为两者是兼容的。 Decrypt mcrypt with openssl的可能重复 【参考方案1】:

我刚刚意识到我错误地使用了 openssl_decrypt。

改成这个效果很好:

$sDecryptedString2 = openssl_decrypt(base64_decode($sEncryptedString), 'des-ede3', $sEncryptionKey, OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA, '');

我希望有一天它会对某人有所帮助。

谢谢

【讨论】:

以上是关于PHP 使用 openssl 解密数据(使用 mcrypt 加密)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 从 OpenSSL PHP 库中解密

使用 OpenSSL/C++ 和 PHP/Mcrypt 的 AES-128-CBC 加密:仅解密第一个块

php openssl base64解密

php 简单的PHP使用OpenSSL加密和解密

如何使用BASH命令解密PHP Openssl加密

如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?