PHP MCRYPT - 带有Mcrypt CBC的RIJNDAEL 128输出错误

时间:2013-06-10 13:48:23

标签: php mcrypt rijndael cbc-mode

我正在使用文字

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¤eDave1336407610774000000000000

我还提到了SIMILAR QUESTION并在解密中使用了“iv”功能并在其中回答了

有人可以指导我这里出错吗?

1 个答案:

答案 0 :(得分:2)

很有思想但是我找到了解决方案:

在解密时,我使用与加密时相同的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;