- 「Diffie-Hellman鍵共有」は、安全が確認できていない通信経路でも、送信者と受信者だけの暗号通信を開始するための方法です。
- 送信者と受信者がお互いに公開してもよい情報を共有することで、それぞれ自分で秘密の鍵を計算します。
- 秘密鍵の共有ができたら、それを使ってメッセージを暗号化(読めなくする)や復号(読めるように戻す)をします。
どうでもいいけど、「ディフィー・ヘルマン」という響きがかっこいいよね。
1. 「離散対数」によるDiffie-Hellman鍵共有の手順
「Diffie-Hellman鍵共有」の特徴は、秘密の鍵そのものはインターネットなどの通信経路で送らないことです。
えー、でも「暗号鍵を送っていないのに共有できている」なんて、そんな都合の良い話があるの?
「Diffie-Hellman方式」で利用するのは、
指数 xy を素数 p で割った余り z についての性質1。
この z は、残りの3つ (x, y, p) がわかれば すぐに計算できます。
しかし、y は、(x, z, p)がわかっても、かんたんには計算できません(特に p が大きくなると)。
つまり、この y が秘密の鍵に使えそうです。
「Diffie-Hellman鍵共有」は、”Diffie-Hellman key exchange”の訳です。
「Diffie-Hellman鍵交換(DH法)」などとも呼ばれます。
ウィットフィールド・ディフィーとマーティン・ヘルマンの二人によって1976年に提案されました。
1-1. お互いに秘密の整数を決める
A・B 2人だけに共通の y を、
他人に知られずに作るための手順。
まず、A・B の2人は 整数x と 素数p を決めます。
これは他人に知られても大丈夫。
Aさんは、2〜pまでの間に秘密の整数 a を決めます。
一方、Bさんも同様に秘密の整数 b を決めます。
a, b は復号に使う情報なので秘密です。
1-2. 公開鍵を作ってやり取りする
2人は、それぞれ xy mod p の y に自分の数を入れて計算します。
- E = xa mod p
- F = xb mod p
計算した結果 E, F をそれぞれ相手に教えます。
これの情報からは a, b を求めるのは困難なので、他人に知られても大丈夫。
1-3. 公開鍵と秘密鍵から共通秘密鍵を計算する
さて、Aさんは、Bさんから受け取った F と a, p を使って、ある計算をします。
G = Fa mod p
Bさんも E と b, pを使って、同様の計算をします。
H = Eb mod p
さて、2人が別々に計算した G と H は、実は同じ数字になっています。
いずれも、(xab) mod p の結果だからです。
H = Eb mod p
= (xa)b mod p
= (xb)a mod p
= Fa mod p
= G
1-4. 第三者からは解読できない
一方、第三者から見えるのは、AさんとBさんがやり取りした x, p, E, F の4つの数字だけです。
「x, p, E, Fから a, b または G のどれかを求めることができるか」というのが暗号の解読です。
しかし、この問題は p が大きくなると困難なことがわかっています。
結局、(E, x, p)からa、(F, x, p)からbを求めるのと同じだからです。
たとえば、「diffie-hellman-group1-sha1」で使われている素数は、
16進数表記で256桁の
「FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF」
という非常に大きな数です。
1〜この素数までの間にある y を突き止めるには、膨大な検算を繰り返す必要があり、時間がかかりすぎるのです。
ということで、晴れてAさんとBさんだけが共通に知る数 G ができました。
この G を共通の秘密鍵にして暗号通信を行います。
すごい!
素数の性質って、面白いね。
2. 楕円曲線Diffie-Hellman鍵共有
これまでの説明では、イメージしやすい「離散対数」による方式を見ましたが、Diffie-Hellman方式には、離散対数と楕円曲線計算の2種類の数学的技術を使った実装方法があります。
楕円曲線上の演算関係を利用する方法でも、「こっちは計算しやすいが、逆は計算しにくい」という性質を利用する点は同じ理屈になっています2。
さすがに頭がパンクしました。
「楕円曲線Diffie-Hellman鍵共有(ECDH)」については、また後日。
(補足)
- – Diffie-Hellman鍵交換入門 #SSH – Qiita
- 浮輪の表面をトーラスといい、その上で足し算を考えたものが「楕円曲線」です。 – 鍵が漏れることも想定せよ――クラウド時代における「楕円曲線暗号」の必然性:クラウド時代の暗号化技術論(3)(2/3 ページ) – @IT