web-dev-qa-db-ja.com

AES 256を使用した暗号化、IVは必要ですか?

私は256ビットキーを使用してAESで暗号化を調べています。たとえば、さまざまな言語の多くのメソッドが http://php.net/manual/en/function.openssl-encrypt.php 、そして私はIVパラメータがオプションであることに気づきました。これは、単一の256ビット文字列をキーとしてAES暗号化/復号化を完全に実装できることを意味しますか? IVの目的は何ですか。省略した場合、セキュリティは大幅に低下しますか?

私が無知だったことをお詫びします。私は最初に頭がおかしくなり、混乱しているように感じます。

ありがとう!

21
DanH

各キーを1回だけ使用する場合は、IVを使用しないでください。キーを複数回使用する場合は、毎回異なるIVを使用する必要があるため、(キー、IV)ペアは再利用されません。

IVの正確な要件は、選択した連鎖モードによって異なりますが、通常はランダムな128ビット値で問題ありません。暗号化するメッセージごとに異なる必要があります。通常はプレフィックスとして、暗号文と一緒に保存します。

12
CodesInChaos

同じ鍵で2つのメッセージを暗号化し、2つのメッセージが同じ16バイトの平文で始まるとします。 (キーサイズに関係なく、16バイトはAESのブロックサイズです。)暗号文の最初のブロックは同じですか?もしそうなら、あなたはすでに攻撃者にいくつかの情報を漏らしています。この情報が機密であるかどうかは、アプリケーションによって異なりますが、すでに悪い兆候です。暗号化がメッセージの兆候以上に漏洩した場合、その暗号化は機能していません。

IVの基本的な考え方は、原則として、各メッセージに少しランダムなコンテンツを付加することです。これがどのように機能するかは、モードによって異なります。 (コアAES操作は16バイトブロックでのみ機能します。モードはこれをより長いメッセージに拡張する方法です。)たとえば、 [〜#〜] cbc [〜#〜] を使用すると、各ブロックの暗号化は、前のブロックのキー、平文ブロック、および暗号文から計算されます。最初のブロックでは、存在しない前のブロックの暗号文の代わりにIVが使用されます。 IVは通常、暗号文と一緒にクリアテキストで送信され、通常は暗号化メッセージの最初の16バイトで送信されます。

[〜#〜] ctr [〜#〜] モードは技術的にはIVではなくカウンターを使用しますが、操作上は非常に似ています。16バイトのランダムな値が送信者によってランダムに生成され、送信されます暗号化されたメッセージの先頭。 CTRモードでは、キーとカウンターから推定された疑似ランダムストリームで平文をXORすることによりCTRが機能するため、別のメッセージにその値を再利用することは致命的です。同じカウンター値を使用する2つの暗号化されたメッセージがある場合、それらのXORは2つの平文のXORです。

不適切に選択されたIVに対する攻撃は、ここにリストしたものよりも多くなっています。メッセージごとにランダムなIVを生成し(暗号品質のランダムジェネレーターを使用します。これは、キーの生成に使用するものと同じです)、問題ありません。

1つの例外があります。メッセージごとに新しいキーを生成する場合は、予測可能なIV(全ビット0または何でも)を選択できます。それでもIVでモードを使用する必要があります(ECBは問題ありません。たとえば、2つの同一の入力ブロックが同じ暗号化を持つため、プレーンテキストで繰り返しが公開されます)。ただし、これはまれなケースです(通信ではなくストレージで発生します)。

アプリオリの暗号化は、データの完全性ではなく、データの機密性のみを保証することに注意してください。データの処理方法によっては、これが問題になる場合があります。特に、攻撃者が一時的な暗号文を送信して復号化したり、追加の平文を暗号化して提供したりできる場合、これにより情報が漏洩する可能性があります。 [〜#〜] eax [〜#〜][〜#〜] gcm [〜#〜] などのいくつかのモードは 認証された暗号化 を提供します=:暗号文は、本物である場合にのみ復号化されます。可能であれば、これらのいずれかを使用してください。

AES-128は、実際にはAES-256と同じくらい安全です にも注意してください。

自分がやっていることに慣れていない場合は、直接暗号に取り組んでいるのではなく、高レベルのライブラリを使用してみてください。