公開鍵暗号方式――セキュリティのアルゴリズム
次に紹介するのはセキュリティのアルゴリズム、その中でも最も有名で重要な「公開鍵暗号方式」です。
インターネットを使ってデータをやり取りする際、安全に利用するためにセキュリティを確保しなければなりません。データを暗号化する方式は数々考案されてきては脆弱性が暴かれてきました。公開鍵暗号方式は、これまでの暗号方式が抱えていたとりわけ大きな課題、鍵配送問題を解決したのです。
たとえデータを複雑に暗号化しても、復号する(平文に戻す)にはそれを解く鍵が必要です。その鍵は暗号化した人の手から復号したい人の手に安全に送り届けなければなりません。いったいどうすれば安全に送れるのか? 鍵を暗号化したら、さらにそれを復合するための鍵を送る必要があり……さて。
公開鍵暗号方式はどのような仕組みで課題を解決し、安全を確保しているのでしょうか(ちなみに、公開鍵暗号方式にもいくつか種類があり、強力なRSA暗号がよく使われています)。
![リスト3-1 リスト3-1](https://codezine.jp/static/images/article/10198/10198_03_1.jpg)
では、公開鍵暗号方式を利用したデータのやり取りの全体像を見ていきます。AさんがBさんにインターネット経由でデータabcを送ろうとします(Xさんがその様子を見ています)。
![リスト3-2 リスト3-2](https://codezine.jp/static/images/article/10198/10198_03_2.jpg)
まず、受け手のBさんが公開鍵P(public key)と秘密鍵S(secret key)を作成します。もちろんこれらの作業を行うのはコンピューターです。
![リスト3-3 リスト3-3](https://codezine.jp/static/images/article/10198/10198_03_3.jpg)
Bさんは公開鍵をAさんに送信します。のちほど説明するように、公開鍵は第三者に知られても問題ありません。
![リスト3-4 リスト3-4](https://codezine.jp/static/images/article/10198/10198_03_4.jpg)
AさんはBさんから受け取った公開鍵でデータを暗号化します。
![リスト3-5 リスト3-5](https://codezine.jp/static/images/article/10198/10198_03_5.jpg)
Aさんは暗号化されたデータ(暗号文)をBさんに送信し、Bさんは秘密鍵を使って復号します。これでBさんはデータabcを取得することができました。
![リスト3-6 リスト3-6](https://codezine.jp/static/images/article/10198/10198_03_6.jpg)
公開鍵と暗号文はインターネットで送信されるため、悪意のある第三者Xさんに盗み見されるかもしれません。しかし、公開鍵では暗号文を復号できないので、Xさんは元のデータabcを取得できないのです。
![リスト3-7 リスト3-7](https://codezine.jp/static/images/article/10198/10198_03_7.jpg)
公開鍵暗号方式には不特定多数間でのやり取りがしやすいというメリットがあります。具体的に見てみます。
![リスト3-8 リスト3-8](https://codezine.jp/static/images/article/10198/10198_03_8.jpg)
公開鍵はその名のとおり、人に知られても問題ありません。一方で、秘密鍵は誰にも知られないように管理する必要があります。
![リスト3-9 リスト3-9](https://codezine.jp/static/images/article/10198/10198_03_9.jpg)
さて、複数人がBさんにデータを送信したいとしましょう。
![リスト3-10 リスト3-10](https://codezine.jp/static/images/article/10198/10198_03_10.jpg)
データを送信する人は、Bさんが公開している公開鍵を取得します。
![リスト3-11 リスト3-11](https://codezine.jp/static/images/article/10198/10198_03_11.jpg)
そして、送信したいデータを暗号化します。
![リスト3-12 リスト3-12](https://codezine.jp/static/images/article/10198/10198_03_12.jpg)
その後、暗号文をBさんに送ります。
![リスト3-13 リスト3-13](https://codezine.jp/static/images/article/10198/10198_03_13.jpg)
Bさんは暗号文を自分の秘密鍵を復号します。これでBさんは元のデータを取得できました。このように、データを送信する相手ごとに鍵を用意しなくていいのがこの方式のいいところです。データの受け手だけが秘密鍵を持つので、安全性も高いのです。
![リスト3-14 リスト3-14](https://codezine.jp/static/images/article/10198/10198_03_14.jpg)
公開鍵の信頼性は重要です。しかし実は、Xさんが悪巧みできる余地も理屈から言えば残されているのです。それを知るために、Bさんが公開鍵PBと秘密鍵SBを使ってデータのやり取りをする場面を見てみましょう。
![リスト3-15 リスト3-15](https://codezine.jp/static/images/article/10198/10198_03_15.jpg)
ここで、データを盗み見しようとするXさんも公開鍵Pxと秘密鍵Sxを作成します。
![リスト3-16 リスト3-16](https://codezine.jp/static/images/article/10198/10198_03_16.jpg)
Bさんが公開鍵PBをAさんに送るとき、事件が起こります。
![リスト3-17 リスト3-17](https://codezine.jp/static/images/article/10198/10198_03_17.jpg)
なんと、Xさんが公開鍵PBを自分の公開鍵Pxにすり替えてしまいました。
![リスト3-18 リスト3-18](https://codezine.jp/static/images/article/10198/10198_03_18.jpg)
当然、Aさんに届くのはXさんの公開鍵Px。公開鍵自体は誰が作成したものかわからないので、Aさんは公開鍵のすり替えに気づけません。
![リスト3-19 リスト3-19](https://codezine.jp/static/images/article/10198/10198_03_19.jpg)
そのため、Aさんは公開鍵Pxでデータを暗号化してしまいます。
![リスト3-20 リスト3-20](https://codezine.jp/static/images/article/10198/10198_03_20.jpg)
そして、AさんがBさんに暗号文を送ろうとしたとき、Xさんが暗号文を受け取ります。
![リスト3-21 リスト3-21](https://codezine.jp/static/images/article/10198/10198_03_21.jpg)
何が起きるかは明白でしょう。Xさんは秘密鍵Sxで暗号文を復号できてしまいます! Xさんはデータを盗み見ることに成功しました。
![リスト3-22 リスト3-22](https://codezine.jp/static/images/article/10198/10198_03_22.jpg)
次に、XさんはBさんの公開鍵PBでデータを暗号化します。
![リスト3-23 リスト3-23](https://codezine.jp/static/images/article/10198/10198_03_23.jpg)
Xさんはその暗号文をBさんに渡します。この暗号文はBさんの公開鍵PBで作成したものなので、Bさんは自分の秘密鍵PBで復号できます。Aさん同様、データを盗み見されたことに気づけません。
このように、公開鍵をすり替えてデータを盗み見る攻撃手法を「man-in-the-middle攻撃」と呼びます。
この攻撃は防げないのでしょうか? 解決策はあります。公開鍵の作成者を証明するための「デジタル証明書」というアルゴリズムを利用するのです。その仕組みについては、ぜひ本書で。