8

私の知る限り、CTRモードは初期ベクトルを使用しません。カウンターを取得し、指定されたキーで暗号化してから、暗号文を取得するために結果をプレーンテキストでXORします。

暗号化を行う前のCBCのような他のブロック暗号モードは、平文を初期ベクトルとXORします。

これが私の問題です。私はJavaで次のコードを持っています(bouncycastleライブラリを使用):

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] result = cipher.doFinal("Some plaintext");

同じキーを使用して上記のコードを呼び出すたびに、異なる出力が得られます。しかし、行うとき:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key, IV);

byte[] result = cipher.doFinal("Some plaintext");

上記のコードを呼び出すたびに同じ結果が得られます。しかし、これはなぜですか?つまり、CTRはIVを必要としないので、すべての呼び出しでIVを与えないと、異なる結果が得られ、IVを与えたときに同じ結果が返されるのはなぜですか?クリック率を使用するときに常に上記のIV(すべてゼロ)を使用する場合、それは安全ですか?

どんなアイデアも非常に役に立ちます。ありがとうございました

4

3 に答える 3

7

CTRモードでの最も重要な注意点は、同じキーで同じカウンター値を再利用することは決してないということです。そうすれば、あなたは事実上あなたの平文を配ったことになります。

これを支援するために、CTRモードの実際の実装では、ブロック暗号に渡されるブロックが2つの部分に分割され、(全体をカウンターと呼ぶのではなく)IVとカウンターとしてラベル付けされます。IVはランダムに生成され、カウンターは0から始まります。

これにより、「IV」部分を再利用しない限り、複数のメッセージに対して「カウンター」部分をゼロから開始できます。

ただし、これは単なるラベル付けの規則であることに注意してください。数学的には、すべてを「カウンター」と呼び、メッセージごとに整数のランダムな倍数でカウンターを開始するのと同じです。

バウンシーキャッスルの実装が具体的にどのように機能しているかはわかりません。おそらく、初期ブロック全体、カウンター、およびすべてにIV値を設定できるようになっています。あなたがそれを供給しないならば、それは明らかにあなたのために賢明なIVを生成しています、それはあなたが同じ入力で異なる出力を得る理由です。肝心なのは、これは良いことであり、まさにあなたが望むものです-すべてのゼロを提供することは悪いことであり、あなたが望むものではありません。

于 2011-02-10T00:58:14.060 に答える
3

CTRは、カウンターの連続する値を暗号化することによって機能します。そのシーケンスの最初の値IVです(IVは「初期値」を意味します...)。したがって、CTRは実際にIVを使用します。

同じキーでCTRモードを使用し、(同じキーで)他の暗号化にすでに使用したカウンター値を再利用すると、悪名高い2回パッドが表示され、セキュリティが低下します。ドレイン。特に、すべてのメッセージに固定IVを使用することは、災害の確実なレシピです。

カウンターの繰り返しを回避する「簡単な」方法は、可能なIVのセット、つまりすべての16バイトシーケンスの中から、暗号的に安全な乱数ジェネレーター( ""と考えてください)を使用してIVを常に選択することです。java.security.SecureRandomそのスペースは十分に大きいため、ある時点でカウンター値を再利用するリスクは無視できます。

完全を期すために、特定のキーを1回だけ使用するようにすると、固定IVは許容されます。同じカウンター値を同じキーで再利用すると、セキュリティの問題が発生します。ただし、メッセージごとに新しいキーを設定することは、メッセージごとに新しいIVを設定することと少なくとも同じくらい困難です。

于 2011-02-10T16:03:52.047 に答える
0

CTRモードは、基本的にIVと同等であり、カウンターの初期値であるものを使用します。

于 2011-02-10T00:14:16.593 に答える