学校では教えてくれないこと

セキュリティってなに?(2)

2009.12

やあ、みんな。ビリーだよ。

前回は暗号について簡単に説明したけど、今回はいよいよ暗号の仕組みを説明していくよ。

今回は、暗号の代表的なタイプとして、「秘密鍵暗号」と「公開鍵暗号」を説明してみよう。もちろん暗号方式はこれら2つのタイプだけじゃないから、次回でその他の暗号や、暗号技術を応用した認証のやり方なんかも説明するね。

秘密鍵共有方式暗号

さっきは、「秘密鍵暗号」と簡単に書いてしまったけど、正確には『秘密鍵共有方式』というんだ。これはその名の通り、暗号文をやり取りする人同士が、まったく同じ秘密の鍵を共有し、同じ鍵を使って、平文を暗号化したり、暗号文を復号化したりする。鍵を盗まれないようにするのはもちろん、推測されたり、総当りで当てられたりするのを防ぐためには鍵を長くするんだ。

鍵というのはパスワードのようなものだから、文字列(ビット数)が長くなれば推測されにくくなるね。「64bit暗号」とか「512bit暗号」とかは鍵の長さを表していることになるんだ。同じ鍵を使って暗号化したり複合化したりするのは、とっても当たり前のことに思えるよね。

他にどんな暗号があるっちゅうねん、と思わず関西弁で突っ込んだりしちゃうけど、次に説明する公開鍵方式は全く違うんだ。公開鍵暗号方式と比べるために、秘密鍵共有方式について、改めて特徴をあげておこう。

  1. 暗号化にも復号化にも同じ鍵を使う。
  2. 鍵は通信相手同士が等しく持ち、第三者に渡らないように厳しく管理しなくてはならない。

いやあ、当たり前だね。

暗号というものはこういうものしかないと思っている人もたくさんいるよね。実際、30年くらい前にRSA暗号が世界初の公開鍵方式暗号としてデビューするまでは、暗号といえば基本的に秘密鍵共有方式だったんだ。これは、同じ鍵で暗号化と復号化を行なうので、対称型暗号とも言われる。秘密鍵暗号の代表的なものとしては、DES(デス)や3DES(トリプルデス)、AESなどたくさんあるんだ。

三菱電機やNTTなどが国産の暗号も開発しているんだよ。この方法で暗号文を生成し、インターネットで送って、復号して平文に戻す処理をコンピューターに計算させる場合、

  1. 計算式がわりと簡単なので、暗号化と復号化が高速
  2. ただし、鍵を相手にどうやって渡すかが問題

という2つがポイントになる。

1番目はいいとして、2番目のポイントは、インターネット上の通信を考えると非常に問題だよね。

本当なら、紙に書いた鍵を、体育館の裏あたりでこっそりと手渡ししたいところだけど、たとえそれができたとしても、その鍵を長い間使っていると、こっそりと盗聴しつづけた膨大な通信文から鍵を推測されてしまう。そうならないためには、タイミングを見て、鍵を更新するためにまた体育館の裏に行かなくてはならないよね。

鍵を手渡しできない場合(例えば郵便や電話、インターネットなどを使う)、当然鍵を暗号化しなくちゃいけないんだけど、「暗号化された鍵」という「文書」を復号するための鍵はやはりなんらかの方法で渡しておかなくてはならないし・・・堂堂巡りだね。この短所の解決策として公開鍵暗号方式が登場し、その結果、インターネット時代でも安全に鍵を受け渡せるようになるんだ。

公開鍵方式暗号

秘密鍵共有方式では、鍵は一つしかなかったけど、公開鍵方式では異なる鍵を同時に2つ作る。秘密鍵は好きなように決めることができるけど、公開鍵はこの2つの鍵をある計算によって導くんだ。

セットで生成された2つの鍵は、お互いに隠された関係を持っていて、片方で鍵をかけると、もう片方でしか鍵を明けられない。鍵Aで暗号化したものは鍵Aでは開かず、鍵Bでしか開かないんだ。もちろん鍵Cや鍵Dではまったく問題にならない。開ける鍵と閉める鍵が違っているので、非対称型暗号ということになる。

この変わった特徴をもつ2つの鍵の原理は後で説明するけど、具体的にはこの2つの鍵をどう使うんだろう。

例によってビリーはベリーちゃんに秘密の通信文を送りたいんだけど、ベリーちゃんはバリー君が脇で様子をうかがっていることが分かっているとしよう。そこで通信文を送ろうとしているビリーに待ったをかける。そしてベリーちゃんはおもむろに鍵Aをビリーに送るんだ。

この鍵Aで暗号化してビリーはベリーちゃんに通信文を送り、ベリーちゃんは誰にも知られていない鍵Bでこれを平文に戻すということができる。ちなみに、鍵Bさえしっかり管理していれば、鍵Aはバリー君や他の人にばれてもまったく問題はないんだ。

さっきも書いたように、鍵Aで暗号化されたものは、未公開の鍵Bでしか復号できないからだよね。極端な話ベリーちゃんは、鍵Aを自分に手紙を出す可能性のある人全てに堂々とばら撒いて、「私に手紙を送る際には、この鍵Aで暗号化して送ってね」としてもよくて、もっと言うと、ベリーちゃんはホームページ上で鍵Aを公開してもいいことになるんだ。

もちろん、鍵Bの厳重管理は最重要項目だけど、秘密鍵共有方式と違って、鍵の受け渡しに神経を使うことがないよね。秘密鍵共有方式の際には、暗号化のために相手先に渡す鍵が同時に復号化の鍵にもなっているから、鍵そのものが諸刃の剣になるけど、公開鍵方式では暗号化の鍵では復号できない、というのが大きなポイントになることがわかってくれたかな。

鍵Aと鍵Bには、「閉める鍵と開ける鍵」という関係が成立しているので、鍵Aから鍵Bを推測できちゃうんじゃないの?という心配はもっともだ。もちろんそんなことでは意味がないんだけどね。ここで簡単に、公開鍵暗号の仕組み、つまり鍵Aと鍵Bの関係を説明してみよう。ポイントだけを説明するようにするから、興味のある人はちゃんと調べてみてね。

鍵Aと鍵Bを生成するために、まずNという整数を決める。このNは二つの素数の積として用意する。このNだけを見て、二つの素数を推測することが非常に困難であることがこの暗号のポイントなんだ。みんなも、「素因数分解」という計算を覚えているよね。104といった数字を2×2×2×13に分解するようなあれだ。

104くらいだと、2から順に割っていけばいいんだけど、323なんていう数字だとどうかな?2や3から試していって、最初の割り切れる数である17にたどり着くのが結構面倒なんだよね。33191107なんていう数字も順番にあたっていくしかなくて、効率的な方法はないんだ(答えは、4451×7457)。

RSAさんによると、五十桁のNを2つの素数に分解するためにはおよそ百四十億回の試行錯誤を繰り返すことになんだって!いかにコンピューターといえど、さらにケタが増えればこの計算は数年かかったりすることになってくるよね。詳しい説明は省くけれど、このことが、鍵Aから鍵Bを推測することの困難さに利用されているんだ。

もちろん、単純に2つの素数がAとBになったりするわけではないけど、鍵の長さが長くなれば、Nに大きな数を選ぶことができるようになって、鍵の推測はどんどん難しくなるんだ。リヴェストさん、シャミルさん、エイドルマンさんの3人の発明したこの暗号は、頭文字をとってRSA方式と言われ、世界初の公開鍵暗号なんだ。

現在はRSAセキュリティという会社として暗号全般のオーソリティとなっている。みんなも聞いたことあるかな?RSA暗号は、素数の性質を利用しているので『素数暗号』と呼ばれているんだ。他に、離散対数という数学問題を使って「推測されにくい」という性質を実現した『楕円曲線暗号』と言うのもあって、これも公開鍵暗号方式の一種として使われているよ。

公開鍵暗号方式は、秘密鍵共有方式と比べて、鍵の生成、暗号化、複合化のいずれも計算が複雑になるので、それぞれにとっても時間がかかるんだ。つまり、通信文を公開鍵方式で暗号化するのも大変だし、送られた通信文を復号化するのも大変。だから、あんまり大きな文書を公開鍵方式で暗号化すると時間もかかるし、CPUパワーもいる。送られた方もいい迷惑だ。

ただ、鍵の受け渡しに心配がいらないという絶対的なメリットがあるよね。それで、文書そのものは秘密鍵共有方式で暗号化と復号化をすることにして、共有する秘密鍵そのものを公開鍵暗号方式で暗号化して受け渡しする、という使い分けをすれば、両方のいいところが使えるよね。

今回は、代表的な暗号方式を説明したけど、公開鍵方式がいかに画期的なものかわかってもらえるかな?つづいて、RSAさん以前に鍵の受け渡しのやり方を考えたDHさん(これも2人の頭文字なんだ)の話や、公開鍵暗号の「鍵の受け渡し以外の使い方」について説明してみよう。

Diffie-Hellman方式(DH法)

公開鍵暗号が発明される前に、DiffieさんとHellmanさんという二人が、共有鍵を安全に受け渡しする方法を発見してるんだ。これまで話してきた「暗号」ではなく、あくまでも「どうやったら安全に鍵を受け渡せるか」という方法ということになる。これはDH法と呼ばれて、通信手順のなかでよく使われている手法なので、説明しておくよ。

暗号じゃないから「解読される」ということにはならないけど、DH法のやり取りには欠点もあって、結局暗号文が解読されることになってしまうこともあるから、このことも最後に話そう。「中間一致攻撃」なんかはビリーが最初知った時は「なるほど!」と思ったね。

DH法による鍵の受け渡し

簡単な復習だけど、ビリーとベリーちゃんが、バリー君にばれないように暗号通信を行なうとき、通信路が安全でない場合には、鍵を平文で送ることはできないよね。これを盗まれたら、そのあとの暗号文は簡単に解読されてしまい、解読されたこともわからないかもしれない。この鍵を暗号化しようと思っても、その鍵を送る手段がなくて、堂々巡りになっちゃうよね。

DH法では、ビリーとベリーちゃんがある計算をそれぞれで行なうことで、共通鍵を計算するんだ。計算して得られた共通鍵は一致するので、これを使って暗号化するというやりかただ。バリー君にばれてもいい数字をまず決め、これを任意の整数でそれぞれが乗じて交換する、ということをするんだけど、わかるかな? ちょっと詳しく説明してみよう。

あるpという数字とgという数字(pはなるべく大きな素数、gはpより小さな自然数)をビリーとベリーちゃんの間で決めるんだけど、これはバリー君にばれても構わない。

まず、gをビリーは15乗してみよう。何乗するかはビリーが決めていいし、ベリーちゃんに伝える必要もないんだ。ベリーちゃんもgを22乗するとか決めて、勝手に計算する。

とっても大きな数字になりそうだけど、2乗、3乗としていくたびにpで割った余りを求めてこれを使えばそれほど大きな数字にはならず、コンピューターで簡単に計算できる。

これらの数字、ビリーが計算した「gの15乗(正確にはこれをpで割った余り)」と、ベリーちゃんが計算した「gの22乗(同)」をそれぞれ通信で相手に渡す。これもバリー君にばれちゃっても大丈夫なんだ。鍵が決まるまでのやり取りは盗まれてもいいという前提なんだね。

交換したそれぞれの数値をさっきの数字(ビリーは15でベリーちゃんは22)で乗じると、gを15乗してさらに22乗したか、22乗して15乗したかの違いだけで、全く同じ数字が手に入ることになることがわかるかな?もちろん、pで割った余りの数字も同じになるので、これを共通鍵として使うんだ。

共通鍵の説明図

バリー君は、pもgも「gの15乗」(これを仮にAとします)も「gの22乗」(これを仮にBとします)も盗聴の結果わかってるんだ。 でもバリー君は、「15」と「22」という数字は知らない。鍵を求めるには、当然この2つの数字を知ってeに乗じないといけないわけで、計算できそうに思えるよね。ところが、「gの15乗=A」は計算できても、「Aはgの何乗か」という問題は、15乗くらいならまだしも、数が大きくなると実はすごく大変なんだ。この、「こっち向きの計算は簡単だけど反対向きの計算はすごく大変」という特徴は、RSAのときの素因数分解と同じだね。

DH法の欠点

DH法の長所はいろいろあることはわかると思う。RSA暗号のような複雑な計算はいらなくて、計算してその結果を交換してもう一回計算する、という非常にシンプルで軽い処理で簡単に鍵交換ができるよね。

でもこの方法には、よく知られた欠点が2つあるんだ。どちらも、相手先が妥当かどうかという、当事者同士の相互認証手段がないことが原因なんだ。中間一致攻撃とサービス妨害攻撃と言うんだ。

中間一致攻撃

ビリーとベリーちゃんは、それぞれ相手と鍵の受け渡しを行なっていると思いこんでいるんだけど、実はビリーが送ったAという数値をバリー君が途中で奪って、ベリーちゃんのふりをして34乗したCをビリーに送ってるとしたらどうだろう。

一方、ベリーちゃんも相手がビリーだと思って送ったBをバリー君にインターセプトされ、同じようにDという数字を送られてしまっているんだ。

そうなると、ビリーはベリーちゃんと秘密鍵を唯一共有していると思っているのに、ビリー⇔バリー君、バリー君⇔ベリーちゃんの間にそれぞれ別の秘密鍵が発生していて、ビリーとベリーちゃんの間に直接の通信は成立していないということになるよね。

ビリーはベリーちゃんと通信をしているつもりでも、なんとバリー君と一緒に生成した共通鍵を使って、バリー君と通信を行なっているんだ。バリー君はしっかり通信文を読んだ後で(恥ずかし~)、自分をビリーだと思っているベリーちゃんとの間で生成した共通鍵を使って改めて暗号化し、ベリーちゃんに渡すわけだね。ベリーちゃんも、てっきりビリーとの間に共通鍵を生成したと思っているし、暗号化された通信文には全く怪しいところはないよね。

「なるほど!」と思わなかった?もし最初にDH法の説明をした時点でこのやり方に気付いた人がいたらすごいよ。センスがある。ビリーが弟子入りしたいね。ビリーとベリーちゃんは、それぞれ相手と鍵の受け渡しを行なっていると思いこんでいるんだけど、実はビリーが送ったAという数値をバリー君が途中で奪って、ベリーちゃんのふりをして34乗したCをビリーに送ってるとしたらどうだろう。

サービス妨害攻撃

もう一つの欠点は、サービス妨害攻撃といわれるもので、バリー君が匿名の第三者としてビリーやベリーちゃんに「通信したい」と名乗り出て、次から次へと鍵を要求するということができてしまうことなんだ。ビリーは早くベリーちゃんと秘密の文書をやり取りしたいのに、バリー君からの鍵要求に応えつづけなくてはならない。

おまけ

実はDiffieさんとHellmanさんは、RSAの3人が公開鍵暗号を開発する前に、安全に鍵を受け渡すための、公開鍵暗号という概念自体は提示していたんだ。つまり、「鍵Aで暗号化した文章は鍵Bでしか復号化できず、逆に、鍵Bで暗号化した文書は鍵Aでしか復号化できない」というAとBがあれば、公開鍵暗号として、秘密鍵共有方式の弱点を完全にカバーできる、としたんだ。うん、正しい。

ただし、DiffieさんとHellmanさんはこのような都合のいいAとBの対の数字を見つけることができなかったんだ。DH法はいわば鍵の受け渡しのためだけの窮余の策だったとも言えるね。

ここまで、セキュリティの基本である本人の認証、そうは言ってもデータを盗まれる危険がある現代に必須の、データの暗号化技術について説明してきたよね。本人の認証と安全な通信経路の確保が一番大事であることと、秘密鍵暗号や公開鍵暗号といった暗号方式、秘密鍵を安全に共有するための鍵交換の手法なんかが分かってもらえたかな?

次回は、この暗号化技術を使った、データそのものの認証について説明しよう。

暗号が破られると、データが改ざんされているかもしれないし、そもそも別人が作ったデータを受け取ってしまっているかもしれない。免許証といった本人であることを証明するための書類(データ)も、これが改ざん(偽造)されてたら意味ないよね。データそのものが信頼できるものかどうかはとっても大事なことなんだ。じゃあ、またね。

セキュリティってなに?(3)に続く

ページのトップへ