web-dev-qa-db-ja.com

暗号文を認証するとき、何をHMACする必要がありますか?

EAXやGCMなどのAEAD固有のモードで 認証された暗号化にHMAC-SHA-256を使用したAES-256-CTR を使用することを主張する人もいます。

ただし、これを行う場合、これはwhatをHMAC化する必要がありますか?そしてどうやって?具体的には:

  1. 暗号化キーとは異なるキーを使用して、暗号文に署名する必要がありますか?
  2. その場合、一意の暗号化キーごとに一意の署名キーが必要ですか?
  3. その場合、2つのキーを(たとえば、より長い「仮想」キーとして)一緒に格納することは許容されますか?
  4. 暗号文(およびオプションの関連データ)のみをHMAC化する必要がありますか?
  5. NonceをHMACの一部にする必要がありますか?
  6. encryption鍵をHMACの一部にする必要がありますか(個別の暗号化鍵と署名鍵を想定)?
  7. HMACの暗号文、関連データ、および場合によっては他のコンポーネントをどのように相互に構成する必要がありますか?追加しますか? XOR?ネストされたHMAC?
16
Stephen Touset

MACは、関心のあるデータの変更、つまり復号化の結果を検出するためにあります。したがって、次の選択肢があります。

  • プレーンテキストデータに対してHMACを計算する(つまり、暗号化する場合は暗号化前、復号化する場合は復号化した後)。
  • または、暗号化されたデータ自体に対してHMACを計算します(つまり、暗号化時の暗号化後、復号化時の復号化前)。

2番目のケースでは、HMAC入力にすべてを含める必要があります復号化プロセスに影響を与えます。つまり、暗号化結果自体だけでなく、そのために使用されたIVも影響します暗号化、およびプロトコル全体がアルゴリズムの俊敏性をサポートしている場合は、暗号化アルゴリズムの仕様も入力する必要があります(そうでない場合、攻撃者はメッセージのヘッダーを変更して、「AES-256」というタグを「 「AES-128」を使用すると、知らないうちに間違ったアルゴリズムで復号化されます)。

securityの場合、2番目の選択肢(暗号化、次にMAC)の方が適しています。詳細については crypto.SEに関するこの質問 を参照してください(要約すると、MACが暗号化されたデータに対して計算される場合、プレーンテキストデータに関する情報をリークすることはできません。また、復号化を試みる前に検証されるため、選択した暗号文攻撃から保護します)。 SSLはMAC-then-encryptを使用しており、これが多くの問題の原因になっています(すべての「パディングOracle攻撃」およびいわゆるBEAST攻撃は、encrypt-then-MACで回避されました)。

鍵については、理想的には、暗号化鍵とMAC鍵は [〜#〜] prf [〜#〜] を使用してマスター鍵から導出する必要があります。簡単に言うと、マスターキーをハッシュします[〜#〜] k [〜#〜]SHA-512で。結果の前半は暗号化キー、後半はHMACのキーになります。

しかし、実際には、[〜#〜] eax [〜#〜] または [〜#〜] gcm [〜#〜]を使用する必要があります。彼らはすべてを正しく行い、(それは重要なポイントです)IVの選択に関して非常に軽い要件があります:反復しないIVが必要なだけなので、単純なカウンターを使用できますが、手作りのCTRは重複しないIV範囲(ランダムな選択が均一なIVは正しいが、ランダム性は難しい要件です)(そしてCBCはさらに悪く、予測不能ランダム性が必要です)。新しいシステムでEAXまたはGCMを使用するnotの唯一の正当化(下位互換性の制約がない場合)は、おそらくEAXまたはGCM実装が利用できないことです。この場合でも、一部のAES-ECBコードをEAX実装に改造する方がよいと私は主張します。

14
Thomas Pornin