関連データ(AEAD)による認証された暗号化

関連データを伴う認証付き暗号化(AEAD)プリミティブは、データ暗号化の最も一般的なプリミティブであり、ほとんどのニーズに適しています。

AEAD には次のプロパティがあります。

  • Secrecy: 平文の長さ以外の情報は一切わかりません。
  • 真正性: 未検出の暗号テキストの基になる暗号化された平文 を変更することはできません。
  • 対称性: 平文の暗号化と、暗号テキストの復号は、 同じ鍵で行われます。
  • ランダム化: 暗号化はランダム化されます。同じ平文の 2 つのメッセージがあっても、暗号テキストは異なります。攻撃者は特定の平文に対応する暗号テキストを認識できません。これを回避するには、代わりに Deterministic AEAD を使用します。

関連データ

AEAD を使用すると、暗号テキストを特定の関連データに関連付けることができます。たとえば、user-id フィールドと encrypted-medical-history フィールドを含むデータベースがあるとします。このシナリオでは、encrypted-medical-history を暗号化するときに、user-id を関連データとして使用できます。これにより、攻撃者が医療履歴をあるユーザーから別のユーザーに移動することを防ぐことができます。

関連データは省略可能です。指定した場合、復号が成功するのは、暗号化呼び出しと復号呼び出しの両方に同じ関連データが渡された場合のみです。

鍵の種類を選択する

ほとんどの用途には AES128_GCM をおすすめしますが、ニーズに応じてさまざまな鍵の種類があります。AES128 は 128 ビットのセキュリティを提供し、AES256 は 256 ビットのセキュリティを提供します。

モードを選択する際の 2 つの重要なセキュリティ制約は次のとおりです。

  1. QPS: 同じ鍵で暗号化されるメッセージの数。
  2. メッセージ サイズ: メッセージのサイズ。

サポートされている鍵の種類:

  • 16 バイトの初期化ベクトル(IV)を使用する AES-CTR-HMAC(AES128_CTR_HMAC_SHA256、AES256_CTR_HMAC_SHA256)は、上限が適切で最も保守的なモードです。
    • 鍵のコミット。
  • AES-EAX(AES128_EAX、AES256_EAX)は、AES128_CTR_HMAC_SHA256 よりもわずかに保守的ではなく、わずかに高速です。
    • 鍵のコミット MLGR ではありません。
  • AES-GCM(AES128_GCM、AES256_GCM)は通常、最も高速なモードで、メッセージ数とメッセージ サイズに最も厳しい制限があります。平文と関連データの長さ(下記)の制限を超えると、AES-GCM は平文と AES-GCM 内部鍵の認証部分を漏洩して、致命的なエラーが発生します。
    • AES-GCM は堅牢ではなく [ABN]、 鍵のコミットも行いません [GLR]。2 つの異なる鍵で復号可能な暗号テキストを生成できます。これにより、実用的な攻撃につながる可能性があります [DGRW]。鍵が攻撃者によって選択される場合は、脅威モデルを慎重に確認してください。
  • AES-GCM-SIV(AES128_GCM_SIV、AES256_GCM_SIV)は、AES-GCM とほぼ同じ速度です。 メッセージ数とメッセージ サイズの制限は AES-GCM と同じですが、これらの制限を超えた場合、致命的なエラーは発生しません。2 つのメッセージが等しいという事実のみが漏洩する可能性があります。そのため、AES-GCM よりも安全に使用できますが、実際にはあまり使用されていません。Java でこれを使用するには、Conscrypt をインストールする必要があります。
    • 鍵のコミット ADGKLS ではありません。
  • XChaCha20-Poly1305(XCHACHA20_POLY1305)は、AES-GCM よりもメッセージ数とメッセージ サイズの上限がはるかに大きくなりますが、失敗した場合(可能性は低い)、鍵マテリアルも漏洩します。ハードウェア アクセラレーションは使用されないため、ハードウェア アクセラレーションが使用可能な場合は、AES モードよりも遅くなる可能性があります。
    • 鍵のコミット LGR ではありません。

AEAD 暗号テキストのワイヤ形式の詳細をご確認ください。

セキュリティ保証

AEAD 実装では、次の機能が提供されます。

  • CCA2 セキュリティ。
  • 少なくとも 80 ビットの認証強度。
  • 合計 250 バイトで少なくとも 232 個のメッセージを暗号化できます。232 個までの選択された平文 または選択された暗号テキストを使用した攻撃では、成功確率が 2-32 を超えることはありません。

サンプル ユースケース

データを暗号化したいと暗号テキストをコンテキストに バインドしたいをご覧ください。