mcrypt似乎不是100%可逆的

时间:2013-11-29 16:08:18

标签: php encryption mcrypt

我的数据库中有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%可逆。这就是问题所在,这就是问题......显然我不会在生产中使用它...这只是向你演示这个算法有问题的案例

3 个答案:

答案 0 :(得分:3)

其他人已经提到过,但你正在削减加密的结果。密文将随机出现,您正在加密的一些项目最后将产生空格。

如果修剪密文,则丢失信息,字符串将无法正确解码。

答案 1 :(得分:2)

hash them

,而不是加密密码

优点:

  • PHP(5.5+)具有用于密码散列和验证的本机API。
  • 哈希总是不可逆转的。如果您的数据库被盗,攻击者永远无法直接获取纯文本密码。
  • 正确哈希+ Salting解决了99%的密码攻击向量。

答案 2 :(得分:0)

已经解决了你不应该使用双向加密算法来保存密码,而是使用单向散列算法。

您正在修剪数据密文。删除trim()周围的mcrypt_encrypt(),你会没事的。

那就是说,你还有另外一个问题。您生成IV,但ECB模式不使用IV,因此这些都是无用的。保持密文更难以预测的更安全的方法是切换到CBC模式。执行此操作时,请记住,加密和解密时,IV应该是相同的(即$iv_1$iv_2应该相同)。