妻に公開鍵暗号を教えてみた
妻「この話、何度聞いてもわかんないのよね」
僕「え、どこがわからない?どこまではわかってる?」
妻「平文はわかるけど、鍵を共有するとか秘密にするとか、署名するとかがよくわからない」
僕「あー、鍵に例えているのが逆効果なのか」
「鍵」をNGワードに指定
僕「じゃあ『鍵』という言葉を使わずに説明してみよう。暗号って『平文を暗号文に変換する方法』で伝えたい文章を暗号文に変えて送り、受け取った人はそれに『暗号文を平文に戻す方法』を使って元の文章を得るわけだ。その目的は、途中の通信文が敵に取られたりしても通信の内容がバレないようにするため。」
妻「うん」
僕「昔の暗号化の方法は、片方の方法がわかるともう片方の方法も分かった。例えば『アルファベットを後ろに1個ずつずらすと平文に戻せます』って教えてもらったら、『なるほど、前に1個ずつずらせば暗号文にできるんだな』ってわかるよね。ところがある時、片方がわかってももう片方がわからない素晴らしい暗号化の方法が発明された」
妻「ほう」
僕「つまり、『平文を暗号文にする方法』を不特定多数に公開しても平気になった。それをやっても『暗号文を平文に戻す方法』は自分しか知らないままに保てる。そうすると、僕に秘密の文章を送りたい人は、公開されている暗号化の方法で暗号を作ることができて、それを読むことができるのは僕だけってことになる。」
妻「なるほど、便利。」
僕「逆に、公開していない方法を使って僕が暗号文を作ると、みんなは公開されている方法で平文に戻して読むことができる。みんな『この暗号文を作るためには、西尾泰和だけの知ってる暗号化方法を使う必要がある=書いたのは西尾泰和』とわかるので署名として使うこともできる」
妻「それで暗号の話の中に署名の話が出てくるのね。ところで暗号文にする方法を公開するの?平文に戻す方法を公開するの?」
僕「あー、今まで便宜上『暗号文に変換する方法』と『平文に戻す方法』って呼んできたけど、これを方法Aと方法Bって呼ぶことにすると、方法Aで暗号文を作って方法Bで平文に戻すこともできるし、方法Bで暗号文を作って方法Aで平文に戻すこともできるんだ。ただ、Aで作ったらBで、Bで作ったらAで、と両方が必ず必要になる」*1
妻「なるほど、じゃあ片方の方法Aを公開しておけば、暗号文を受け付けるのにも、署名付きで情報公開するのにも使えるのね」
「鍵」
僕「で、その公開した側の方法を『公開鍵』、公開していない方の方法を『秘密鍵』って言うんだけど…正直『鍵』って言葉の一般的なイメージとはだいぶかけ離れているね。例えば普通の鍵で金庫を開けたら、入れるのも出すのも両方できるよね。だけどこの発明のキモは『金庫に入れることはできるが出すことはできない』という方法ができたところにあるんだ。」
妻「よくわかりやすくしようとして、金色の鍵と銀色の鍵のイラストを描いてたりするけど、全然ピンとこないのよね」
僕「『入れられるけど出せない』という一方通行な特徴を持ったものって何があるかなぁ。例えばポストはだれでもハガキを入れられるけど、郵送されたあと郵便箱を開けられるのは僕だけ、とか。もちろん通信経路の郵便職員は情報をリークしないって前提で。逆方向の例だとこのブログはだれでも読めて書き換えられるのは僕だけなので、ここに書いてあることは僕が書いたとみんな信用するよね、とかかな。」
追記
ブクマコメントでよいアナロジーが書かれていたので転載。南京錠は、閉めることはだれでもできるが、開けることは鍵を持っている人しかできない。なので南京錠をだれでも手に入るところにおいておけば、その南京錠で鍵をかけて僕に送りつけることで僕だけが箱を開けられる。一方通行の説明にはこれでよいと思う。
*1:注釈:厳密にはこの「逆向きにも使える」という特徴を持っている暗号化の方法と持ってない暗号化の方法があって…と細かい話はここでは割愛している。