脆弱なパスワード (ex の場合は小文字 8 文字) とファイルから始めます。そのパスワードを使用してそのファイルを暗号化する必要があります。結果は、既知の攻撃に対して安全でなければなりません。
アプローチ 1: SHA-256 を使用してパスワードをハッシュし、結果のハッシュとファイルを AES-256 への入力として使用して、暗号化されたファイルを作成することができます。SHA-256 と AES-256 の両方が非常に高速であることは理解しています。これにより、ファイルがブルート フォース攻撃に対して脆弱になるのではないでしょうか?
たとえば、事前に計算された SHA-256 ハッシュのレインボー テーブルを取得し、そのファイルが非常に小さく、パスワードが非常に脆弱であると想定して、そのテーブルからの各ハッシュを使用して妥当な時間内に AES-256 復号化を試みることができます (数特殊なハードウェアで数か月)。
アプローチ 2: bcrypt を使用します。私が正しく理解していれば、bcrypt は SHA-256 + AES-256 よりもファイルの暗号化に適しています。これは、キー生成スキームに作業要素があり、より強力なキーが得られるためです。それとも私が間違っていますか?
私が見た Ruby と Python の実装 (ラッパー?) は、暗号自体ではなく、パスワードのハッシュ スキームとして bcrypt を使用することに重点を置いています。bcrypt を使用して弱いパスをハッシュし、「ワンステップ」でファイルを暗号化することもできますか?
アプローチ 3: bcrypt を使用してパスをハッシュし、そのハッシュとファイルを AES-256 への入力として使用して、暗号化されたファイルを取得します。これにより、「鍵の生成が速すぎる」という問題が解決されます。(問題があると仮定します。)ただし、bcrypt ハッシュの長さは 448 ビットであり、AES-256 は 256 ビットのキーを必要とします。単純な解決策は、ハッシュの末尾のビットを単純に削除し、それを AES-256 のキーとして使用することです。結果がどうなるかを知るために暗号化について十分に知らないので、私はこのルートには行きません。
編集:これはオフライン アプリケーション用であるため、パスをソルトすることはできません。すなわち。塩を保管する合理的な場所はありません。パスをソルトし、ソルトを暗号化されていない状態で、暗号化されたファイルとともに保存できます。データベースが侵害された場合、ソルトはほとんど本質的にパブリック/可視です。ソルトの目的は、レインボー テーブル攻撃を防ぐことです。Nemo に感謝します。