前回まででなんとなく、公開鍵と秘密鍵の役割をかじってみました。
そこで、不思議に思われた方もいらっしゃると思います。
情報を公開鍵で暗号化し、秘密鍵で復号する。その本質は、暗号化は情報を公開鍵で与えられた数だけ巾乗する。復号化は暗号を秘密鍵で与えられた数だけ巾乗する。
さて、中学の時習った数学では、ある数Nをa乗したものをb乗したもの「 (N^a)^b 」とNをb乗したものをa乗したもの「 (N^b)^a 」は等しいはずです。
なぜなら前者は N^(axb) 後者は N^(bxa) ここで axb=bxa ですので、N^(axb) = N^(bxa) つまり (N^a)^b = (N^b)^a
これは、先に公開鍵で暗号化したものは秘密鍵で復号出来る。 また、先に秘密鍵で暗号化したものは公開鍵で復号化できることを意味しています。
この性質を非常にうまく利用して、署名に利用できるのです。
Bさんは、秘密鍵S(人には絶対に見せない)と公開鍵P(誰にでも渡す)を用意します。鍵は(S1とP1)、(S2とP2)と言う風に「必ずペアーで」幾らでも作れますが、S1で暗号化したものはP1でしか復号出来ずP1で暗号化したものもS1でしか復号出来ない。という性質を持っています。
● 暗号通信への利用
AさんがBさんに暗号化して情報を送りたいとき。
- Bさんが公開している公開鍵Pを入手します。
- その鍵Pをつかって、Aさんは送りたい情報を暗号化します。一度暗号化したデータは暗号化した本人Aさんでも復号できません。何故なら、その鍵Pに対応する秘密鍵SはBさんしか持っていないからです。
- 暗号化が出来たら、AさんはBさんにその暗号データを送ります。万一誰かが手に入れても上記の理由で復号できませんので、解読不可能です。
- Aさんから暗号化されたデータを受け取ったBさんはAさんがつかった鍵Pに対応した鍵Sによって復号化し無事データを安全に手にすることが出来ました。
さて、ここまでは前回お話しした通りです。
● 署名への応用
今度は、広く、Bさんが第三者にデータを配るときを考えます。
- Bさんは、自分の配ったデータが誰か他人によって変更を受けていないことを保証して配ってあげたいと考えました。いろんな方法がありますが、今回は自分の作った公開鍵と秘密鍵を利用してみようと考えて次のようにしました。
- Bさんは、自分の配ばりたいデータを、秘密鍵Sで暗号化しました。
- そして、そのデータをホームページに掲載し、だれでもダウンロードできるようにしました。
- さらに、自分のホームページに、公開鍵Pを掲載しました。
- Bさんのデータが欲しいCさんは、Bさんが自らの秘密鍵Sで暗号化したデータをダウンロード。Bさんの公開鍵Pもダウンロードします。
- 用意が出来たCさんはダウンロードした暗号データをBさんの公開鍵Pで復号化してみます。Bさんが使ったSに対応する鍵は唯一Pだけです。
- もし、復号化がうまくいったら、そのデータは確かにBさんが(Bさんしか持っていない)秘密鍵Sで暗号化したものと証明されます。
- 上手くいかなければ、BさんがSを使って暗号化したものではない!つまり偽物のデータと言うことがわかるのです。
- こうしてデータが、間違いなくBさんが作ったものか、そうでないのかを判別することが出来ます。
- この、Bさんが間違いなく作ったものですよ!と判別できるようにすることを署名すると言い、この場合はBさんの秘密鍵で暗号化し、それに対応する公開鍵を公開することで実現します。
- 暗号化通信と勘違いしてはならないのは、Bさんが作った暗号化したデータも公開鍵も広く一般公開されており、2つを入手した人は誰でも復号出来るということです。
- ここで保証されるのは、もし、Bさんの公開鍵が正しければ、そのデータは間違いなくBさんが暗号化したものだという事です。
最後に:上の例ではまだ安全とは言えません。それは、Bさんが公開した公開鍵が本当にBさんが公開したものかどうか。Webサイトを悪者に操作されてねつ造された公開鍵かもしれない。それをCさんは判断できないからです。
そこで、実際には第三者の信用ある認証局が、Bさんの公開鍵を預かり発行する。あるいは保証する。と言うことも行われています。
さて、長々と書いてきた暗号化の話もこれで終わりです。興味のきっかけになれば幸いです。