2002年11月のご挨拶

更新日:2002/11/1

 電子申請と公開鍵暗号

電子申請と公開鍵暗号

 ンターネットによる電子申請や入札制度が開始されつつあります。
 これは、E-Japan構想に基づくもので例えば、入札については、談合等の不透明性を払拭し、かつ、効率的な受発注を目指すものです。
  現在、国及び地方公共団体等が準備を行っています。
  例えば、東京都では、2002年4月から実施しています。入札制度の詳細は、東京都の入札情報のページに詳しい説明が掲載されています。(情報のページは、http://www.e-procurement.metro.tokyo.jp/index.jsp)

  このようなインターネットを利用した場合、入札や電子申請の問題点は、
 1.接続先が本当の役所のページかどうか?
   役所から来たメールが本物かどうか?
 2.申請者が名乗っている本人であるかどうか?
 3.申請内容が途中で改ざんされていないか?
 4.申請内容が第3者に盗聴されないか
 等の問題があります。

  このような問題は、これまでの本人が申請書を直接、持参する方法では、どうであったでしょうか?
 例えば、1.の疑問は、直接、持参する方法では、まず、問題には、ならなかったでしょう。
  郵送による場合でも書留扱いにするなどして、対処できました。

  次に2.の疑問、申請者が本人か偽物か、という件は、例えば、申請者の身分証明書、印鑑証明書で確認するなどで対応できます。
  3.の改ざん、4の盗聴については、直接、持参する場合は、起こりそうにありません。
 郵送の場合は、書留扱い、あるいは、内容証明郵便を利用する方法などがあります。
  というように、現実世界では、無視できるか、あるいは、身分証明書等で保証できる問題です。

  しかし、これを通信で、しかも、インターネットという途中で盗聴や改ざんの危険が潜在的に存在する通信手段を用いてとなると、必ずしも容易なことではないのです。
  まず、4.の盗聴の危険に対処することを考えましょう。
 インターネットは、データがバケットという単位でバケツリレー式に様々なプロバイダー等を経由して送信されていきます。
 途中での盗聴を防止する原理的な手段はありません。
 ここは、電話網という閉じたネットワークを持つ電話とは、異なります。

  そこで、盗聴されても分からないようにすれば、いいのではないか、ということで「暗号化」という手段が考えられました。
  暗号化は、3.の改ざんも抑制できますが、意味のない改ざんは、検知できない場合もあり得ます。
 例えば、暗号化されたデータ(暗号文という)の意味は分からずとも、内容をでたらめに書き替えるなどの行為です。
  改ざんの検知は、ハッシュ値という、データを基にして計算される値を利用します。
 ハッシュ値は、改ざんされるとその値が変化します。これにより改ざんを検知することができます。
  ハッシュ関数には、「SHA-1」(160ビットのハッシュ値を計算します。標準となっていくようです。)
 「MD5」(128ビットのハッシュ値を生成します。現在もよく使われています。)などがあります。

  1.の接続先が真正かどうかという問題は、一見、意味がないように思えます。
 例えば、私たちが www.・・とURLアドレスを入力して表示されたページは、通常は、正しいページです。
  しかし、URLを入力して該当するページが表示されるという、働きは、DNS(ドメイン・ネーム・システム)の働きによるものです。
 DNSは、入力されたURLアドレスをIPアドレス(202.3.2.13など)に変換しています。
 DNSの情報が内部・外部で改ざんされていると、偽のページに誘導されてしまいます。
 大切な申請内容を偽のページに入力してしまう結果になります。
 このようなことは、防止しなければなりません。
  メールについては、偽りのメールを見分ける必要があります。

  では、どうやって。
  この問題は、申請者と申請先という2者だけで考えていても完全には、解決できません。
 申請先やメールが本物であることを第3者に証明してもらう必要があるようです。
  皆様も、ソフトウェアなどのダウンロードの際に、例えば、マイクロソフト社の正規のソフトウェアであることを証明する、ベリサイン社の証明書が提示されたご経験があると思います。これが証明書の例です。
  その証明書は、やはり暗号化する必要があります。でないと、証明書が偽造される恐れがあるからです。
 現実世界でも、偽造防止のために押印したり、場合によっては、印鑑証明書を添付させたりします。
 これに相当することをインターネット上で行う必要があるからです。

  しかし、証明書を暗号化しても、申請者が復号化(暗号を解くこと)ができなくてはなりません。
 でないと、確認できないからです。同時に申請先を偽装しようとする悪者にも復号化は可能になります。
  ではありますが、悪者が正規の暗号化ができないようにしておかなければなりません。
 でないと、折角、正規の証明書を暗号化しても意味がありません。
  通常、私たちが知っている暗号は、暗号化する鍵と復号化する鍵が同じものです。
 これを共通鍵暗号といいます。
 この方法は、共通鍵が奪われなければ、堅牢ですが、上記のように復号化はできても暗号化ができないようには、できません。

  長い間、暗号化と復号化の間にこのような都合のよい非対称性を持たすことはできないと信じられてきました。
 そこに登場したのが「公開鍵暗号」です。その発見は、1976年のことでした。
  公開鍵(Public Key)暗号について、以下、私自身が理解できるように説明を試みてみましょう。

  公開鍵暗号では、公開鍵とともに秘密鍵(SK)をペアで使用します。秘密鍵は、所持している本人しか知りません。
  まず、記法を導入しましょう。申請者をAとし、申請先をBとします。
  次にPKで暗号化することまたは暗号文を、PKA(f)と書くことにします。
 その意味は、Aの公開鍵で暗号化するということです。ここで、fは、文書としましょう。
  同様にSKA(f)は、Aの秘密鍵で文書fを暗号化することです。

  次に復号化ですが、PKA[g]とは、Aの公開鍵で暗号化文gを復号化する操作またはその結果を表します。
 公開鍵暗号の特徴は、これらの記号を使えば、次のようになります。
 ・PKA[SKA(f)]=f
 ・SKA[PKA(f)]=f

  言葉で説明すると、Aの秘密鍵で暗号化した文書fは、Aの公開鍵で復号化できる。
 また、Aの公開鍵で暗号化した文書fは、Aの秘密鍵で復号化できる。
  ということになります。

  また、PKX[SKA(f)]<>fであります。ここで、Xは、A以外の者を表します。
  すなわち、Aの秘密鍵で暗号化した文fは、A以外の公開鍵では、復号化することはできない。
 ということになります。
  なお、PとSを入れ替えても同様です。

  さて、この性質を利用して、実際の申請を考えてみましょう。
  まず、Aは、fを、PKB(f)としてBに送信します。これは、Bの公開鍵で暗号化することです。
 これを受け取ったBは、SKB[PKB(f)]として復号化します。
 これは、上記の性質によりfそのものになります。
 
  盗聴ができないことは、PKX[PKB(f)]などがfに復号化できないことから保証されます。
 
  改ざんの検知については、fのハッシュ値をH(f)と書きましょう。改ざんされた場合は、Hが変化します。
  まず、Aは、fからハッシュ値を計算し、PKB(f)、SKA(H(f))として双方を暗号化してBに送信します。
 Bは、SKB[PKB(f)]=gで申請書を復号化します。
 ここで、改ざんされた可能性を考慮して、gは、必ずしもfではないとしておきましょう。
  次にBは、PKA[SKA(H(f)]でハッシュ値を復号化します。
 これがH(g)と等しい場合に、g=fと結論します。

  ここでちょっと疑問。SKA(H(f))でなくてPKB(H(f))で送信してはいけないか?
 確かに暗号化、復号化だけを考えれば、これでもいいようにも思いますが、SKA( )で暗号化し、PKA[ ]で復号化できると、Aが間違いなくAであることが分かり、署名がわりに使用できるためであると思われます。

  いや、まてまて。これだけでは、Aが真正のAであるかどうかは、依然として断言できません。
 Aを騙る偽物かもしれません。
  現実世界では、例えば、申請書に書かれている申請者と実際に申請に来た者が異なっているということであります。
 これは、先ほど出て参りました、第3者による証明書によらなければ、不確かです。

  そこで、A、B以外に証明機関としてCを考えます。
  Cは、Aが真正のAであることを証明する証明書(Caとしましょう)を交付します。
 Caは、Cの秘密鍵で暗号化されています。すなわち、SKC(Ca)です。

  Aは、PKB(f)とSKC(Ca)をBに送信します。(同時にハッシュ値も送りますが煩雑なので省略します)
 Bは、SKB[PKB(f)]としてfを復号化し、また、PKC[SKC(Ca)]として、Caを復号化して証明書の正当性を確認します。
 これにより、Aは、真正のAであることが保証されます。
  
  同様に、Aは、接続先からSKC(Cb)を入手します。これをPKC[SKC(Cb)]として復号化して、これがCbであることから、接続先が真正のBであることを確認できます。
 
  で、公開鍵暗号が完全に機能するためには、証明機関(CAと呼ばれる)が不可欠であることが分かりました。
 例えば、前述のベリサイン社などが証明機関として有名です。

  地方公共団体主催の入札や電子申請に際しては、
  「地方公共団体が住民・企業等との間で実施する申請・届出等の手続き、あるいは地方公共団体間の文書のやり取りを電子的に行う場合においては、作成する電子文書等の内容が改ざんされていないかを確認する手段が必要となります。
 この手段を提供するための仕組みが地方公共団体における組織認証基盤(以下「LGPKI」という。)です。」
  という書き出しではじまる、
  「地方公共団体における組織認証基盤(LGPKI)」がその役割を担うことになります。
  ホームページは、次のところです。http://www.lgpki.jp/

  以上、長々と書いて参りましたが、公開鍵暗号の暗号化と復号化の仕組みの詳細は、どうなっているのでしょうか。
  公開鍵暗号の一つ、RSA暗号は、大きな整数の素因数分解が難しいことを利用しています。
 素因数分解とは、整数、例えば、5976を2^3*3^2*83というように素数の積に分解する行為です。
 これは、米国のRSA社が特許を持っていた方法ですが、2000/9に失効しました。
 RSA暗号では、公開鍵として2つの数、秘密鍵として、1つの数が使用されます。
  公開鍵暗号の実現には、この他にもいくつかの方法があるようです。
 「楕円曲線暗号」というものが広く研究されており、実際にも使用されているようです。
 この内容については、私の理解を超えていますので、ここでは、触れません。

  さて、素数とこれらの数達との詳細な説明は、別稿に譲るとして、文献に従い、RSA暗号の作り方を天下り式に書いておきましょう。
  まず、暗号化したい文章を10進数で数値化します。簡単のために文字は、27種類しかないことにしましょう。

  暗号化したい文(平文という)が、「go」であったとしましょう。大文字、小文字を同一視して、a⇒0
 b⇒1、・・スペース⇒26というように対応をつけます。平文は、6,14となります。
 これを27進数とみなして6×27+14=196と10進化します。この196が送りたい平文です。
  
  1067(これは、11×97と素因数分解できます)を選んで、公開鍵の一つにします。
 ただし、これが11×97と素因数分解できるということは、秘密にしておきます。
  1067のオイラー関数の値を計算します。オイラー関数Φについては、やはり別項に記載しましょう。

  Φ(1067)=Φ(11)×Φ(97)=(11-1)×(97-1)=960

  次に960と互いに素となる数字を求めます。この960は、秘密です。
 互いに素となる数とは、2つの数の最大公約数が1しかないことをいいます。
 例えば、8と6の最大公約数は、2となりますので、これらは、互いに素とはいいません。
  今回は、1573としましょう。1573=11^2×13、960=2^6×3×5なので、両者は、互いに素となります。
 この1573は公開鍵となります。

  更に960を法としたときの1573の逆元を計算します。数値nの逆元とは、n×m≡1(mod 960)となる、mのことです。
  ≡は、合同式を表します。上記では、nxmを960で割ったときの余りが1に等しいことを意味します。
  例えば、11≡2 (mod 3)です。逆元は、nと法(ここでは960)が互いに素であれば、存在します。

  今回は、877が逆元となります。事実、1573×877=1379521でこれは、960で割ると1余ります。
 この877は、秘密鍵となります。
 
  これで準備ができました。
  平文を次のように暗号化します。平文の数字、196を1573乗して、1067で割った余りの数字で置き換えます。
 すなわち、196^1573≡? (mod 1067)の?を求めます。(計算方法は、別稿)
 これは、344となります。これが暗号文です。

  復号は、344^877≡? (mod 1067)の?を求めます。
 (ここで、877は、秘密鍵です。1067は、公開鍵の1つです。)
 計算すると、344^877≡196となります。(計算方法は、別稿)
 これは、最初の平文と同一です。これで、暗号文が解読できたことになります。

  ここで注意。上記の場合は、簡単のために数字の桁数が少なかったのですが、実際は、公開鍵、秘密鍵とも100~200桁以上の数字が使われます。
 従いまして、公開鍵から秘密鍵が推定しにくくなっています。
  また、公開鍵暗号の欠点は、共通鍵に比べて暗号化、復号化に時間がかかることです。
 従いまして、文書全体は、共通鍵暗号で暗号化し、共通鍵暗号の鍵部分を公開鍵暗号で暗号化するなどもされているようです。

  これで公開鍵暗号の説明を終わります。以上は、日経BP社の「日経WINDOWSプロ2002/11号」、及び下記のサイトの記事を参考にしました。
 ここに記して感謝申し上げます。
 ・http://hp.vector.co.jp/authors/VA008160/cipher.htm (暗号入門講座)
 ・http://www.faireal.net/articles/5/24/#d20523 (高校数学で学ぶ公開鍵暗号)
 ・http://www.wani.net/bak/crypt/hash.htm (ハッシュ関数)
 
 
 では、今月は、ここまで。
 皆様、お元気でお過ごし下さい。また、来月、お会いしましょう。

前回のご挨拶に戻る今月のご挨拶に戻る次回のご挨拶に進む