ディフィー?ヘルマン键共有って何だろう?
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
日本酒のひやおろしが解禁され始めましたね。秋の访れを感じます。
前回は公开键暗号方式とRSAについてお話ししました。公开键暗号方式は共通鍵を通信間で共有する方法の1つであるものの、公开键暗号方式であるRSAは鍵共有としては非推奨となっています。現在はDH(ディフィー?ヘルマン键共有)もしくはECDHD(楕円曲線ディフィー?ヘルマン键共有)が使われています。今回はそのディフィー?ヘルマン键共有についてお話しします。
目次
ディフィー?ヘルマン键共有
ディフィー?ヘルマン键共有(以降、DHと表記)は、离散対数问题という数学上の問題を利用した公开键暗号方式です。通信間で互いに公開鍵と秘密鍵を生成して、公開鍵を互いに交換します。そして、自身の秘密鍵と相手の公開鍵で共通鍵を生成する手法です。

离散対数问题
私自身、数学に強くないので詳細な説明は出来ませんが、簡単に离散対数问题について説明します。例えば以下の計算式があるとします。

modは前回もお話しした通り、剰余演算で、割った余りを求めます。では、ここで問題です。g = 3、a = 2、p = 7の場合、Kはいくつになるのでしょうか?答えは簡単です。3 ^ 2 mod 7 なので、K = 2 になります。
では、g = 3、p = 7、K = 6、の場合、aはいくつになるのでしょうか?計算式は以下になります。

実は現状の数学では、上記のaを求めるための効率的な方法が発見されていません。もちろん、上記の式を満たすaをしらみ潰しに探せば見つけることはできます。ちなみに上記の問題ではa = 3になります。このaを求めることが難しい問題を「离散対数问题」と言います。
小さな桁数であれば今のコンピュータを駆使することで补を求めることは出来ます。しかし、大きな桁数で计算するとなると、いくら今のコンピュータとしても、补を求めるのに天文学的な时间が必要となります。これにより実质安全とみなしているわけです。
键共有プロセス
ディフィー?ヘルマン键共有の基本的な計算式は以下になります。离散対数问题は指数aを求めるのが難しいという問題でした。なので指数aは秘密鍵となります。そしてその計算結果Kが公開鍵になります。

まず数値驳と辫を通信者间で示し合わせて决定します。アリスとボブで同じ驳と辫を使う必要があり、数値辫はとても大きな素数でなければいけません。数値驳と辫、そして自身の秘密键で计算を行い、その结果を交换します。そして、交换した计算结果碍をもとに再度计算することにより共通键を生成します。

なんで相手と同じ共通键が生成されるの?
アリスは以下の计算式で共通键を求めます。

碍产はボブ侧で行われた以下の式で求めます。

これをアリス侧の计算式に当てはめます。

上记の式を単纯化すると以下になります。

ボブ侧も同様に见ていきます。

アリスもボブも、共通鍵を求める式が同じになります。离散対数问题により、盗聴者イブに推測されることなく、お互いの秘密鍵を交換して共通鍵を計算して求めているのです。
おわりに
ディフィー?ヘルマン键共有で安全に鍵共有が出来たとしても、前回でお話しした「なりすまし」に対する脆弱性は解消されていないことにご注意ください。「なりすまし」に対しては別途、デジタル署名などの技術が必要になります。
ではまた。
