私が設計しているシステムでは、暗号化されたメッセージとメッセージ認証が必要です。 AES-GCMは、その認証機能と高いスループットのため、論理的な選択のようです。
メッセージの暗号化に使用されるキーは、通常、メッセージごとにランダムに生成され、受信者の公開キーを使用して暗号化されます。暗号化されたキーはメッセージとともに送信されます。
一般に、両当事者間に永続的な鍵はありません。
例として次のメッセージを見てみましょう:
{
"timestamp": "2017-01-01",
"encryptedMessage": "...",
"sign": "..."
"key": "..."
}
値「timestamp」はクリアテキストであり、「encryptedMessage」は暗号化され、「sign」は「timestamp」のRSA署名を保持し、「key」は暗号化された鍵を保持します。この例では。 「encryptedMessage」にも署名することは理にかなっていますか?
AES-GCMによって提供される信頼性よりもRSA署名を使用する利点はありますか?
AES-GCMを使用してすでに暗号化されているメッセージに署名することは理にかなっていますか?
AES-GCMの認証部分は、送信者と受信者だけが知っている送信者と受信者の間の共有キーに依存しています。スキームでは、暗号化(したがって認証)キーは特定の送信者にバインドされていません。つまり、受信者の公開キーを知っている全員がそのようなメッセージを作成できます。公開鍵は公開されていると見なされるため、これは誰でも実行できることを意味します。したがって、AES-GCMの認証部分は、メッセージが特定の送信者から送信されたことを証明するのではなく、メッセージのすべての部分が同じ送信者、つまり秘密鍵を生成した送信者から送信されたことを証明するだけです。
代わりに、RSAなどを使用した公開鍵暗号化により、メッセージが特定の送信者、つまり受信者が送信者の公開鍵をすでに知っている特定の秘密鍵を所有している送信者からのものであることを証明できます。これは、通信の関連部分が送信者の秘密鍵によって署名されていることを証明します。送信者はランダムなキーに署名できますが、一部の攻撃者が(受信者をハッキングして)単一のキーにアクセスし、キャプチャしたキーと一致する署名を以降のすべてのメッセージで再利用する(つまり、署名を再生する)と、システムが破損する可能性があります。したがって、代わりにメッセージ自体に署名する必要があります。
要約すると、AES-GCMとRSAは異なるレベルの認証を提供します。どちらが必要かは、特定のユースケースによって異なります。ただし、メッセージが特定の送信者(一部の攻撃者ではない)から送信されたことを確認する必要がある場合は、AES-GCMだけでは不十分です。