公開鍵暗号とは?2つの鍵で、署名と暗号化をする仕組み

パスキーでのログインや、Webサイトとの暗号化された通信(HTTPS)では、公開鍵暗号という仕組みが使われているのをご存じでしょうか。
本記事では、公開鍵暗号の考え方を、計算式を使わずに、身近なものに例えて解説します。
公開鍵暗号とは
公開鍵暗号は、公開鍵と秘密鍵という、対になる2つの鍵を使う暗号の方式です。
秘密鍵は、持ち主が手元から出さない鍵です。公開鍵は、その名のとおり、誰に渡しても、誰に見られてもかまいません。
2つの鍵には、次の2つの性質があります。
- 片方の鍵でしたことは、対になるもう片方の鍵でしか確かめたり元に戻したりできない
- 公開鍵が分かっても、そこから秘密鍵を作ることは、計算の上でできない
この仕組みが生まれる前は、同じ1つの鍵で暗号をかけて、同じ鍵で戻す方式(共通鍵暗号)が使われていました。家の合鍵のように、相手にも同じ鍵を渡しておく必要があります。渡す途中で鍵を盗まれれば、中身を読まれてしまうでしょう。公開鍵暗号は、配ってよい鍵と手元に残す鍵を分けて、この悩みをなくしました。
使い方は大きく2つあり、電子署名と暗号化です。
使い方1:電子署名
1つ目の使い方は、電子署名です。「この文書を作ったのは確かに本人で、途中で書き換えられていない」ことを示します。
紙の書類に押すはんこに例えると分かりやすいでしょう。秘密鍵が持ち主だけが持つはんこ、公開鍵が誰でも見られる押し跡の見本にあたります。下の図で、はんこを押す人と確かめる人の動きを追ってみてください。
持ち主ははんこ(秘密鍵)で書類に押し、受け取った人は押し跡の見本(公開鍵)と見比べて、本物かどうかを確かめる流れです。
ただし、実物のはんこと違う点があります。現実には、押し跡を元に偽のはんこを彫られるおそれがありますが、公開鍵から秘密鍵は作れません。電子署名では、文書の中身も署名の計算に含めるため、1文字でも書き換えれば、確かめたときに分かります。
パスキーのログインも、この署名の仕組みです。サービスが毎回違う問題を送り、端末がそれに秘密鍵で署名します。サービスは、登録のときに受け取った公開鍵で確かめるだけなので、公開鍵が漏れてもログインには使えません。
使い方2:暗号化
2つ目の使い方は、暗号化です。相手にだけ読める形で、データを送ります。
こちらは、開いた南京錠を思い浮かべてください。受け取る人は、自分だけが鍵を持つ南京錠(公開鍵)を、開いたまま配っておきます。送る人は、箱に入れたデータをその南京錠で閉じて送るだけです。閉じるのは誰にでもできても、開けられるのは鍵(秘密鍵)を持つ本人しかいません。
Webサイトとの暗号化された通信(HTTPS)では、この仕組みを使って、その通信だけで使う共通の鍵を安全に受け渡しています。そのあとの大量のデータを暗号化するのは、速く処理できる共通鍵暗号の役目です。
秘密鍵を守る
公開鍵暗号の安全は、秘密鍵が持ち主の手元から出ないことで成り立っています。秘密鍵を盗まれると、他人が持ち主になりすまして署名できてしまうためです。
パスキーの秘密鍵は、端末の中の守られた領域や、パスワードマネージャーの暗号化された保管庫に入っています。その鍵を使うときに、端末が指紋や顔、PINで持ち主を確かめる仕組みです。生体認証の役目は、生体認証とはで解説しました。