木走日記

場末の時事評論

[IT]不思議な不思議な数式、ディフィー・ヘルマン鍵共有


 ちょっと時事を離れて暗号通信のある技術について脱線ぎみの話をいたしたいと思います。

 遠く離れたあの人と世界で二人しか知らない秘密の合言葉を共有したいとします。

 ただし、メールは盗み見されるから駄目、電話も盗聴されるから駄目、郵便はもっと駄目、直接会いに行くのも駄目、駄目駄目だらけのとき、あなたならどうします。

 そんなとき不思議な不思議な数式、ディフィー・ヘルマン鍵共有が役に立ちます。

 不肖・木走ですが、最初に暗号技術を学習した際、不思議なディフィー・ヘルマンの数式に軽く感動を覚えたのでした。

 その感動を読者のみなさまにも共有していただきたいです。

 もともと工学系エンジニアである私は、会社経営のかたわら工業系の学校でIT関連技術(主として通信ネットワーク工学)などを教えております。

 今回は暗号技術に関連するとっても不思議な数学についてお話したいと思います。

 暗号技術やITの専門知識の有る読者には既知の話かもですが、あくまでも対象は専門知識のない一般の読者として、できるだけわかりやすく説明を試みてみます。

 ・・・

■共有鍵暗号方式〜世界で誰にも知られていないただ一組の鍵を使って暗号化する方式

 みなさんもよくご承知のようにインターネット上、情報はパケットという単位で飛び交っていますが、パケットもデジタル情報ですから、文字情報も画像情報も音声情報もパケットでは0と1のデジタル情報に変換されております。

 で、このままではパケットに収まっている情報は、第三者から覗かれ放題、へたすれば改ざんされてしまう無防備な状態なのであります。

 たとえばネットショッピングなどで大切なキャッシュカードの暗証番号などをインターネットに送る必要がある場合、悪意ある第三者に大切な個人情報が見られては大変なわけです。

 そこでパケットの内容を暗号化してたとえ第三者が覗いてもグチャグチャで意味不明のビット列にしておけば安心ですね。

 しかしここで重要なことは0と1のビット列をただ乱暴にグチャグチャに乱して第三者から読まれなくするのは簡単なのですが、必要な正しい受信者だけはその乱れたビット列を元に戻す(復号、復号化といいます)ことができなければなりません。

 必要な人だけが元に戻すことができる、この性質がなければそれは暗号とは呼べません。

 でこの暗号/複合アルゴリズムなのですが、いろいろな方式が考案されていますが、代表的な方式に共有鍵暗号方式というのがあります。

 遠く離れた二つのノード(ネットワークに参加しているハードウエアのことをノードといいます)、ノード1とノード2がいま暗号通信を行うときに、事前に「共有鍵」という同じ情報を持つことで、暗号化と復号化を行う方式です。

 世界でただ一組の誰にも知られていない鍵で、送信側は暗号の掛かっていないパケット(平文といいます)に暗号を掛けます、そしてその暗号を解く(復号化)ことができるのは、やはり世界でただ一組の共有鍵を持っているノード2だけが可能であるということです。

 ここでいう「鍵」ですが、イメージとしてはまさに金庫の鍵を想像していただいてけっこうですが、ネットワーク上ではもちろん金属の鍵ではなく、実際には0と1の組み合わせの何十桁、何百桁かのデジタル値になります。

 で、この共有鍵暗号方式ですが、当たり前ですが、事前に遠く離れた二つのノードで鍵の交換(共有)を秘密裏に行っておく必要があります。

 実はここが重要なポイントです。

 インターネット上、遠く離れたノード同士で同じ値を秘密裏に共有する、誰にも知られないでそんなことができるのでしょうか。

 メールで知らせるわけにもいきません、紙に書いてそっと郵送しますか、それとも電話で口答で伝えておきますか。

 一組だけで考えればいろいろな方法・手段が考えられますが、もし不特定多数を相手に暗号化通信する必要がある場合、そのような手間をいちいち掛けることは不可能です。

 インターネット上遠く離れた二つのノードが誰にも知られず共通の鍵を持つことが可能になる、実はそんな不思議な数式が35年前に2人の研究者によって考案されています。

 ・・・

■ディフィー・ヘルマン鍵共有(Diffie-Hellman key exchange)〜不思議な不思議な数式

 ディフィー・ヘルマン鍵共有(Diffie-Hellman key exchange)とは、事前の秘密の共有無しに、盗聴の可能性のある通信路を使って、暗号鍵の共有を秘密裏に可能にする、不思議な不思議な数式です。

 1976年にスタンフォード大学の2名の研究員ホイットフィールド・ディフィーとマーティン・ヘルマンによって考案された素晴らしい方式ですが、すでに特許期限が切れていますので、現在は誰でも自由に使用できます。

 次世代のIPv6においてはすべてのパケットがIPsecという暗号技術により暗号化されますが、このIPsecは共有鍵暗号方式を採用していますが、その鍵共有にこのディフィー・ヘルマン鍵共有の改良版が採用されています。

 ディフィー・ヘルマン鍵共有では、通信を行いたい2者が各々公開値と秘密値を用意し、公開値のみを公開(通信)する。そして、お互いに秘密の値から作成されるデータを相手に送信し、各自、自分の秘密値と受信したデータから共通鍵を作成できる方法であります。第三者が送受信されるデータを盗聴しても鍵を生成することができない所に特徴があります。

 ディフィー・ヘルマンの詳細を説明する前に、数学的予備知識をひとつだけ抑えておく必要があります。

 ディフィー・ヘルマンでは「mod」という計算が頻繁に使われます。

 「mod]とは剰余、すなわち割り算をした余りを求めることを意味します。

 例えば、

 7 ÷ 5 = 1.4 であるのに対し、

 7 mod 5 = 2 ということになります。

 なぜディフィー・ヘルマンでmod計算が使われているかというと、実はmodは逆算が不能であるという性質があるからです。

 例えば、

 X ÷ 5 = 1.4 ならば X=7とすぐに逆算可能ですが、

 X mod 5 =2 ならば、X=7、12、17、・・・・と無限になりますね。

 modの値からでは、もとの数を求めることは数学的には不可能なのです。

 みなさんは世界中の研究者が巨大な素数を競って探していることをニュースなどで聞いたことがあると思いますが、実は最新の暗号技術では、その巨大な素数をmod計算で利用しているわけです。

 素数が大きければ大きいほど強度の高い暗号化が可能となります。

 ではディフィー・ヘルマン鍵共有の詳細の説明に入ります。

 ・・・

■ディフィー・ヘルマン鍵共有の詳細〜実は鍵交換ではなく遠く離れた2地点で不思議にも同じ鍵を同時生成している

 今ネットワーク上遠く離れた二つのノード、ノード1とノード2において鍵共有を秘密裏に行います。

 ただしネットワーク上の通信は第三者に見られている(事実上公開されている)ものとします。

 7つの手順を順に説明してまいります。

 手順1:2つの値をあらかじめ決めておく。

 まず、ノード1とノード2は2つの値をあらかじめ決めておきます。

 元になる数g(生成元と呼ばれています)と、巨大な素数pです。(生成元gは実は素数pに依拠している数です)

 この二つの値は第三者に公開されて構いません。

 手順2:ノード1が秘密値を作成

 ノード1が秘密値aを作成します。この値は誰にも教えません(相方のノード2にすらです)

 手順3:ノード2が秘密値を作成

 ノード2が秘密値bを作成します。この値は誰にも教えません(相方のノード1にすらです)

 ここまでで4つの数値、g(公開値)、p(公開値)、a(秘密値)、b(秘密値)が決定いたしました。

 手順4:ノード1が公開値を作成しノード2に送信する。

 ノード1は自分の秘密値aと、g、pを用いて公開値Aを作成します。

 A = gのa乗 mod p ・・・式1

 公開値Aは生成元gのa乗を巨大な素数pで割った余りとなります。

 この公開値Aをノード1はノード2に送信します(第三者がこの公開値Aを覗き見たとしてもmodの結果ですから、元の数(gのa乗)を割り出すことは数学的に不可能です)。

 手順5:ノード2も公開値を作成しノード1に送信する

 ノード2も自分の秘密値bと、g、pを用いて公開値Bを作成します。

 B = gのb乗 mod p ・・・式2

 公開値Bは生成元gのb乗を巨大な素数pで割った余りとなります。

 この公開値Bをノード2はノード1に送信します(第三者がこの公開値Bを覗き見たとしてもやはりmodの結果ですから、元の数(gのb乗)を割り出すことは数学的に不可能です)。

 手順6:ノード1が共有鍵を生成する

 ノード1では、ノード2から送られてきた公開値Bと自分の秘密値aを使って共有鍵Kaを作成します。

 Ka=Bのa乗 mod p ・・・式3

 KaはBのa乗を巨大な素数pで割った余りです。

 ところでBは式2で表せますからこれを式3に代入すると

 Ka=(gのb乗 mod p)のa乗 mod p

   = gのab乗 mod p ・・・式4

 となります。

 手順7:ノード2が共有鍵を生成する

 ノード2では、ノード1から送られてきた公開値Aと自分の秘密値bを使って共有鍵Kbを作成します。

 Kb=Aのb乗 mod p ・・・式5

 KbはAのb乗を巨大な素数pで割った余りです。

 ところでAは式1で表せますからこれを式5に代入すると

 Kb=(gのa乗 mod p)のb乗 mod p

   = gのab乗 mod p ・・・式6

 となります。

 式4と式6より、

 Ka=Kb

 見事に遠く離れた2つのノードで世界でただ一組の共有鍵が秘密裏に生成されました。

 重要なことは第三者がたとえg、p、公開値A、公開値Bを知りえたとしても、誰もこの秘密の共有鍵Ka,Kbを計算で求めることは不可能なことです。

 こうしてこの共有鍵を利用してこの後、共有鍵暗号方式による暗号通信が行われることになります。

 ・・・

 ここまでの内容を図解しました。
■図1:ディフィー・ヘルマン鍵共有の詳細

 いかがでしたでしょうか。

 今回は今日の暗号通信のコアプロトコルであるディフィー・ヘルマン鍵共有について取り上げてみました。

 ご参考になったならば幸いです。



(木走まさみず)