ストリーミング AEAD プリミティブは、ストリーミング データの認証付き暗号化を提供します。暗号化するデータが大きすぎて 1 つのステップで処理できない場合に便利です。一般的なユースケースとしては、大規模なファイルやライブ データ ストリームの暗号化などがあります。
暗号化はセグメント単位で行われ、セグメントは暗号文内の位置にバインドされているため、削除や並べ替えはできません。1 つの暗号文のセグメントを別の暗号文に挿入することはできません。既存の暗号文を変更するには、データ ストリーム全体を再暗号化する必要があります。1
暗号テキストの一部のみが一度に復号されて認証されるため、復号は高速です。暗号文全体を処理しなくても、部分的な平文を取得できます。
ストリーミング AEAD 実装は AEAD の定義を満たし、nOAE で安全です。プロパティは次のとおりです。
- Secrecy: 平文については、長さ以外は何もわかりません。
- Authenticity: 暗号テキストの基になる暗号化された平文を検出されることなく変更することはできません。
- Symmetric: 平文の暗号化と暗号テキストの復号は、同じ鍵で行われます。
- ランダム化: 暗号化はランダム化されます。同じ平文の 2 つのメッセージがあっても、暗号テキストは異なります。攻撃者は、特定の平文に対応する暗号テキストを認識できません。
関連データ
ストリーミング AEAD プリミティブを使用すると、暗号テキストを特定の関連データに関連付けることができます。フィールド user-id
と encrypted-medical-history
を持つデータベースがあるとします。このシナリオでは、encrypted-medical-history
を暗号化するときに、user-id
を関連データとして使用できます。これにより、攻撃者がユーザー間で医療履歴を移動させることを防ぐことができます。
キータイプを選択する
ほとんどの用途には AES128_GCM_HKDF_1MB をおすすめします。原則:
- AES-GCM-HKDF
- AES128_GCM_HKDF_1MB(または AES256_GCM_HKDF_1MB)の方が高速です。最大 264 バイトの 264 ファイルを暗号化できます。暗号化と復号のプロセスで約 1 MB のメモリが消費されます。
- AES128_GCM_HKDF_4KB は約 4 KB のメモリを消費します。システムにメモリがあまりない場合に適しています。
- AES-CTR HMAC
- AES128_CTR_HMAC_SHA256_1MB(または AES256_CTR_HMAC_SHA256_1MB)は、より保守的なオプションです。
セキュリティ保証
ストリーミング AEAD 実装は次の機能を提供します。
- CCA2 セキュリティ。
- 80 ビット以上の認証強度。
- 合計 251 バイト2 の 264 個以上のメッセージ3 を暗号化できる。最大 232 個の平文または暗号文を選択する攻撃で、成功確率が 2-32 を超えることはありません。
使用例
サイズの大きなファイルまたはデータ ストリームを暗号化したいをご覧ください。
-
この制限の理由は、AES-GCM 暗号を使用しているためです。同じ場所で別の平文セグメントを暗号化することは、IV を再利用することと同等であり、AES-GCM のセキュリティ保証に違反します。もう 1 つの理由は、攻撃者が検出されることなく以前のバージョンのファイルを復元しようとするロールバック攻撃を防ぐことです。 ↩
-
2 つの32 セグメントがサポートされており、各セグメントには
segment_size - tag_size
バイトの平文が含まれます。1 MB セグメントの場合、プレーンテキストの合計サイズは 232 *(220-16)~= 251 バイトです。 ↩ -
導出鍵(128 ビット)とノンス プレフィックス(独立したランダムな 7 バイト値)の組み合わせが繰り返されると、ストリーミング AEAD は安全でなくなります。184 ビットの衝突耐性があり、成功確率を 2-32 未満にするには、264 個のメッセージが必要です。 ↩