|
公開鍵暗号の利点としては単に平文に暗号をかけて秘密にする以外に「認証」「署名」「検証」という3つの機能があります。ここではこの3つの機能について説明しましょう。認証とは「相手は本物か」という通信においていつでも生じうる問題をどう解決するかを説明しましょう。
公開鍵方式では秘密にすべきP、Qがありそこから作成される公開鍵を管理する公開鍵証明発行局(CA: Certificate
Authority)が必要です。このCAを持つことにより先の3つの機能が実現できます。まず、全てのユーザはCAにIDを登録し、それぞれの公開鍵を作ってもらい公開します。また同時に自分用の秘密鍵も作ってもらいこれは秘密にしておきます。それから、電文を送りたいAさんは受け手のBさんの公開鍵をCAのリストのなかから選び(これは電話帖や名刺に書いておいても構いません。)この鍵を用いて暗号化して送ります。
送信者は自分の秘密鍵で送信文に「署名」を付け、受信者は送信者の公開している公開鍵で「検証」をすることができます。つまり「私は鍵を知っているから本物です」となるわけです。図13に公開鍵暗号による認証の仕組みを示します。
2.4.1 ゼロ知識証明
一般に、従来の認証技術では秘密情報を共有します。例えば、Aさんが「山」といえばBさんは「川」と答えるという約束を二人の間で共有すれば、AさんとBさんは互いに認証しあうことができます。しかし、もしこの「山」と言ったら「川」と答えるというやりとりを第三者のCさんが聞いていれば、Cさんが同じ約束を使ってAさんのなりすましになることもできます。ところが、ゼロ知識証明を用いると、Aさんだけが知っている秘密情報を一切他にもらさずに、自分が秘密情報を持っているという事実をBさんに伝えることができるため、このようななりすましを防ぐことができます。
例えば、Aさんがクレジットカードのパスワードを保持しているとして、Aさんがカード会社Yに自分のカードが本物であることを証明したいとします。ここでAさんを証明者、カード会社Yを検証者といいます。このとき、カードのパスワードは一切漏れないようにします。すなわち、「パスワードに関する情報は教えないけど、Aさんはこのパスワードを保持していることをカード会社Yに納得させる」ということがゼロ知識証明により可能となるのです。また、ゼロ知識証明を用いた認証法では、検証者Yは証明者Aの持つ秘密情報を一切所持せずに認証が行えるため、不特定多数の検証者との間で認証が行えると言う大きな特徴を持ちます。
■ゼロ知識証明
次に、ゼロ知識証明の仕組みについて説明します。証明の手順は以下のようになっています。まず、ゼロ知識証明を利用するために、信頼できるセンターを設け、センターは二つの素数を用意します。この2つの素数は、センターの秘密情報とします。実際には、80桁程度の大きい素数を用いますが、ここでは例として2桁の素数P=71とQ=97を用います。これらの2つの素数の積Nは、N=71×97=6887となります。ここで、公開鍵暗号のところで説明しましたように、この6887から2つの素数71と97を割り出すことは難しいことが分かります。そこで、このN=6887を全ユーザに公開します。
次に、ユーザのIDをセンターに登録します。IDはユーザそれぞれを特定できるもの、例えば電話番号などをIDとして考えてもいいかもしれません。ここでユーザAのIDをIDA
とします。センターは各ユーザからIDを登録されるとそのIDの平方根を計算します。
例えば、ユーザIDAを3314としますと、その平方根は√3314
(mod6887)=101となります。ここでmod6887とは、3314の平方根を6887で割ってその余りを答えとするという意味です。すなわち、「6887を法とする世界」を考えるということです。この101がユーザAの秘密情報SAであり、この情報が秘密にユーザAに届けられます。これと同様にユーザBやユーザCに関してもそれぞれの秘密情報が届けられます。
次に、実際にゼロ知識証明を用いて認証を行います。はじめに、ユーザAがユーザBに対して自分がAであること、すなわち自分の所有しているカードが本物であることを証明したいとします。
まず、ユーザAは適当に乱数r1を選び、これを二乗してNで割った余りをとり、この余り、すなわち(r1)^2(modN)をユーザBに送ります。例えば、ユーザAが乱数としてr1=90を選んだ場合、ユーザBに送る乱数x1は、x1=(90)^2=8100=1213(mod6887)となります。次に、ユーザBは、本当に送信者が正しいプロトコルを実行しているかを確認するためにチャレンジビットb1=0或いはb1=1を送信者に送ります。そして、もし送信者がユーザAならば、このチャレンジビットの値に応じてb1=1ならばy1=SAr1modN=101×90(mod6887)=2203と計算し、b1=0ならばy1=r1すなわち乱数をユーザBに送ります。ここでチャレンジビットを何度もユーザAに送ることにより送信者がなりすましでないことを確認することができます。最後に、(y1)^2=
(SAr1)^2= IDA・x1(modN)より送信者のIDはIDA=(2203)2/1213
=3314(mod6887)となり、ユーザBがユーザAのIDを認証することが可能となります。このように、ゼロ知識証明を用いることにより送信者は自分の秘密情報を他に洩らさず受信者に伝えることができるのです。
|