我的数据库中有336个“客户端”
我尝试将此代码发送到encrypt
,然后尝试decrypt
一些数据
esit is:Right:323 - Wrong:13
是什么原因是因为mcrypt
不是完全可逆的?
编辑:请不要试图改变问题的性质,问我的问题,否则我会低估你的答案。问题是这个算法似乎不是100%可逆的,这就是问题,问题不是我用它的原因
$wrong = $right = 0;
foreach ($clients as $c) {
$string_to_encode = trim($c->first_field . ":::" . $c->last_field);
$mc_key = Yii::app()->params["rijndael_key"];
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv_1 = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypt = trim(mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$mc_key,
$string_to_encode,
MCRYPT_MODE_ECB,
$iv_1));
$token = urlencode(base64_encode($crypt));
$string_to_decode = base64_decode(urldecode($token));
$string_decoded = trim(mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$mc_key,
$string_to_decode,
MCRYPT_MODE_ECB,
$iv_1));
if ($string_to_encode != $string_decoded) {
echo $string_to_encode . PHP_EOL;
echo "***** ERROR ! ***** " . PHP_EOL;
echo $string_to_encode . PHP_EOL;
echo $string_decoded . PHP_EOL;
$wrong ++;
} else {
$right ++;
}
}
echo "Right $right - Wrong $wrong" . PHP_EOL;
与普通字符串和解码字符串的区别[请注意我更改了登录名称....]
customer.email@alice.it:::11734
customer.email@alice.it:::11z͉\wo����y�+� �>�d��x�
算法并非100%可逆。这就是问题所在,这就是问题......显然我不会在生产中使用它...这只是向你演示这个算法有问题的案例
答案 0 :(得分:3)
其他人已经提到过,但你正在削减加密的结果。密文将随机出现,您正在加密的一些项目最后将产生空格。
如果修剪密文,则丢失信息,字符串将无法正确解码。
答案 1 :(得分:2)
答案 2 :(得分:0)
已经解决了你不应该使用双向加密算法来保存密码,而是使用单向散列算法。
您正在修剪数据密文。删除trim()
周围的mcrypt_encrypt()
,你会没事的。
那就是说,你还有另外一个问题。您生成IV,但ECB模式不使用IV,因此这些都是无用的。保持密文更难以预测的更安全的方法是切换到CBC模式。执行此操作时,请记住,加密和解密时,IV应该是相同的(即$iv_1
和$iv_2
应该相同)。