PHP MCRYPT - 带有Mcrypt CBC的RIJNDAEL 128每次都会提供不同的加密字符串

时间:2013-06-12 15:23:58

标签: php mcrypt encryption-symmetric rijndael cbc-mode

我又回来了PHP + RIJNDAEl_128 + CBC。

我成功加密和解密原始字符串。

但我遇到的唯一问题是我每次都会收到不同的ENCRYPTION字符串。

我认为每次理想都应该是相同的。

以下是代码:

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;

2 个答案:

答案 0 :(得分:2)

每次运行时,您每次收到的加密文本的不同值都是正常的。这实际上是算法的一部分,使其更安全。

答案 1 :(得分:1)

您的加密功能有一个电话 mcrypt_create_iv(<<iv_size>>, MCRYPT_RAND);

由于调用具有MCRYPT_RAND(系统随机数生成器)作为源,因此每次创建的新初始化向量将与先前的不同。

这将导致每次都有不同的加密字符串。您可以使用加密过程中使用的相同初始化向量来解密密文。