ディフィー・ヘルマン鍵共有(Diffie–Hellman key exchange、DH)とは、二者間で安全に共通の秘密鍵を生成するための暗号プロトコルです。これにより、公開されたパラメータを使用して秘密鍵を共有し、暗号化通信を行うことができます。
1. 全体概要
AさんとBさんで共通鍵を共有したい場合、ディフィー・ヘルマン鍵共有は上記図の流れとなります。
(1-1) Aさんは自分だけしか知らないDH秘密鍵「a
」を用意する
(1-2) Bさんも自分だけしか知らないDH秘密鍵「b
」を用意する
(2-1) Aさんが公開パラメータの「p
(大きな素数)」と「g
(基数:p
より小さい自然数)」を用意する
(2-2) Aさんが、AさんのDH公開鍵「A
」を計算する
計算式:A = g^a mod p
(3-1) AさんがBさんへ 「p
(大きな素数)」、「g
(基数:p
より小さい自然数)」、AさんのDH公開鍵「A
」を渡す
(4-1) Bさんが、BさんのDH公開鍵「B
」を計算する
計算式:B = g^b mod p
(5-1) BさんがAさんへBさんのDH公開鍵「B
」を渡す
(6-1) Aさんが共通鍵を算出する
計算式:K = B^a mod p
(6-2) Bさんが共通鍵を算出する
計算式:K = A^b mod p
2. 実際に簡単な数値で計算
実際に簡単な数値で計算してみると以下のようになります。
(1-1) Aさんは自分だけしか知らないDH秘密鍵「a = 4
」を用意する
(1-2) Bさんも自分だけしか知らないDH秘密鍵「b = 5
」を用意する
(2-1) Aさんが公開パラメータの「p = 7
(大きな素数)」と「g = 5
(基数:p
より小さい自然数)」を用意する
(2-2) Aさんが、AさんのDH公開鍵「A
」を計算する
計算式:A = g^a mod p
= 5^4 mod 7
= 625 mod 7
= 2
(3-1) AさんがBさんへ 「p = 7
(大きな素数)」、「g = 5
(基数:p
より小さい自然数)」、AさんのDH公開鍵「A = 2
」を渡す
(4-1) Bさんが、BさんのDH公開鍵「B
」を計算する
計算式:B = g^b mod p
= 5^5 mod 7
= 3125 mod 7
= 3
(5-1) BさんがAさんへBさんのDH公開鍵「B = 3
」を渡す
(6-1) Aさんが共通鍵を算出する
計算式:K = B^a mod p
= 3^4 mod 7
= 81 mod 7
= 4
(6-2) Bさんが共通鍵を算出する
計算式:K = A^b mod p
= 2^5 mod 7
= 32 mod 7
= 4
3. 後書き
以前はRSA等の公開鍵暗号方式で、共通鍵を暗号化して渡すこともあったのですが、暗号化されているとはいえ共通鍵が第三者に見られることは避けたい、といった背景があります。
ディフィー・ヘルマン鍵共有だと、通信で流すのは公開パラメータとDH公開鍵と第三者に見られても問題がない値のみなので、鍵交換プロトコルとして使用されています。
最近では「楕円曲線ディフィー・ヘルマン鍵共有(Elliptic curve Diffie–Hellman key exchange, ECDH)」も使用されているようです。
以上