我在PHP中遇到了一个奇怪的加密/解密问题。请看下面的代码:
<?php
function encrypt($encrypt, $mc_key, $iv)
{
$passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv));
$encode = base64_encode($passcrypt);
return $encode;
}
function decrypt($decrypt, $mc_key, $iv)
{
$decoded = base64_decode($decrypt);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
return $decrypted;
}
$key = 'SAtFIAI2g_r=supL43QkO#dTQYjS0JCt';
$iv = '#CvmQT1TlpINQgnc4q%9$k8mt170MXll';
$message = 'AAABzefYdjTYBAFLNMHfLHJZCtAkTKm';
$encrypted = encrypt($message, $key, $iv);
echo $encrypted."\n";
$decrypted = decrypt($encrypted, $key, $iv);
echo $decrypted."\n";
?>
我有$ key,$ iv用于编码$ message。所以第二行应该是我的解密消息。但事实并非如此,请参阅输出:
MXk9zteonXhz2zPVK7o4oUJJuXXQRlwOzTO7JbqbsA==
tq֞u�4�&�
1P&���_pŬ�.��
_
但是如果你稍微更改$ message就可以了。防爆。 if $ message是:AAABzefYdjTYBAFLNMHfLHJZCtAkTKn输出是:
fAEeJAkluHht8l6ain99YMAMHJtiUAg47XsJBECdrLA=
AAABzefYdjTYBAFLNMHfLHJZCtAkTKn
任何寻求解决方案的帮助都将受到赞赏。
答案 0 :(得分:2)
我不确定这是在发生什么,但似乎很可能。
变量$decoded
在之后保存二进制字符串 base64_decode()
- 编辑它,因此应该是由encrypt()
生成的确切二进制字符串在您base64_encode()
之前执行此操作 - 编辑它。不要trim()
您正在调用的{base}解码值mcrypt_decrypt()
。如果有一个字符被修剪掉,那么你正在解密一个不同于你最初加密的字符串。
function decrypt($decrypt, $mc_key, $iv)
{
$decoded = base64_decode($decrypt);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, $decoded, MCRYPT_MODE_ECB, $iv));
// Don't wrap $decoded as trim($decoded) here-----------------^^^^^^^^^^
return $decrypted;
}
为了评论后的完整性,加密时不应trim()
:
function encrypt($encrypt, $mc_key, $iv)
{
$passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv));
// -------------------------------------------Don't trim()----^^^^^^^^^^
$encode = base64_encode($passcrypt);
return $encode;
}