今晚我已经完成了基础密码学的速成课程,我想我不想明确地发送一个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);
任何人都可以看到我的代码问题,并向我解释我做错了什么?
答案 0 :(得分:4)
您无需加密IV,可以安全地发送。通常它被添加到密文之前。如果分析CBC模式的结构,可以看到IV仅影响第一个密码块。第二个密码块的“IV”是第一个密码块,第三个密码块的“IV”是第二个密码块。任何攻击者都已经知道每个密码块,所以他们已经知道了大部分的“IV”。
CBC模式的安全性在于密钥,而且只在密钥中。具有密文和IV的攻击者无法恢复密钥,因此没有必要进行额外的工作来加密IV。
答案 1 :(得分:1)
我相信你需要写:
$encrypted = base64_decode(urldecode($_GET['password']));
而不是错误的解密顺序。