先日受けた安全確保支援士試験で公開鍵か秘密鍵かを選ぶ問題があった。
あまり自信がなかったので翌日WEBで検索していたら、自分の回答が間違っている、と愕然とした。
公開鍵暗号方式とは、暗号通信をおこなうときの受信者が、暗号化するデータを送信する相手に対し公開鍵を送付し、送信者はその公開鍵を用いてデータを暗号化して送信し、受信者は秘密鍵でそれを復号する方式である。
昨日の試験で、私は「秘密鍵は公開できないからそれで復号できない」と考えたことを覚えていたのだが、公開鍵で復号できるのなら暗号化の意味がないではないか!
しまった!
しかも、同じような問題が2回出ていて同じように考えた。
これを全部間違えていたとしたら、もうアウトだ。
というか、そもそもこんな単純なことを理解していないようではたとえ合格してもセキュリティの専門家を名乗ることはできない...
検索すると「秘密鍵で暗号化するという間違った解説が蔓延している」という記事がいくつも出てきた。
...が、さらによく調べると、「秘密鍵で暗号化(この言い方は微妙なのでカッコをつける)」する場合もあるらしかった。
そして、問題を見直してみると、
「xxxを用いて署名を作成」
「xxxを用いて署名を検証」
となっていた。
2か所ともに。
これは公開鍵暗号化ではなく、デジタル署名の話だ。
だから、署名を作成するのに用いるのは秘密鍵で、検証するのは公開鍵であっている。
でも私は、「公開鍵で復号(検証)できてしまったら意味がないのでは?」
という疑問を抱くこともなかったので、
たとえ合格していてもあまり胸をはって「俺は安全確保支援士だ」と言うことはできない。
デジタル署名において秘密鍵を用いて署名を作成することを、「秘密鍵で暗号化」というのは厳密には正しくないらしいが、
よくわからない。
私が信頼していてよく参考にしているWEBサイトでもそういう言い方がされている。
https://www.ipa.go.jp/security/pki/024.html
IPAのデジタル署名を説明したサイトにも、「生成したダイジェストを自分の秘密鍵で暗号化します。」という記述がある。
公開鍵、秘密鍵、証明書、署名...
これらについての説明は何度も何度も聞いた(読んだ)ことがある。
が、何度聞いても、当たり前すぎるような、なんとも腑に落ちない感じがあった。
暗号化というのは他人に内容を知られないように、何かを書き換えることである。
そして、当然、それは読むことを期待する相手には解読(復号)できなければならない。
私たちがよくやるのは、データを暗号化し、パスワードをかけることだ。
そして、そのパスワードを相手に伝える。
メールの添付ファイルをパスワード付きzipで圧縮して、
後からそのzipファイルの解凍パスワードを送信する、というのはよく見る光景である。
私もよくやる。
その際によく言われるのが、「ファイルを添付したメールにパスワードを記載するな」ということである。
それは宛先を誤った場合に他者にファイルを解凍されてしまうからだ。
この方式は、方式というほどのことではないくらいの簡単な方式だが、「共通鍵暗号」方式という。
私がそうなのだが、暗号化なんてこれしか方法がないんじゃないかと考える人が多いのではないだろうか。
しかし、これもすぐ気づくことであるが、共通鍵暗号方式では共通鍵を他者に知られないように、通信相手に渡す必要がある。
解読するための鍵をさらに暗号化しても、やっぱりそれを復号する鍵が必要になり、
何重に鍵をかけようと、この課題はついて回る。
その課題を解消するのが公開鍵暗号方式である。
公開鍵暗号方式では、暗号化する鍵と復号化する鍵をペアで用意する。
このとき重要なのは、二つの鍵はそれぞれ暗号専用、復号専用であるだけでなく、
当然かもしれないが、ペアになっている、ということである。
つまり、Aさんの公開鍵で暗号化したデータを、Bさんの秘密鍵では復号できない。
そしてもう一つ、復号化する鍵を他者に渡してならないことは誰にでもわかるだろう。
だがそれと同じくらい重要なのが、暗号化するために、データの送信者に対して、
受信者が公開鍵を渡さなければならないということである。
そして、そのためにさらに次の重要事項が発生する。
それは、公開鍵の内容は他者に知られてもかまわないが、
その公開鍵が暗号化したデータを送信したい相手の鍵であるかを確認しなければならない、
ということである。
物理的な鍵でたとえたいのだが、「開けるときと閉めるときで違うカギを使う」
という実例はないだろうか?
よく、南京錠の絵を使って、閉めることだけができる鍵、開けることだけができる鍵、
などと説明されるが、そんな物理的鍵はこの世に存在しない...
と思って検索してみたら、「投函できるが自分は鍵をもっていないポスト」と言っている人がいた。
なるほど、これに似ている。
誰でもポストに郵便物を投函できるが、ポストを開けることはできない。
しかし郵便物は相手に、相手だけに届かなければならない。
我々がポストに郵便物を投函するのは、それが郵便ポストであり、
それを開けて配達する郵便配達員を信頼しているからである。
公開鍵を送るというのは、ポストを設置するような行為だ。
我々はポストがポストであることを、真っ赤であるとか「ポスト」と書いてあるかとかいう程度でしか確かめないが、
電子的に暗号通信、つまり鍵(ポスト)と暗号文(郵便物)を交換する際には、第三者に証明するという方法を使っている。
その一つが、HTTPS通信で使用されるサーバ証明書である。
我々はサーバ証明書を見てそれが信頼できる発行者が発行したものであることを確認してアクセスする。
(実際にはブラウザが証明書の正当性を検証し我々はその結果を信頼している)
HTTPサイトにアクセスすると提示される証明書には公開鍵が含まれている。
アクセスする者は公開鍵を受け取り、それを使ってデータを暗号化して通信する。
そして、送信先のHTTPSサイトだけが、その暗号化したデータを復号できる。