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