コメントの質問で示唆されているように。これは、現在構築しているパターンとは少し異なるパターンです。
まず第一に、何かを暗号化する場合は、よく知られている一般に知られているツールを使用して暗号化してください。最近のクラシックは AES です。これは生の暗号であり、16 バイトのブロックで暗号化を実行します。必要なのは、128、192、または 256 ビット長の秘密鍵だけです。
実際には、基礎となる暗号はそれよりも多くの長さをサポートしていますが、アルゴリズムはこれら 3 つの長さで十分にテストされているため、それらに固執する可能性があります。
ここで、特定のケースで暗号をどのように使用できるかを決定する必要があります。暗号化モードの選択は非常に重要です。暗号化モードは、特定の暗号を使用する特定の方法です。最も基本的なのはECB (電子コードブック) です。これは、特定のキーを使用してブロックごとに暗号ブロックを適用するだけで構成されます。疫病のように避けるべきです!
暗号化モードを使用しても、まだ完了していません。次に、キー スケジュールと呼ばれるものを見つける必要があります。つまり、パスワードやパスフレーズなどの一意のキーが与えられた場合、基礎となる暗号システム (ブロック暗号 + 暗号化モード) に提供するために必要な暗号化キーを導出する必要があります。
AES-128 (128 ビット キーで使用される AES) に基づく単純なパターンから始めます。
主なスケジュール
パスフレーズからキーを導出する良い方法は、ハッシュ関数を使用することです。実用的なキーを取得するには、パスフレーズと (オプションの) 追加データをハッシュするだけです。HMACの構築に基づいて、私が提案するものは次のとおりです。
入力 : 7 ~ 80 文字のパスワードK 、ターゲット ユーザーを指定する文字列s (疑似など)、およびハッシュ関数H。
出力 :暗号鍵K s
次のプロセスを使用してK sを導出します。
K s = HMAC-H ( s , K )
Hのダイジェストの長さによっては、切り捨てて 128 ビットにしなければならない場合があります。(よく知られているハッシュ関数は通常、128 ビットを超える出力を持ちます)。たとえば、 H = SHA-1 またはH = MD5 を使用できます。
暗号システム
保存するデータの期間はわかりませんが、大きすぎないと思います。CBC (Cipher Block Chaining) モードをお勧めします。このモードでは、有名な 128 ビット キーと、初期化ベクトル(略してIV ) と呼ばれる追加の 128 ビット ベクトルが必要です。同じ (キー、IV) ペアを 2 回使用しないでください。(ルール[1])
ここで、次のことを前提として、次のことができます。
- ユーザーごとに 1 つのデータ ファイルがあります
- IO 操作で少しのオーバーヘッドを受け入れる
データは 512 バイト単位 (つまり、16 バイトの 32 ブロック) で暗号化します。IVパターンは単純です。16 バイトで 0 をエンコードすることから始め、新しい 512 バイト ブロックが追加されるたびに増分します。
簡単な例:
ユーザー Cthulhu は、友人と連絡を取り合い、邪悪な陰謀を共有したいと考えています。彼のパスフレーズは運命です。
- 彼のデータ ファイルはK Cthulhuを使用して暗号化されます。K = doomを使用すると、 K Cthulhu = HMAC-H (Cthulhu, doom) となります。
- ファイルは 512 バイトのチャンクに分割されます。データ チャンク番号iのIVは、 16 バイトのiの一般的な整数バイナリ表現です。
クトゥルフには多くの邪悪な友人がいる可能性があることは知っていますが、16バイトの整数がオーバーフローしないと合理的に推測できるため、ルール[1]が適用されます。
ここでは、それほど悪くはないが改善できる基本的な暗号システムが必要です。
- MAC (メッセージ認証コード) スキームによる認証済み暗号化の使用。CCMなど、一部の実行モードにはこれが含まれることに注意してください。
- キー スケジュールの強化: 選択したハッシュ関数に対してレインボー テーブル攻撃が発生する可能性があります。攻撃者にとって事態を複雑にするために、プロセスにランダム ソルトを導入します。
- パターン「ユーザーごとのファイル」を変更すると、「ねえ、ここで見つかるのは同じユーザーに関連している」などの情報が漏れるからです。
1 つ目は非常に簡単に導入できます ( CBCの代わりにCCMを使用するだけで、ほぼ完了です)。ただし、最後の点は解決がはるかに困難です。あなたがしなければならないことは、ファイルシステムで行われることと似ています。