私が作業しているアプリケーションでは、ユーザーがファイルを暗号化できます。ファイルは任意の形式(スプレッドシート、ドキュメント、プレゼンテーションなど)にすることができます。
指定された入力ファイルに対して、暗号化されたデータファイルとキーファイルの2つの出力ファイルを作成します。元のデータを取得するには、これらの両方のファイルが必要です。キーファイルは、対応するデータファイルでのみ機能する必要があります。同じユーザーから、または他のユーザーからの、他のファイルでは機能しません。
AESアルゴリズムには、暗号化のための2つの異なるパラメーター、キーと初期化ベクトル(IV)が必要です。
キーファイルの作成には3つの選択肢があります。
異なる顧客が使用するのと同じアプリケーションであることに注意してください。
3つの選択肢すべてが同じ最終目標を達成すると思われます。しかし、正しいアプローチがどうあるべきかについてのフィードバックを受け取りたいと思います。
他の回答からわかるように、暗号化されたファイルごとに一意のIVを持つことが重要ですが、それはなぜですか?
最初に-暗号化されたファイルごとに一意のIVが重要である理由を確認しましょう。 ( IVに関するウィキペディア )。 IVは、暗号化プロセスの開始にランダム性を追加します。チェーンブロック暗号化モード(暗号化されたデータの1つのブロックに暗号化されたデータの前のブロックを組み込む)を使用する場合、IVが入る最初のブロックに関する問題が残ります。
IVがなく、キーだけでチェーンブロック暗号化を使用した場合、同一のテキストで始まる2つのファイルは同一の最初のブロックを生成します。入力ファイルが途中で変更された場合、2つの暗号化されたファイルは、その時点から暗号化されたファイルの終わりまで異なって見えるようになります。誰かが最初に類似性に気づき、ファイルの1つが何で始まっているかを知っていれば、他のファイルが何で始まっているかを推測できます。平文ファイルが何で始まり、それに対応する暗号文が何であるかを知ることで、その人は鍵を特定し、ファイル全体を復号化できます。
ここでIVを追加します-各ファイルがランダムなIVを使用する場合、最初のブロックは異なります。上記のシナリオは阻止されました。
では、各ファイルのIVが同じだったらどうなるでしょうか?さて、問題のシナリオが再びあります。各ファイルの最初のブロックは同じ結果に暗号化されます。実際には、これはIVをまったく使用しないことと違いはありません。
それでは、提案されたオプションを見てみましょう。
オプション1.アプリケーション内にハードコードされたIVを埋め込み、キーファイルにキーを保存します。
オプション2。アプリケーション内にハードコードされたキーを埋め込み、キーファイルにIVを保存します。
これらのオプションはほとんど同じです。同じテキストで始まる2つのファイルが、同じ暗号テキストで始まる暗号化されたファイルを生成する場合、うんざりしています。それは、これらのオプションの両方で起こります。 (すべてのファイルの暗号化に使用されるマスターキーが1つあると仮定します)。
オプション3.キーファイルにキーとIVの両方を保存します。
各キーファイルにrandomIVを使用する場合、問題ありません。 2つのキーファイルが同一になることはなく、各暗号化ファイルにはキーファイルが必要です。別のキーファイルは機能しません。
PS:オプション3とランダムIVを選択したら、復号化が成功したかどうかを判断する方法を調べ始めます。 1つのファイルからキーファイルを取得し、それを使用して別の暗号化ファイルを復号化してみます。復号化が進行し、ガベージ結果が生成される場合があります。この場合は、 認証された暗号化 の調査を開始してください。
IVに関する重要なことは、2つのメッセージに同じIVを使用してはならないです。他のすべては二次的です-一意性を確保できる場合、ランダム性はそれほど重要ではありません(しかし、それでも非常に良いことです!)。 IVは秘密である必要はありません(実際、CBCモードでは cannot be)秘密です。
そのため、IVをキーと一緒に保存しないでください。これは、すべてのメッセージに同じIVを使用することを意味し、IVを使用するポイントを無効にします。通常、IVを encrypted ファイルにクリアテキストで追加します。
このように独自の暗号モードを展開する場合は、関連する標準をお読みください。 NISTには、暗号モードに関する優れたドキュメントがあります: http://dx.doi.org/10.6028/NIST.SP.800-38A IV生成については、付録Cに記載されています- 暗号は微妙な芸術です。通常の暗号モードのバリエーションを作成しようと思わないでください。 99%の確率で、見た目より安全ですが、実際にはより安全ではないものを作成します。
IVを使用する場合、最も重要なことは、IVが可能な限り一意である必要があるため、実際にはランダムIVを使用することです。これは、アプリケーションに埋め込むことはオプションではないことを意味します。セキュリティを害しないため、IVをdataファイルに保存しますIVがランダム/一意である限り 。