情報ラボ > 暗号のしくみ
文字をずらすだけの古典的な暗号から、いまインターネットを支えている公開鍵暗号まで。
元の文(平文)
暗号化した文(暗号文)
文字の対応表
ずらす数は25通りしかないので、すべて試せば必ず解けます。意味の通る行を探してください。
緑で示した行は、英語としてありそうな単語を含んでいるものです。
| 共通鍵暗号 | 公開鍵暗号 | |
|---|---|---|
| 鍵の数 | 1つ(同じ鍵で暗号化と復号) | 2つ(公開鍵と秘密鍵の組) |
| 鍵を渡す必要 | ある(ここが弱点) | ない(公開鍵は公開してよい) |
| 処理の速さ | 速い | 遅い |
| 代表的な方式 | AES | RSA、楕円曲線暗号 |
実際のHTTPS通信では、両方を組み合わせています。最初に公開鍵暗号で共通鍵を安全に渡し、そのあとは速い共通鍵暗号でやり取りする、という方法です。
手紙を誰かに届けたいとき、途中で誰かに読まれては困る内容があります。そこで、決まった規則で文章を別の形に変え、規則を知らない人には意味が分からなくします。これが暗号です。
元の文章を平文、変換したものを暗号文、変換の規則で使う情報を鍵といいます。暗号文から平文に戻すことを復号といいます。
古代ローマの将軍ユリウス・カエサル(シーザー)が使ったと伝えられる方法です。アルファベットを決まった数だけずらすだけの、単純な仕組みです。
3つずらす場合、AはDに、BはEに、CはFになります。ZまでいったらAに戻ります。「HELLO」なら「KHOOR」です。
この方式では、ずらす数が鍵にあたります。受け取った側は同じ数だけ逆にずらせば、元の文章に戻せます。
鍵の種類が25通りしかないからです。ずらす数は1から25までのどれかなので、全部試しても25回で済みます。人間が手作業でやっても数分、コンピュータなら一瞬です。
暗号の強さは、鍵の種類の多さで決まります。現代の暗号では、鍵の候補が天文学的な数になるよう設計されています。たとえばAESという方式では、128ビットの鍵を使います。組み合わせは2の128乗、約340澗(かん)通りです。すべて試すのは、現在のコンピュータでは不可能です。
暗号化と復号に同じ鍵を使う方式です。シーザー暗号もこの仲間です。現代ではAES(エーイーエス)が広く使われています。
計算が速いという大きな利点があります。大量のデータをやり取りする通信では、この速さが重要になります。
しかし、根本的な問題があります。相手に鍵をどうやって渡すのかという問題です。
鍵を通信路で送れば、途中で盗み見される可能性があります。暗号文を守るために暗号を使うのに、その鍵を守る手段がない。これを鍵配送問題といいます。
直接会って手渡しできるならよいのですが、インターネットで初めてアクセスするサイトと、事前に鍵を共有しておくことはできません。上のツールで実際に何が起きるか確かめられます。
この問題を解決したのが公開鍵暗号です。1970年代に考案された、暗号史における大きな転換点でした。
鍵を2つ用意します。公開鍵と秘密鍵です。この2つは対になっていて、次の性質を持ちます。
そのため、公開鍵は誰に見られても構いません。むしろ公開してよいので「公開鍵」と呼びます。秘密鍵だけを自分の手元に隠しておけば安全です。
受信者は公開鍵を配り、送信者はそれで暗号化して送ります。途中で盗み見されても、復号できるのは秘密鍵を持つ受信者だけです。鍵を渡す必要がなくなったのが、この方式の画期的な点です。
公開鍵暗号は、計算しやすいが逆算しにくい問題を利用しています。RSAという方式では、素因数分解の難しさを使っています。
大きな素数を2つ掛け合わせるのは簡単です。しかし、その積から元の2つの素数を求めるのは、桁数が大きくなると現実的な時間では不可能になります。この非対称性が、公開鍵と秘密鍵の関係を支えています。
公開鍵暗号には欠点があります。計算が遅いのです。ウェブページのすべてのデータをこの方式で暗号化すると、通信に時間がかかりすぎます。
そこでHTTPS(TLS)では、両方の良いところを組み合わせています。
これをハイブリッド暗号方式といいます。ブラウザのアドレスバーに鍵マークが表示されているとき、裏側でこの仕組みが動いています。
さらにTLSでは、通信相手が本物かを確かめる認証と、途中で書きかえられていないかを確かめる改ざん検知も同時に行っています。暗号化だけでは「相手が偽物」という問題は防げないためです。
公開鍵暗号には、暗号化とは逆の使い方もあります。秘密鍵で処理し、公開鍵で確かめるという方法です。
秘密鍵を持っているのは本人だけなので、正しく処理できたということは本人が作成したことの証明になります。これが電子署名です。紙の書類における印鑑やサインにあたります。
電子署名は2つのことを同時に示します。1つは、その人が作成したという本人性。もう1つは、途中で書きかえられていないという完全性です。ソフトウェアの配布元が正しいかを確かめる仕組みや、ウェブサイトの証明書にも使われています。
暗号と関係の深い技術に、ハッシュ関数があります。任意の長さのデータから、決まった長さの値を計算する関数です。
特徴は3つあります。同じデータからは必ず同じ値が出ること、少しでもデータが違えば全く違う値になること、そして値から元のデータを求められないことです。
この性質から、パスワードの保存やファイルの改ざん検出に使われます。パスワードそのものを保存せず、ハッシュ値だけを保存しておけば、流出しても直接は悪用されません。暗号と違い、もとに戻すことを目的としていないのが大きな違いです。