3

暗号化メカニズムを使用する必要があります。利用可能であり、その例として、mcrypt を選択しました。しかし、生成時間が長すぎることがわかります。与えられた例のように IV を使用すると、削除するとすぐに暗号化された値が生成されるのに時間がかかりました。

// Code example using IV
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_RANDOM);

$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB, $iv);
return base64_encode($encryptedString);

// Code example without IV    
$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB);
return base64_encode($encryptedString); 

では、IV を使用しない暗号化に大きなセキュリティ上の問題があるとしたら?

4

1 に答える 1

4

DEV_RANDOM/dev/random安全なデータを生成するために、マウスの動き、キーボードストロークなどの予測不可能なデータをリッスンする、または同等のランダムな整数を生成します。キーストロークなどがなければ、十分なデータが得られるまで待つだけです...そしてそれが遅い理由です。

DEV_URANDOM上記のデータも使用/dev/urandomする場合がありますが、それに加えて、擬似乱数ジェネレーターを組み合わせてリアルタイムでランダムデータを提供します (これはより予測可能ですが、これは多くの場合重要ではありません)。

これらは、IV の構築方法を決定するために使用されます。


今IVに。

IV は、暗号化関数で使用されるランダム関数の初期シードを導出するために使用されます。

ECB を使用します。最初に気付くのは、ECB は IV を使用しないため、あなたが書いた内容は意味をなさないということです。ECB を使用する場合は、IV の作成を完全にスキップでき、問題なくデータを復号化できます。しかし、もう 1 つは、ECB を使用してはならないということです。ECB は、同じデータを持つすべてのブロックが同じように見えるように、データをエンコードします。一方、CBC は、すべてのブロックを前のブロックからのデータで xor します (このためには、IV が必要です)。これらの違いを示すために、これを見てください。

左から右へ: 元の画像、ECB モードでエンコードされた画像、CBC モードでエンコードされた画像。

CBC を使用する場合は、個別に暗号化するデータごとに IV を再生成する必要があります。そうしないと、ECB を使用するのと同じくらい悪いことになります。毎回 IV を再生成することで、反復ベースの攻撃を防ぎます。

最後に、CBC を使用する場合は、後でテキストを解読できるように IV を保存する必要があります。そうしないとゴミがでます。幸いなことに、ほとんどの暗号化アルゴリズムは IV を公開できるように設計されているため、IV を秘密にしておくことを心配する必要はありません。


TL;DR:データごとに個別に再生成されたパブリック IV で CBC を使用します。

(また...復号化を気にしない場合は、代わりに暗号化ハッシュに興味があるかもしれません。)

于 2015-05-15T13:29:19.170 に答える