web-dev-qa-db-ja.com

ハイブリッドRSA、AES、およびHMAC SHA-256を使用した暗号化メッセージの送信

これは、Hybrid RSA 2048、AES 256を使用し、HMAC SHA-256で認証された大きな暗号化メッセージを送信するための安全な戦略ですか?

アリスがボブのRSA公開鍵をすでに持っているとすると、アリスは次のようになります。

  1. 新しい128ビットを生成[〜#〜] iv [〜#〜](強いPRNG)
  2. 新しいAES 256ビット/ CBC/PKCS7暗号鍵を生成(Kc)
  3. 新しいAES 256ビット/ CBC/PKCS7認証キーを生成(Ka)
  4. (Kc)および[〜#〜] iv [〜#〜] => (M)eを使用してメッセージとタイムスタンプを暗号化します
  5. 認証IV +(M)e with (Ka) HMAC SHA-256を使用=> IV +(M)e + Tag
  6. 暗号化(Ka)+(Kc)ボブのRSA公開鍵にOAEPを埋め込んだもの=> (Kc + Ka + P)e
  7. 認証(Kc + Ka + P)e with (Ka) using HMAC SHA-256 => IV +(Kc + Ka + P)e + Tag
  8. Bob RSA暗号化IV +(Kc + Ka + P)e + TagおよびAES HMAC-256メッセージIV +(M)e + Tagを送信します

ボブは次に進みます:

  1. [〜#〜] iv [〜#〜]IV +(Kc + Ka + P)e + Tagから抽出
  2. [〜#〜] iv [〜#〜]をnonceキャッシュに対してチェックし、IVが繰り返されるメッセージを拒否します
  3. 抽出および復号化(Kc + Ka + P)e彼のRSA秘密鍵を使用=> (Ka)+(Kc)
  4. IV +(Kc + Ka + P)e + Tag(Ka)で検証し、無効なメッセージを拒否します
  5. IV +(M)e + Tag(Ka)で検証し、無効なメッセージを拒否します
  6. 復号化IV +(M)e + Tag with (Kc)
  7. タイムスタンプとメッセージを抽出します
  8. TimestampがMax Request Ageより古くないことを確認し、期限切れのメッセージを拒否します

基本的に、上記のハイブリッドRSA/AES/HMAC SHA-256アプローチに明らかな弱点があるかどうか、または誰かが別の方法で行うことはありますか?

上記の戦略は、マスターキーのSHA-512ハッシュから派生するのではなく、暗号化と認証用に個別のAESキーを作成する @ puzzlepalace's feedback を含むように改訂されました。

他のフィードバックや改善のための提案は大歓迎です!

7
mythz

私は一歩一歩順を追って説明しますが、全体的な暗号化システムは、私にとって最も論理的であるようです。

  1. 新しいAES 256ビット/ CBC/PKCS7マスターキー(Km)を生成する
  2. 新しい128ビットIV(強力なPRNG)を生成する

攻撃者がアクセスできるOracleの種類はなく、ビットフリッピング攻撃はタグによって除外されているため、CBCはここで問題ありません。ランダムIVは正しいです。キーサイズとしては256ビットで十分です。

  1. (Km)のSHA-512ハッシュを生成=>(Hm)
  2. (Hm)を暗号鍵=>(Kc)と認証鍵=>(Ka)に分割します。

これで問題ありません。 1つのコメント、私は実際にはハッシュを介して展開されるマスターシークレットに精通していません(したがって、これがベストプラクティスと考えられる場合は修正してください)、256ビットキーを2つだけ生成しない理由はありますか?ネットワークでパケットサイズを節約する必要がない限り、AES用とHMAC用の2つの256ビットキーを生成しないのはなぜでしょうか。ネットワーク上では256ビットしかありません。

  1. (Kc)およびIV =>(M)eを使用してメッセージとタイムスタンプを暗号化する
  2. (Ka)でHMAC SHA-256を使用して(IV)+(M)eに署名=>(IV +(M)e + Tag)

これは問題ありません。暗号化してからMACを使用すると、IND-CCAになります(つまり、最高の汎用構造)。ほんの少し注意:HMACは署名ではなく、タグです。 (タグは整合性と信頼性を提供し、署名は否認防止も提供します)。

  1. OAEP =>(IV + Km + P)eが埋め込まれたボブのRSA公開鍵で(IV + Km)を暗号化
  2. Bob RSA暗号化AESキー(IV + Km + P)eおよび署名済みAESメッセージ(IV +(M)e + Tag)を送信します

OAEPはRSAパディングに適した選択肢であり、IND-CCAです。ここでは問題はありません。

対称方式と非対称方式の両方が、非常に安全な選択された暗号文攻撃の影響を受けないように見えます。そのため、RSA暗号文とAES暗号文の両方で同じIVを暗号化することは問題ではないと思います。特に、IVはCBCモードで秘密である必要もないため(予測可能または再利用すべきではありません!)、平文で送信することができます(おそらく、AES暗号文にプレーンテキストIVを追加して、それ)。次に、受信者の公開鍵で暗号化する必要もありません。

ご不明な点がございましたら、お気軽にご説明ください。

1
puzzlepalace