以前の質問に触発されて、今では非常に興味深いアイデアがあります。Rfc2898DeriveBytes
パスフレーズ文字列から暗号化キーと初期化ベクトルを「安全に派生」させるために、または同様のクラスを使用する必要があるのでしょうか、それともその文字列の単純なハッシュが機能するのでしょうか。対称アルゴリズム(AES、DESなど)でデータを暗号化する場合、キー/ IVと同様にうまくいきますか?
大量のAES暗号化コードスニペットが表示されます。Rfc2898DeriveBytes
classは、パスワード文字列から暗号化キーと初期化ベクトル(IV)を導出するために使用されます。暗号化に十分な安全性のあるキー/IVを導出するには、ランダムなソルトと大量の反復を使用する必要があると想定されています。この方法を使用してパスワード文字列からバイトを導出することは、一部のシナリオでは非常に便利ですが、対称アルゴリズムを使用してデータを暗号化する場合は適用できないと思います。その理由は次のとおりです。事前に計算されたレインボーテーブルを作成する可能性がある場合はsaltを使用するのが理にかなっており、攻撃者がハッシュを入手すると、結果として元のパスワードを検索します。しかし...対称データ暗号化では、パスワード文字列のハッシュまたは暗号化キーがどこにも保存されないため、これは必要ないと思います。したがって、パスワードのSHA1ハッシュを取得し、それを暗号化キー/ IVとして使用する場合は、そうではありません。
そのパスワードのSHA1(またはその他の)ハッシュを使用できる場合、クラスを使用してパスワード文字列からキー/ IVを生成する目的は何ですかRfc2898DeriveBytes
(これは非常にパフォーマンスが高い操作です)。ハッシュを使用すると、(文字列バイトを直接使用するのではなく)キーにランダムなビット分散が発生します。そして、攻撃者はとにかくキーの全範囲をブルートフォースする必要があります(たとえば、キーの長さが256ビットの場合、2 ^ 256の組み合わせを試す必要があります)。
Rfc2898DeriveBytes
したがって、私が危険な方法で間違っているか、暗号化キーとIVを生成する方法を使用するAES暗号化のすべてのサンプル(ここSOでの多くの賛成の回答を含む)などがちょうど間違っています。