0

今晚我几乎完成了关于基本密码学的速成课程,我想我不想清楚地发送 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);

谁能看到我的代码的问题并向我解释我做错了什么?

4

2 回答 2

4

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

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

于 2012-11-09T12:24:56.707 回答
1

我相信你需要写:

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

而不是有什么错误的解密顺序。

于 2012-11-09T12:03:00.133 回答