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

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

AEAD には次の特性があります。

  • 秘密保持: 平文については、長さ以外には何も知られていない。
  • 真正性: 暗号テキストの基となる暗号化された平文を検出せずに変更することはできません。
  • 対称性: 平文の暗号化と暗号テキストの復号は、同じ鍵で行われます。
  • ランダム化: 暗号化はランダム化されます。同じ平文の 2 つのメッセージでは、暗号テキストが異なります。攻撃者は、特定の平文に対応する暗号テキストを認識できません。これを回避するには、代わりに確定的 AEAD を使用します。

関連データ

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

キータイプの選択

ほとんどの場合は AES128_GCM をおすすめしますが、さまざまなニーズに応じてさまざまなキータイプがあります(256 ビット セキュリティの場合、以下で AES128 を AES256 に置き換えてください)。原則:

  • 16 バイトの初期化ベクトル(IV)を持つ AES128_CTR_HMAC_SHA256 は、良好な境界を持つ最も控えめなモードです。
  • AES128_EAX は AES128_CTR_HMAC_SHA256 よりもやや保守的でなく、わずかに高速です。
  • 通常は AES128_GCM が最も高速なモードで、メッセージ数とメッセージ サイズの上限が最も厳しくなっています。平文および関連するデータ長に関するこれらの上限(下記)を超えると、AES128_GCM が失敗し、鍵マテリアルが漏洩します。
  • AES128_GCM_SIV は AES128_GCM とほぼ同じ速度で、大量のメッセージに非常に適切な境界がありますが、やや確立されていません。これを Java で使用するには、Conscrypt をインストールする必要があります。
  • XChaCha20Poly1305 では、AES128_GCM よりもメッセージ数とメッセージ サイズに大幅な上限がありますが、失敗した場合(ごくまれに)、鍵マテリアルが漏洩します。ハードウェア アクセラレーションが利用できないため、ハードウェア アクセラレーションが使用可能な場合は、AES モードよりも遅くなることがあります。

セキュリティ保証

AEAD の実装により、次のようなメリットがあります。

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

サンプル ユースケース

たとえば、データを暗号化し、暗号テキストをコンテキストにバインドします。