技術コラム集

セキュリティってなに?(4) 秘密鍵暗号と公開鍵暗号

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

前回は暗号について簡単に説明したけど、今回はいよいよ暗号の仕組みを説明していくよ。
今回は、暗号の代表的なタイプとして、「秘密鍵暗号」と「公開鍵暗号」を説明してみよう。

もちろん暗号方式はこれら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人の頭文字なんだ)の話や、
公開鍵暗号の「鍵の受け渡し以外の使い方」について説明してみよう。

 

「セキュリティってなに?」(1) (2) (3) (4) (5) (6) (7

拾四の巻:デバイスにアクセスするには拾六の巻:DMA対応と言われたら

ビリーの講義一覧

このページの上へ