OpenVPNはSSL-VPN、つまりSSL(TLS)の仕組みを利用したVPNです。 VPNサーバ機は、まずは、VPNクライアント機に証明書を送ります。 VPNクライアント機は、受け取った証明書(=公開鍵)を使って、公開鍵方式で暗号化通信することが可能になります。
VPNクライアント機は、公開鍵方式によって安全性が保たれた経路を通して、VPNサーバ機との共通鍵の受け渡しを行います。 共通鍵を受け渡す理由は、高速な暗号化/復号を行うためです。 公開鍵方式での暗号化/復号は負荷が高いため、高速な暗号化/復号が可能な共通鍵方式に切り替える必要があるのです。
しかし、共通鍵そのものを送受信してしまうことは非常に危険です。 公開鍵方式による暗号化通信の中で受け渡しが行われていても安心はできません。 なぜなら、公開鍵方式の秘密鍵が漏洩したり、暗号が解読されてしまう危険があるからです。
仮に、暗号化通信の内容が悪意ある者に過去から現在まで盗聴され、ハードディスクに記録されていたとします。 そして、公開鍵方式の秘密鍵が悪意ある者に渡ってしまったと仮定します。 すると、ハードディスクに保存されている暗号化通信の記録のうち、公開鍵方式での通信部分は簡単に復号することができてしまいます。 そして、復号された中には、共通鍵そのものが含まれています。 発見された共通鍵を使えば、共通鍵方式で暗号化した部分まで全て復号され、完全に秘密が漏洩してしまいます。
そこで登場するのが、DH鍵交換方式です。 DH鍵交換方式では、共通鍵そのものを送受信せず、共通鍵を作り出す材料となる数のみを互いに交換します。 共通鍵そのものを送受信していないのに、同じ共通鍵を持つことができるというわけです。
例えば、生成したDHパラメータに G = 3、P = 7 という2つの数字があるとします。 その場合には、DH鍵交換方式による共通鍵の交換は、
のように行われます。
なお、通信が盗聴され G = 3、P = 7 および交換した数値である 2、6 が悪意ある者に知られてしまってもXAとXBが求められない限り共通鍵である 1 を計算することはできません。 例えば、XAを求めるには、
を解くしかありません。 XA から 2 を求めるのは簡単ですが、2 から XA を求めるのは非常に困難です。
上記の例では、GもPも1桁の10進数の数値ですが、本ウェブサイトの手順で生成したDHパラメータは、2進数の2048桁、つまり、10進数で617桁です。