ディフィー・ヘルマン鍵交換アルゴリズムのJavaでの実装

ディフィー・ヘルマン鍵交換アルゴリズムは、公開鍵暗号方式を用いて共通鍵を安全に共有するためのプロトコルです。具体的には、秘密鍵のペアを持つ各参加者が、公開された情報を用いて相互に秘密の共通鍵を生成することができます。

主に以下のような場面で利用されます。

  1. インターネット上での暗号通信

DH法は、インターネット上での暗号通信に広く使用されています。SSLやTLSによる通信では、DH法を使用してセッション鍵を交換するため、通信が暗号化されます。

TLS 1.2以前では、主にRSA鍵交換が使用されていました。この場合、サーバーの公開鍵がデジタル証明書に含まれ、クライアントがサーバーの公開鍵を使用して共通鍵を暗号化します。

TLS 1.3では、DH法がより一般的に使用されるようになりました。具体的には、楕円曲線暗号を使用したエリプティックカーブディフィー・ヘルマン鍵共有(ECDHE)と呼ばれる鍵交換手法が使用されます。

  1. VPN接続

DH法は、Virtual Private Network(VPN)接続の暗号化にも使用されます。

DH法のアルゴリズム

以下は、ディフィー・ヘルマン鍵交換アルゴリズムの手順です。具体的な数値を当てはめて解説します。

  1. AliceとBobは、素数pと原始根gを選びます。例えば、p=7とg=5とします。
  2. Aliceは、秘密鍵aを選び、g^a mod pを計算します。例えば、a=3とすると、Aliceの公開鍵は5^3 mod 7 = 6です。
  3. Bobも同様に、秘密鍵bを選び、g^b mod pを計算します。例えば、b=5とすると、Bobの公開鍵は5^5 mod 7 = 3です。
  4. Aliceは、Bobから3を受け取り、自分の秘密鍵aを使用して、3^a mod pを計算します。計算すると、3^3 mod 7 = 6が得られます。
  5. Bobも同様に、Aliceから6を受け取り、自分の秘密鍵bを使用して、6^b mod pを計算します。計算すると、6^5 mod 7 = 6が得られます。
  6. AliceとBobは、共通鍵6を持つことができました。

このようにして、通信者1と通信者2は共通鍵 K = 6を生成し、安全に通信することができます。この共通鍵はネットワークを流れることなく、盗聴に対して安全な通信ができます。

ここで例えば、第三者がAliceの共通の共有鍵(6)を盗聴したとします。他には素数の(7)と原始根(3)も入手したとします。

それでも第三者は3^X mod 7=6をXについて解かなければなりません。今回はX=3と求まりますが、実際にははるかに大きな素数や鍵が使われていますから現在のコンピュータでは解くことが非常に困難なのです。

<サンプルプログラム>

import java.math.BigInteger;

public class DiffieHellman {

    public static void main(String[] args) {
        // 共通の素数pを公開
        BigInteger p = new BigInteger("7");
        
        // 共通の原始根gを公開
        BigInteger g = new BigInteger("5");

        // Aliceが秘密鍵を生成する
        BigInteger a = new BigInteger("3");//本来は乱数であるべき
        BigInteger A = g.modPow(a, p);

        // Bobが秘密鍵を生成する
        BigInteger b = new BigInteger("5");//本来は乱数であるべき
        BigInteger B = g.modPow(b, p);

        // AliceがBobの公開鍵Bを受け取り、共通鍵を生成する
        BigInteger K1 = B.modPow(a, p);

        // BobがAliceの公開鍵Aを受け取り、共通鍵を生成する
        BigInteger K2 = A.modPow(b, p);

        // K1とK2が等しいことを確認する
        if (K1.equals(K2)) {
            System.out.println("共通鍵: " + K1);
        } else {
            System.out.println("エラー: 共通鍵が一致しません");
        }
    }
}

<出力結果>

共通鍵: 6

練習問題

bの考え方

基本情報技術者試験 平成17年秋 午後問3