用字符串加密IV并解密它?

时间:2012-11-09 11:28:31

标签: php encryption cryptography

今晚我已经完成了基础密码学的速成课程,我想我不想明确地发送一个IV,所以我用字符串加密它。

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key1, $string, MCRYPT_MODE_CBC, $iv);
$string = $iv.$encrypt;
$encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $string, MCRYPT_MODE_ECB);

$return = urlencode(base64_encode($encrypt));

并解密我已经得到了这个,但它没有用

$encrypted = base64_decode(urldecode($_GET['password']));
$encrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key2, $encrypted, MCRYPT_MODE_ECB);

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$iv = mb_strcut($encrypted, 0, $iv_size);
$password = mb_strcut($encrypted, $iv_size);

$password = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key1, $password, MCRYPT_MODE_CBC, $iv);

任何人都可以看到我的代码问题,并向我解释我做错了什么?

2 个答案:

答案 0 :(得分:4)

您无需加密IV,可以安全地发送。通常它被添加到密文之前。如果分析CBC模式的结构,可以看到IV仅影响第一个密码块。第二个密码块的“IV”是第一个密码块,第三个密码块的“IV”是第二个密码块。任何攻击者都已经知道每个密码块,所以他们已经知道了大部分的“IV”。

CBC模式的安全性在于密钥,而且只在密钥中。具有密文和IV的攻击者无法恢复密钥,因此没有必要进行额外的工作来加密IV。

答案 1 :(得分:1)

我相信你需要写:

$encrypted = base64_decode(urldecode($_GET['password']));

而不是错误的解密顺序。