PHP使用openssl

时间:2018-11-09 19:06:47

标签: php openssl mcrypt 3des ecb

我有一个数据库,其中充满了用php Mcrypt库加密的3DES(ECB)加密数据。由于Mcrypt已弃用,因此我需要切换到OpenSSL对其进行解密。所有数据将使用xchacha20-poly1305-ietf重新加密。

因此,我不需要有关3DES不够安全和ECB不良等的评论,我们知道,这就是我们试图解密以拥有更好的加密算法的原因。

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

我开始怀疑问题出在使用8字节IV的mcrypt库,而打开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

1 个答案:

答案 0 :(得分:0)

我只是意识到我使用了不正确的openssl_decrypt。

更改为正常工作

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

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

谢谢