2026年8月19日
情報処理安全確保支援士の勉強をしていると出てくる「鍵交換」「署名」「ブロック暗号」「暗号利用モード」「認証暗号」「ハッシュ関数」。これ何?
覚えゲーが苦手なので、一つ一つ調べてみることにします。
- 何をするものなのか?
- どんなアルゴリズムやシーケンスで動いているのか?
などを中心に調べていきます。
ただ、掘れば掘るほど疑問点が出てきてキリがないので、できる範囲で順次。もしかしたら汎用的な説明にはなっていないかもしれません。
今回は「鍵交換アルゴリズム」について簡単に書いてみました。
1. 鍵交換アルゴリズムは何をするものなのか?
まず鍵交換アルゴリズムを一言でいうと、
「ネットワーク上を流れるデータを暗号化するための鍵を生成するアルゴリズム」
TLSやSSHの通信において、アプリケーションデータやHandshakeの通信はサーバやクライアントのshared secretによって暗号化されるのですが、じゃあ、shared secretはどうやって生成するの?ここで使われるのが鍵交換アルゴリズムです。
shared secretが第三者に漏れたら暗号化の意味がないので、shared secretは通信上に流れないように生成されます。
2. どんなアルゴリズムやシーケンスで動いているのか?
IPAのTLS暗号設定ガイドラインによると推奨セキュリティ型の利用推奨暗号アルゴリズムで出てくるのが「DHE」と「ECDHE」の2つ。
ここでは、TLS2.0におけるDHEの動きを見ていきます。
鍵交換アルゴリズムで用いる最初のパラメータは、RFCやNISTなどでSupportedGroupsというグループになって定められています。まず、クライアントがSupportedGroupsの中からグループの候補を選択します。
クライアントはTLS2.0のシーケンスのClientHelloのExtention-SupportedGroupsで、候補のグループをいくつかサーバに送ります。
サーバは、送られてきた候補の中からグループを選択して、TLS2.0のシーケンスのServerKeyExchangeで選択したグループをクライアントに送ります。SupportedGroupsの中には鍵交換アルゴリズムで用いるprime number、generatorと言われる値が含まれているのですが、これらも選択してクライアントに送ります。
ここでprime numberとgeneratorクライアントとサーバ間で共有されます。
次にクライアントは自分だけの秘密の数字を生成し、さらにprime numberとgeneratorを用いてクライアントのpublic valueを以下のように生成します。
p : prime number
g : generator
a : クライアントの秘密の数字
A : クライアントのpublic value
A = g^a mod p
そしてクライアントはAをTLS2.0のシーケンスClientKeyExchangeでサーバに送ります。
サーバも同様に、自分だけの秘密の数字を生成し、prime numberとgeneratorを用いてサーバのpublic valueを生成します。
b : サーバの秘密の数字
B : サーバのpublic value
B = g^b mod p
サーバはBをTLS2.0のシーケンスServerKeyExchangeでクライアントに送ります。
さらにクライアント、サーバはそれぞれ、送られてきたpublic value、自分の秘密の数字、prime numberからshared secretを生成します。
S : shared secret
クライアント S = B^a mod p
サーバ S = A^b mod p
つまり、
B^a mod p = (g^b mod p)^a mod p
A^b mod p = (g^a mod p)^b mod p
となり、指数法則により上2つの式による値は同じになるので、クライアントもサーバも同じshared secretが導きだされることになります(ここでは指数法則の詳しい説明は省略)。
だから、shared secretはお互いに送りあう必要はありません。
こうやってネットワーク上に流れることなく生成されたshared secretを元に、のちの通信の暗号化をしていきます。
3.「前方秘匿性」って何?
さらに、DHEとECDHEは、もしshared secretが第三者に知られたとしても、クライアントやサーバが生成する秘密の数字はTLS接続(ハンドシェイク)ごとに新しく生成されるので、その流出したshared secretに対するハンドシェイク以前の通信は解読できないという特徴があります。これを「前方秘匿性」といいます。