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 が最初の暗号ブロックにのみ影響を与えることがわかります。2 番目の暗号ブロックの「IV」は 1 番目の暗号ブロックであり、3 番目の暗号ブロックの「IV」は 2 番目の暗号ブロックです。攻撃者はすべての暗号ブロックをすでに知っているため、ほとんどの「IV」をすでに知っています。

CBC モードのセキュリティはキーにあり、キーのみにあります。暗号文と IV を持つ攻撃者はキーを回復できないため、IV を暗号化するために余分な作業を行う意味はありません。

于 2012-11-09T12:24:56.707 に答える