【问题标题】:PHP MYCRYPT - RIJNDAEL_128 with Mcrypt CBC is giving incorrect outputPHP MCRYPT - RIJNDAEL 128 white Mcrypt CBC 给出不正确的输出
【发布时间】:2013-06-06 04:50:59
【问题描述】:

我正在使用文本

const ENCRYPTION_KEY = '3aa22e01c04c7059778c54d122b0273689fba00f4a166a66d15f7ba6a8ba8743';
$str = "1844427316My Name Is Dave1336407610774000000000000";

function  encrypt($str){
trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,ENCRYPTION_KEY, $str,MCRYPT_MODE_CBC,mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),MCRYPT_RAND))));
}

function decrypt($encryptedtext){
return trim(
        mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128, 
            ENCRYPTION_KEY, 
            base64_decode($encryptedtext), 
            MCRYPT_MODE_CBC,
            mcrypt_create_iv(
                mcrypt_get_iv_size(
                    MCRYPT_RIJNDAEL_128,
                    MCRYPT_MODE_CBC
                ), 
                MCRYPT_RAND
            )
        )
        );
}

但是,每当我用上述值刷新调用这些函数的页面时,我都会得到不同的值加密,但在解密时,初始解密值每次都会改变,但其余部分会像明智地一样正确解密:

F7…Ÿ{4©eŠQ9t¤e 是 Dave1336407610774000000000000

我也参考了SIMILAR QUESTION并在解密中使用了“iv”功能并在其中回答了

有人可以指导我这里出了什么问题吗?

【问题讨论】:

  • 每次收到的密文值不同是正常的。这实际上是算法的一部分,并使其更加安全。
  • 好的,但是不正确的解密初始文本怎么办......??
  • 恐怕我不知道,否则我会发布答案。作为一种解决方法,您可以尝试填充加密数据(开头有空格)。这可能与您使用 trim 函数有关。尝试删除它。
  • 否定...我也试过了。
  • @quinxorin 检查我的答案我解决了...

标签: php mcrypt rijndael cbc-mode


【解决方案1】:

很周到,但我找到了解决方案:

解密时,我使用了与加密时相同的 IV 和密钥。

我的加密函数需要返回 IV 以及加密数据。该 IV 与数据和密钥一起发送到解密函数。

请参阅下面的完整代码更改代码:

class Encypt{

const ENCRYPTION_KEY = '3aa22e01c04c7059778c54d122b0273689fba00f4a166a66d15f7ba6a8ba8743';


function createQueryString(){
$str = "1844427316My Name Is Dave1336407610774000000000000";
$encStr = $this->encrypt($str);

return $encStr;
}

function encrypt($strValue){
$iv =mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),MCRYPT_RAND);
$encData = trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,self::ENCRYPTION_KEY, $strValue,MCRYPT_MODE_CBC,$iv)));
            $data['iv'] = $iv;
            $data['encdata'] = $encData;

            return $data;
}
 /**
     *  Function to decrypt data using AES Encryption Symmetric Algorithm 128 bytes
     */
    function decrypt($strValue, $iv){
            return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,ENCRYPTION_KEY,base64_decode($strValue),MCRYPT_MODE_CBC,$iv));
    }

}    
$enc_obj = new Encypt();

$encstr = $enc_obj->createQueryString();

echo "Encrypted Str:-->".$encstr['encdata']."<br>";
$deCrypt = $enc_obj->decrypt($encstr['encdata'], $encstr['iv']);
echo "Decrypted Str:-->".$deCrypt;

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 2014-07-07
    • 2017-12-26
    • 2011-11-12
    • 2015-06-17
    • 2014-01-29
    • 2011-02-01
    • 2013-08-16
    • 2011-09-18
    相关资源
    最近更新 更多