共通鍵やプリマスタシークレットなどの細かい計算方法などは記載してません。
難しくて、面倒なので概要だけ記載しました。
ざっくりで見て下さい
共通鍵交換方式
インターネット上は誰が盗聴しているか解らないので、安全でない通信経路を通じて、共通鍵をお互いに安全に作成する方式です。
複数の方式があり
項目 | RSA | DH | DHE | ECDHE |
方式 | 公開鍵 | 共通鍵暗号方式 | 共通鍵暗号方式 | 共通鍵暗号方式 |
共通鍵の作成方法 | 公開鍵で 暗号化して送信 |
計算で導出 | 計算で導出 | 計算で導出 |
前方秘匿性 | ✕ | ✕ | 〇 | 〇 |
安全性 | △ | ✕ | 〇 | 〇 |
使用度 | TLS1.2まで使用可能 | TLS1.2では使えるが非推奨 | TLS1.3でも使用可 | TLS1.3でも使用可 |
RSA鍵交換方式
RSA鍵交換方式はTLS 1.2 までは、利用可能で現在も使われていますが、
現代のセキュリティの観点からはRSA鍵交換は推奨されておらず、利用は減っていて、TLS1.3では使用できません。
RSA自身は「公開鍵暗号」であり、「鍵交換」として使われる場合、
その役割は「共通鍵暗号アルゴリズムで使うための共通の鍵(プリマスターシークレット)を、
公開鍵暗号の仕組みを使って安全に相手に伝達することです。
流れ
0 サーバーは、「サーバーの秘密鍵」と、その対になる「サーバーの公開鍵」というペアを持っています。
(これは、証明書を作るときの秘密鍵とサーバ証明書に付属する公開鍵です)
1 クライアントはクライアントHelloで使える暗号スイートリストと乱数を送信します
2 サーバは暗号スイートリストから使用する暗号スイートと乱数とサーバ証明書(公開鍵)をクライアントへ送信します(今回はRSA鍵交換方式を選択した事とする)
3 クライアントは証明書を検証し、問題ないようなら、プリマスタシークレット(一時的な乱数)を生成する
4 サーバの公開鍵でプリマスタシークレットを暗号化して送信する
5 サーバはプリマスタシークレットを秘密鍵で復号する
(サーバの公開鍵で暗号化した物は対となる秘密鍵でしか復号できません)
6 クライアントとサーバーは、共有した「プリマスターシークレット」と最初に交換した
「クライアントの乱数」と「サーバーの乱数」を組み合わせセッション鍵(共通鍵)を作成する
7 暗号化通信の開始します
RSAの弱点 前方秘匿性(Forward Secrecy)がない
「サーバーの秘密鍵」が漏洩したら、
乱数は公開されている情報なので、プリマスタシークレットが復号されれば共通鍵が作成されてしまいます。
どのクライアントもプリマスタシークレットはサーバの公開鍵で暗号化しているので、パケットキャプチャされていたら全ての通信は復号・閲覧可能となってしまいます。

DH(Diffie-Hellman)鍵交換方式
1976年に、Diffie(ディフィー)とHellman(ヘルマン)によって考案されました共通鍵交換方式です。
2人の天才が考えた方式です。すごいですね~😲
DH(固定)鍵交換方式はTLS 1.2 までは、利用可能ですが、セキュリティの観点からは推奨されていません。
流れ
0 サーバーは事前に「サーバDH鍵用-秘密値」と「公開値素A」・「公開値素B」を使って「サーバDH鍵用-公開値」を用意します。
※以下「サーバDH鍵用-秘密値」=「S-DH-秘密値」・サーバDH鍵用-公開値」=「S-DH-公開値」
1 クライアントはHelloで使える「暗号スイートリスト」と「クライアント乱数」を送信
2 サーバは暗号スイートリストから使用する「暗号スイート」・「サーバ乱数」・「サーバ証明書」・「公開値素A」・「公開値素B」・「S-DH-公開値」をクライアントへ送信 (今回はDH鍵交換方式を選択したとする)
3 クライアントは証明書を検証し問題ない場合は
クライアントは「クライアントDH鍵用-秘密値」を作成します。
クライアントは「クライアントDH鍵用-秘密値」と「公開値素A」を合わせて「クライアントDH鍵用-公開値」を作成
※以下「クライアントDH鍵用-秘密値」=「C-DH-秘密値」
「クライアントDH鍵用-公開値」=「C-DH-公開値」
クライアントは「C-DH-秘密値」と「S-DH-公開値」を使って「プリマスタシークレット」を作成する
4 クライアントは「C-DH-公開値」をサーバへ送信する
5 サーバはクライアントから受け取った「C-DH-公開値」とサーバの「S-DH-秘密値」を使って
「プリマスタシークレット」を作成します
※プリマスタシークレットはサーバ・クライアント共に同じものが作成されます
6 サーバとクライアントは「プリマスタシークレット」・「クライアント乱数」・「サーバ乱数」を計算して共通鍵を作成します
7 暗号通信の開始
固定DH方式の弱点 前方秘匿性(Forward Secrecy)がない
固定DH方式では、サーバーはセッションごとに新しい鍵ペアを生成せず、(固定された)DH秘密値と公開値のペアを使い回します。
なので、RSAと同様にサーバの秘密値が漏えいしたら、すべての通信は復号できてしまいます。

DHE(Diffie-Hellman Ephemeral)鍵交換方式
DHE(Diffie-Hellman Ephemeral)「Ephemeral(エフェメラル)」=「一時的な」「使い捨ての」
DHより改良され「前方秘匿性」に対応
なので、DHの作成する共通鍵を一時的なものにして、セッションごとに新しい共通鍵を作成します。
セッションが終了すると、一時的な共通鍵は破棄します
共通鍵又は一時的な秘密値がバレた場合は一部のデータのみ復号されますが、他のセッションデータは復号できません
流れ(TLS1.2を想定してます)
1 クライアントはHelloで使える「暗号スイートリスト」と「クライアント乱数」を送信する
2 サーバーは「一時的なサーバDHE鍵用-秘密値」を作成します。
サーバは「公開値素A」・「公開値素B」を使って「一時的なサーバDHE鍵用-公開値」を作成します
※以下「一時的なサーバDHE鍵用-秘密値」=「S-DHE-temp秘密値」
「一時的なサーバDHE鍵用-公開値」=「S-DHE-temp公開値」
サーバは暗号スイートリストから使用する「暗号スイート」・「サーバ乱数」・「サーバ証明書」・「公開値素A」・「公開値素B」・「S-DHE-temp公開値」をクライアントへ送信する (今回はDHE鍵交換方式とする)
3 クライアントは証明書を検証し問題ない場合は、
クライアントは「一時的なクライアントDH鍵用-秘密値」を作成し、「一時的なクライアントDH鍵用-秘密値」とサーバの「公開値素A」を使って「一時的なクライアントDH鍵用-公開値」を作成します
※以下「一時的なクライアントDHE鍵用-秘密値」=「C-DHE-temp秘密値」
「一時的なクライアントDHE鍵用-公開値」=「C-DHE-temp公開値」
クライアントは「C-DHE-temp秘密値」と「S-DHE-temp公開値」を使って「プリマスタシークレット」を作成する
4 クライアントは「C-DHE-temp公開値」をサーバへ送信する
5 サーバはクライアントから受け取った「C-DHE-temp公開値」とサーバの「S-DHE-temp秘密値」を使って「プリマスタシークレット」を作成します
※プリマスタシークレットはサーバ・クライアント共に同じものが作成されます
サーバとクライアントは「プリマスタシークレット」・「クライアント乱数」・「サーバ乱数」を計算して共通鍵を作成します
6 暗号通信の開始

ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) 鍵交換方式
ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) 「Ephemeral(エフェメラル)」=「一時的な」「使い捨ての」
DHEより、短い鍵長で計算コストが低く高速に処理でき同等以上のセキュリティ強度を提供できる楕円曲線暗号を使用
キャプチャ①

流れ(TLS1.3を想定してます)
1 クライアントは「一時的なクライアントECDHE鍵用-秘密値」と「クライアント乱数」を作成
「一時的なクライアントECDHE鍵用-秘密値」と「ECDHE基準値A」を使って「一時的なクライアントECDHE鍵用-公開値」を作成します
※以下「一時的なクライアントECDHE鍵用-秘密値」=「C-ECDHE-temp秘密値」
「一時的なクライアントECDHE鍵用-公開値」=「C-ECDHE-temp公開値」
クライアントはHelloで使える「暗号スイートリスト」・「クライアント乱数」・「C-ECDHE-temp公開値」「ECDHEのグループ(複数)」を送信
※クライアントはECDHEのグループ毎に公開値を作成します(上記キャプチャ①のように)
2 サーバは「一時的なサーバECDHE鍵用-秘密値」と「サーバ乱数」を作成
「一時的なサーバECDHE鍵用-秘密値」と「ECDHE基準値A」を使って「一時的なサーバECDHE鍵用-公開値」を作成します
※以下「一時的なサーバECDHE鍵用-秘密値」=「S-ECDHE-temp秘密値」
「一時的なサーバECDHE鍵用-公開値」=「S-ECDHE-temp公開値」
※「ECDHE基準値A」は標準値として定義されているので、クライアントもサーバも同じ値です
サーバは「S-ECDHE-temp秘密値」と「C-ECDHE-temp公開値」を合わせてプリマスタシークレットを作成します
サーバはプリマスタシークレットと「クライアント乱数」・「サーバ乱数」を合わせて、セッション鍵(共通鍵)を作成します
サーバはHelloで「暗号スイート」・「サーバ乱数」・「S-ECDHE-temp公開値」・「ECDHEのグループ」を送信
3 クライアントは「C-ECDHE-temp秘密値」とサーバから受け取った「S-ECDHE-temp公開値」を合わせてプリマスタシークレットを作成します
クライアントはプリマスタシークレットと「クライアント乱数」・「サーバ乱数」を合わせて、セッション鍵(共通鍵)を作成します
4 暗号化通信の開始

コメント