![見出し画像](https://assets.st-note.com/production/uploads/images/117568185/rectangle_large_type_2_c7832e76521e60cccc6b2e676cc21f1c.png?width=1200)
「公開鍵暗号方式」をちゃんと理解する (毎日日記を書く ~62日目~)
DCXです。「新総裁に望むことは?」「おそうざい?おそうざいならキンピラがいいかな」という有名なコラ画像がありますが、このいかつい見た目でキンピラというめっちゃ家庭的な惣菜を答えてるのがまた面白い。コイツ絶対揚げ物とかの方が好きでしょ。
![](https://assets.st-note.com/img/1696019295791-mCfEQFoesM.png)
当時は若く、コラ画像だと気づいてませんでしたが、どう見ても「新総裁に望むことは?」とフォントが違い過ぎるのでコラ画像ですね。
というわけで今回の話題は「公開鍵暗号方式」について。現在のインターネットセキュリティの基盤をなす超重要な技術です。
自分は大学で情報科学を専攻していて、研究室はネットワークの専攻なのですが、実はこの公開鍵暗号方式についての理解がかなりあいまいで、これではネットワーク専攻を名乗れないということで、今回ちゃんと理解していきたいと思います。
暗号化の基本
公開鍵暗号方式の前に、まず暗号化の話からします。暗号化とは、
伝えたいメッセージを他人に知られないために、一定のルールに従ってデータを変換すること
です。特定の人だけに伝えたいけれど、不特定多数の人には知られたくない情報ってあるじゃないですか。例えばパスワードとか。サービスにログインするためにはパスワードを渡して認証してもらう必要がありますが、パスワードが流出してしまうと不正にログインされる恐れがあります。
暗号化の簡単な例として、音声を他人に送ることを考えます。あなたは、「I'm lovin' it」と喋っている音声を誰かに送信したいとします。しかし、この音声を送信するとき、誰にもその内容を知られたくありません。そこで、この音声を逆再生することを考えます。逆再生すれば、送信中に内容を聞かれることはないですからね。「I'm lovin' it」を逆再生すると、「エロあるよ」と聞こえるらしいです。こうして、あなたは「エロあるよ」という音声を相手に送ります。たとえ誰かがこれを盗み聞きしたとしても、本来のメッセージ「I'm lovin' it」を知られることはありません。
「エロあるよ」の音声を受信した相手は、もう一度その音源を逆再生します。すると。元の音声「I'm lovin' it」を復元できます。
最初に伝えたいメッセージ(平文)を暗号化(逆再生)で暗号にし、復号(もう1回逆再生)で平文に戻します。
![](https://assets.st-note.com/img/1696068989699-kj2gwClNkl.png?width=1200)
ここで重要なのが、逆再生という暗号化の手段は送信者と受信者のみが知っていることです。 この手段を共有しているからこそ、受信者は暗号を復号することができるのです。
こういう感じで、他人に知られたくない情報をばれないように伝えるのが暗号化の目的なわけです。
公開鍵暗号方式とは
本題の公開鍵暗号方式の説明に入ります。さっき説明した暗号化の方式の1つが、公開鍵暗号方式です。公開鍵暗号方式の特徴は、
送信者と受信者が別の鍵を持っている
ことです。イラストにするとこんな感じ。
![](https://assets.st-note.com/img/1696070165540-kxxbDj3ccO.png?width=1200)
上図の赤いのは公開鍵で、送信者側が持っています。公開鍵は、受信者の秘密鍵を元に作られます。 青いのは秘密鍵で、受信者側が持っているものです。公開鍵は名前の通り公開されており、受信者が多数のユーザー(送信者)に対して自由に送ることができます。一方、秘密鍵は受信者側が厳重に保管し、知られてはいけないものです。
メッセージの復号に、秘密鍵が必要なため、秘密鍵さえ知られなければ安全性は担保されるということですね。
公開鍵暗号方式において、メッセージが送信される手順は以下のようになります。
受信者が秘密鍵を元に公開鍵を作成し、送信者に送る
送信者が、自身の持っている公開鍵でメッセージを暗号化
暗号化されたメッセージを受信者に送信
受信者が、自身の持っている秘密鍵でメッセージを復号
共通鍵暗号方式との違い: なぜ安全性が高いか
公開鍵暗号方式が発明される以前は、共通鍵暗号方式という手法が使われていました。共通鍵暗号方式は、
暗号化と復号に用いる鍵が同じ
という特徴があります。暗号化の例で示した音声の逆再生とかもその一例です。この共通鍵暗号方式の課題として、「鍵の共有を秘密で行わないといけない」というのがあります。送信者と受信者が同じ鍵を共有するので、どちらかがもう片方に鍵を送らないといけないのですが、この「鍵を送る」という操作は危険を伴います。鍵を送る途中でその通信を傍受された場合、第三者が鍵を入手することができてしまい、暗号化する意味がなくなります。
![](https://assets.st-note.com/img/1696072227810-kuEBtpu4Xc.png?width=1200)
公開鍵暗号方式は、受信者が公開鍵を公開することで、復号に必要な秘密鍵を送信する必要がないため、安全なのです。
![](https://assets.st-note.com/img/1696072385813-soyJpSbVnE.png?width=1200)
もちろん、受信者のコンピュータに直接アクセスされて秘密鍵を奪われるリスクは0ではありませんが、鍵を通信で送っていた共通鍵暗号方式に比べるとはるかに安全です。
公開鍵暗号方式、共通鍵暗号方式それぞれの特徴
公開鍵暗号方式は安全性が高いといいましたが、もちろんメリットだけではありません。共通鍵暗号方式と公開鍵暗号方式それぞれの特徴を見ていきましょう。表にまとめるとこんな感じ。
![](https://assets.st-note.com/img/1696073669231-JNqBWhOPMP.png?width=1200)
共通鍵暗号方式のメリットは、計算が速いこと。
デメリットは、暗号化、復号ともに同じ鍵なので、鍵が通信相手ごとに異なっていないと、他のユーザーの通信を同じ鍵で解読できてしまいます。したがって通信相手が増えるたびに新しい鍵を作成する必要があり、鍵の管理が大変です。また、鍵の交換は第三者に知られないようにしないといけないので安全性は低めとなります。
一方、公開鍵暗号方式はそれとは全く逆で、公開鍵は1つでいいので管理が楽、秘密鍵さえ無事ならいいので安全性が高いというのがメリットです。
デメリットは計算がやや大変で、暗号化と復号に時間がかかることです。
注意ですが、どちらかの手法が常に優れているわけではありません。通信相手の数や要求される遅延時間等によってどちらの手法を採用するか決めないといけません。例えば、ICカードや無線LANは速度重視なので共通鍵暗号方式、電子署名は安全性重視なので公開鍵暗号方式が使われているそうです。
2つを組み合わせた手法: ハイブリッド暗号方式
共通鍵暗号方式と公開鍵暗号方式の互いの短所を軽減するために、2つの方法を組み合わせたハイブリッド暗号方式というのを採用しているシステムもあります。
このハイブリッド暗号方式、やっていることは難しくありません。
共通鍵の共有に公開鍵暗号方式を使用している
だけです。言葉だけではピンと来ない方も多いと思うので、詳しい手順を説明しますね。
![](https://assets.st-note.com/img/1696097867327-af6cKoscr4.png?width=1200)
まず、受信者は自身の秘密鍵を元に、公開鍵を作成します。続いて、その公開鍵を送信者に送ります。ここまでは公開鍵暗号方式と同じですね。そのあと、送信者が共通鍵を作成します。共通鍵を作るのは送信者側なのがポイントです。
![](https://assets.st-note.com/img/1696098285941-g5pUeEQ6VW.png?width=1200)
ここで、送信者は、作った共通鍵を公開鍵で暗号化し、受信者に送ります。最後に、受信者は自身の秘密鍵で共通鍵を復号します。公開鍵で暗号化されたものは秘密鍵でしか復号できないという特性を生かして、受信者も共通鍵を手に入れられます。
もし共通鍵の送信中、そのデータが流出しても、秘密鍵がない限り共通鍵の複合は不可能なため、安全に共通鍵を共有できます。共通鍵の共有後は、共通鍵暗号方式として通信すればよいため、通信速度にも優れます。
ハイブリッド暗号方式の使用例: SSL
このハイブリッド暗号方式の使用例として有名なのが、SSL(Secure Sockets Layer)です。これは暗号化のためのプロトコルで、HTTPなどのアプリケーション層のプログラムと組み合わせて使います(SSLはセッション層らしいです)。SSLは古く、脆弱性も見つかっているので、現在ではTLSが代わりに使われています。
ちなみに、HTTPにSSLを組み合わせるとHTTPSになります。URLが https://*** という形式で表されていると安全なサイトという情報は皆さんもよく知っていると思いますが、これはSSLを採用しているかの違いです。
SSLでは、クライアントからサーバーに接続要求があった場合、以下のように処理をしていきます。クライアントが先ほどまでの図の「送信側」、サーバーが「受信側」に該当します。
サーバーがクライアントにデジタル証明書を送信する。この証明書にはサーバーの公開鍵が含まれている。
クライアントは証明書が認証局から発行されたものかを確認する。つまり証明書が信頼できるかどうか。この機能は、クライアントが使うwebブラウザ(Chromeとか)にデフォルトで備わっている。
証明書が信頼できるならば、クライアントは共通鍵を作成する。
クライアントは、証明書から取り出した公開鍵で共通鍵を暗号化し、サーバーに送る。
サーバーは送られてきた共通鍵を自身の秘密鍵で復号する。
共有した共通鍵で暗号化して通信する。
こちらのサイトに、非常に分かりやすい図が載っています。ここまで読んでくださった方ならきっと理解できるはずです。
鍵の他に、「証明書」という単語が出てきました。この証明書とは、そのサーバーが間違いなく本人であることの証明、つまりこの公開鍵はこのサーバーのものですよ、という証明です。
まとめ
本日は、公開鍵暗号方式について学習しました。本日の内容をまとめると、
公開鍵暗号方式は、送信側が公開鍵で暗号化したメッセージを受信側が秘密鍵で復号する通信手法。
共通鍵暗号方式と比べて、安全性が高く鍵の管理も楽だが、処理速度が遅いという特徴がある。
共通鍵暗号方式を組み合わせたハイブリッド暗号方式もあり、SSLなどの通信の安全性を確保する技術に応用されている。
という感じです。公開鍵暗号方式は結構ややこしくて自分もかなり曖昧にしか覚えていなかったので、きちんと復習の機会を得られてよかったです。分かりやすいと思っていただけましたら、スキやコメントもよろしくお願いします。
そういえば今回は暗号化の手法の概要のみ注目して、暗号の正体とか、暗号化で実際にどんな計算が行われてるかについては触れられなかったので、近いうちに触れてみたいと思います。RSA暗号とか。
それではまた。
参考サイト
この記事を書くにあたって参考にした記事たちです。もし不明な点があればこちらのサイトをあたることをお勧めします。