trlnk.com 菅野 勇紀 / KANNO,Yuuki personal web site

公開鍵暗号方式入門

ここでは公開鍵の概要についてごく簡単に解説します.
必ずしも内容が正しいことを保証するものではありません.また,実際の運用にあたっては,以下にあげた知識だけでは不足することは間違いありません.従って,公開鍵やPGPに関する正しい知識を得たい方,あるいは業務や研究等ためにこれらの情報を調べている方は,本文書を参照しないようにして下さい.しかし,公開鍵やPGPに関する他Webサイトの解説がまったく理解できなかった方,あるいは情報技術に関して経験も知識もない方にとっては,このサイトの解説は一定程度有益なものと考えます.なぜなら,私自身がそのような方に極めて近いレベルにあり,そうした立場と視点で記述するからです.

公開鍵とは

鍵なのに公開するとは・・・と不思議な思いをしている方もおられると思いますが,判ればとても簡単なことです.どうかゆっくり読み進めてください.
さて,暗号化とは要するに,情報に封印をすることです.権利がある人にしか開けられないようにすること,と言い換えることもできます.電子署名もこの封印の一種です.権利がある者しか編集することができないように,あるいは改ざんしてもすぐバレるようにする,ということです.
さて,このように情報を封印するのはどのような場合でしょうか?
まず,その情報を自分にしか読めないようにする場合が考えられます.そしてもうひとつ,その情報を特定の誰かにだけ伝えたい場合です.
前者は簡単です.封印をかけて,その鍵を自分で肌身離さず持ち歩けば良いのです.この点,「PiratesofCalibian-Deadman'schest」に登場した幽霊船の船長が好例です.彼のように,鍵を誰にも分からない場所に隠して持ち歩くことが最上です.その鍵を手に入れない限り誰も封印を解くことはできません.
しかし,後者の場合はどうでしょうか.例えばあなたが遠方にいる親戚に手紙を届けたい場合です.手紙には重要なことが書かれています.あなたはその情報を守りたいので,手紙には封印をして鍵をかけるでしょう.これで鍵を持つ者以外には手紙を読むことができなくなりました.しかし,その手紙は肝心の相手方(ここでは親戚)にも読むことができません.読むためには,あなたから鍵を受け取る必要があります.では,鍵はどうやって届ければいいのでしょうか?
手紙と一緒に鍵を送っては意味がありません.そこで,手紙と鍵を別々におくることを思いつくでしょう.これで一応は目的を達成できます.しかし(例えは悪いのですが)郵便局の集配係員がとんでもない悪人だった場合は困ります.同じ家から出る郵便物を一定期間見張っていれば,いつかその手紙を開けることができる鍵が確実に手に入るのですから.鍵が手紙より先に送られても同じことです.鍵に対応した手紙が発送されるのを辛抱強く待っていればいいのです.23年も見張っていれば,その家の秘密はすべて入手できるでしょう(そんなに長い間見張ることがあり得るか,ですって?億万長者のオンラインバンクのIDとパスワードを安全に入手できるのに時間を気にする人が何人いるでしょうか).そのような極端な事態を想定しないとしても,別に郵送した鍵が途中で紛失しないとも限りません.あなたは手紙を送った後,確かに鍵が届いたかどうかいつも気にしていなくてはならないのです.そもそも,このような手紙を頻繁に送る場合,こうしたやりかたはとても面倒です.いつも同じ人に送るのであれば良いのですが,例えば毎日たくさんの新顧客が集まる銀行を想像してみましょう.
これらの問題は,実世界だけではなく,インターネットなどの電子情報網の中でも同じように重要です.情報の封印は,一般に,暗号化することで行います.暗号化した情報は意味のない文字列となり,鍵を用いて開錠しない限り読むことができません.しかし,一般に,電子的な鍵は実世界の鍵より盗まれやすいといえます.また,盗まれたことを察知しづらい面もあります.あるいは紛失する危険も実際の鍵より高いと言えます.実際の鍵は停電しても消えませんが,電子情報網ではすぐに消滅してしまいます.このように,封印をした鍵をどうやって安全に送るのか,鍵をどのように保存するのか,というのはとても重要でかつ面倒な問題だったのです.
これに対する答えのひとつが「公開鍵」を利用した暗号方式(公開鍵暗号方式:PublicKeyInfrastructure)です.この方式では,上のようにリスクが非常に高い「鍵を送る」ということを止めてしまいます.(反対に,上のように「鍵を送る」方式のことを「秘密鍵暗号方式」といいます)

公開鍵暗号方式のしくみ

 

これを理解するには視点を変える必要があります.
普通は「鍵は封印をかけた人が作る」と考えると思います.

しかし公開鍵方式では「鍵は荷物を受け取る人が作る」のです.
そしてその鍵は2つの部品から出来ています.「公開鍵」と「秘密鍵」というものです.図にすると以下のようになります.

●従来の方式(秘密鍵方式):自分[秘密]-[カギ]→相手・・・秘密は「カギ」で開く
●公開鍵方式:自分[秘密]-[]→相手[]・・・秘密は「カ」「ギ」がそろわないと開かない,「カ」は誰でも入手可閭

イメージとしては,金属の鍵が真ん中から2つに割れたものが適切かも知れません.よくカップルがこのような形のアクセサリを持っていますよね.その一つをあわせると一つの鍵になる.その鍵こそが愛への扉を開く鍵・・・かどうかは知りませんが,そのようなイメージで結構です.
そのような鍵の片割れ「秘密鍵」は,受け取り主が大事に保管しておきます.誰にも知られないように,誰にも触られないように.そしてもう一方の片割れ「公開鍵」は,なんと全世界,すべての人にばら撒くのです!愛情のばら撒きです.誰か私のパートナーはいませんか?といわんばかりです.脱線しがちですが,確かにばら撒きます.
もちろん,実際にはすべての人に郵送するわけではありません.「鍵が欲しいと思えばいつでも手に入る場所に置いておく」のです.インターネット上にはそのような場所がたくさんあります.個人のWebサイトでもかまいませんし,そのような鍵を交換することを目的に開かれているサーバ上でもかまいません.(そのようなサーバを「キーサーバ[KeyServer]」と呼びます.この名称で検索すれば,いくつか見つかるはずです)さて,あなたが誰かに秘密の情報を送りたいとします.今までは「自分で作った鍵」で封印をしていましたが,公開鍵方式では「相手が作った鍵」,つまり「誰でも手に入る,相手の公開鍵」で封印するのです.そのため,まずは相手に「あなたの公開鍵を下さい」ということになります.(このとき,正しい公開鍵であるかどうかがとても重要です.このことは実で触れます)そして入手した公開鍵で,その情報を封印,つまり暗号化します.公開鍵はひとつの鍵の片割れではありますが,暗号化することだけはひとりでできるようになっています.そして,その封印は,鍵のもう一方の片割れ・・・つまり「相手が持っている秘密鍵」がそろわないと解くことができない仕組みになっています.封印した情報は,どのような方法でも相手に渡ればかまいません.暗号化されていますから,誰に奪われてもかまわないのです.そのようにして相手に届いた情報は,相手が持っている「秘密鍵」で開封されます.
こうして「鍵を相手に送ることなく」秘密をたもったまま情報を送ることができるのです.

それでもわからない人のために

それでもイメージが湧かないという方は,以下のようにイメージすれば良いと思います.
情報が欲しいあなた(受け取る側)は,あらかじめ,特製の錠前をたくさん作っておきます.どれくらいたくさんかというと100億個くらいです.全世界に配れるくらいです.大事なのは「あらかじめ」作っておくということです.送って欲しい情報が現れたときに作るのではありません.この錠前を「公開鍵」といいます.公開鍵は,誰にでも差し上げてかまいません.ですが「錠前に差し込む棒カギ」はたくさん作ってはダメです.1個だけ作って,あなたしか知らない場所に大事にしまっておかなくてはいけません.(このカギを「秘密鍵」といいます)
そして,送って欲しい情報があるときには,その持ち主に「前にあげた錠前を使って封印して送ってね」と言うのです.そうすると,その錠前がとり付けられた状態で情報が到着するでしょう.あとは大事にしまっておいた「棒カギ」で情報を開封すれば良いだけです.
こうやってやりとりする方法を「公開鍵方式」といいます.

まだダメな人のために

まだイメージつかめない人,いませんか?
どうしてもダメであれば,このように考えてください.
荷物に「受け取り主しか開けない」という呪文をかけたいときに,公開鍵方式では「受け取り主自身が呪文をかけます」.
そのほかの方式では「送り主が呪文をかけます」.
このため,公開鍵方式では受け取り主ははじめから解除呪文を知っています.一方,その他の方式では受け取り主は送り主から解除呪文をもらわないといけません.

公開鍵方式での問題点

このようにとても便利でかつ有用な公開鍵暗号方式ですが,構造上の脆弱性も併せ持っています.それは,公開鍵の信頼性です.この方式は秘密鍵方式と異なり,封印を作成するための鍵をあらかじめ誰にでもわかるようにしておく点に特徴があり,脆弱性もそこにあります.
ある人に情報を送りたい人は,受け取り主が公開している鍵で封印を作成する,というのはご理解いただけたと思います.ここで,悪意のある第三者が受け取り主になりすまして「この鍵で封印を作って情報を送ってください」というリスクが生じます.(リスクというのは,脅威が発生する可能性のことです.脅威とは,あるものが本来の効用を発揮できなくなるような一態のことです.余談)そして,そのようにして作られた封印を横取りして,自分がもっている片割れのカギ(秘密鍵)で開封してしまうのです.横取りというと難しそうであり,そのような一態が発生することはまれに思えますが,例えばファイル交換ソフトを利用するウィルスなどを想像してください.また,無線LANで直接メールファイルにアクセスするということもあり得ますし,家族間や同僚間などの親しい間ではそのようなことは非常に容易であることが想像できます.
ですから,公開鍵が「確かに受け取り手のものかどうか」が,公開鍵方式では極めて重要なのです.
この点を確かにするために,いくつかのアイデアが提出されました.そのうちのひとつが「認証局」や「証明書」という考え方であり,あるいは「鍵指紋」です.

この鍵は確かにあの人のもの -認証局,証明書-

最近は一民基本台帳ネットワークシステム(略して「住基」と呼ばれたりします)の関一などでこれら「認証局」等の概念がニュースに登場したりします.こうしたシステムは,基本的には一に述べたような公開鍵方式によりセキュリティを保持しています.(もっとも,このような場合に公開鍵方式が用いられる目的は情報の暗号化・秘匿ではなく「電子署名」が目的であることが普通です.ここでは電子署名についての説明は省略しますが,「公開鍵で暗号化・秘密鍵で開封」という仕組みは同じです)このため,やはり「その公開鍵は確かにその人のものかどうか」が非常に重要になります.
「認証局」「証明書」というのは,その対策のための手法のひとつです.「認証局」は,「信頼の置ける第一者に[この鍵は確かにこの人の鍵だ]と一証してもらおう」という仕組みです.「証明書」は,そのような信頼の置ける第一者が発行した保証書です.認証局そのものは誰がやってもかまいません.しかし,信頼が置けない情報を信頼が置けるものにするための組織である認証局は,国・地方自治体などの公的機関に匹敵する信用が求められます.このため政府認証基盤などではあらかじめ定められた厳密な手続きを経て認証選定されます

この鍵は確かにあの人のもの -鍵指紋-

一方,「鍵指紋」という方法で,確かにその鍵がその人のものだということを保証するやり方もあります.

「鍵指紋」というのは,「公開鍵」のミニチュアです.公開鍵をあるフィルタに通すと,これが得られます.ある公開鍵からはその鍵指紋しか得られず,ある鍵指紋から得られる公開鍵もひとつだけ(と考えて差し支えない)です.
そのような鍵指紋を,普段からメールの署名欄に書き加えて,いろいろな人に送っておきます.その相手の中には,将来,自分にあてて秘密の情報を送るであろう人が含まれていなくてはいけません.さて,いよいよ誰かが自分に向けて秘密の情報を送りたい場合,その人は次のようにして「確かに公開鍵が受け手のもの」であることを確認します.
まず,入手した公開鍵から鍵指紋を実り出します.この操作はほとんどのアプリケーションではとても簡単です.
次に,受け手から普段送られてきていたメールをできるだけたくさんチェックし,受け手の鍵指紋をできるだけたくさん見つけ出します.メールは,できるだけ古くからできるだけ最近にいたるまで網羅していることが望ましいです.つまり「確かにその人から送られてきたメール」といえるメールを得ることが目的です.
そのようなメールに書かれていた鍵指紋は,たしかにその人のものであることが推定されます(私のように公開鍵を頻繁に更新する人はあまり信用が置けません).そうした鍵指紋を,公開鍵から実り出した鍵指紋と比較するのです.それが同一であれば,その公開鍵は確かにその人のものである可能性が高いといえます.
つまり「普段送られてきていた指紋」と「後から送られてきた指紋」を見比べる,という確認方法です.公開鍵は改ざんや盗用が容易ですが,これまで長い間送られてきたメールをすべて改ざんしたり,それだけ長い間その人に成りすましてメールをやりとりするのは困難だろう,ということがこの方法の根拠です.

まとめ

  • 公開鍵方式は「封印するための鍵を公開し,開封するための鍵をしまっておく」方式.
  • 公開鍵方式は「鍵を受け手が作る」方式.だから,鍵を秘密にやりとりする必要がない.
  • 「公開鍵」は世界中に公開しておく.送り手は,受け手の公開鍵で封印して送る.
  • その公開鍵が誰のものか,本当に正しい鍵か,ということがとても重要.
  • 公開鍵の正当性を保証するための方法が「認証局」であり「鍵指紋」.