スキーテールで学ぶ暗号化の概念
情報の元の意味を把握できないように、一定のアルゴリズムで変換する過程を暗号化といいます。暗号化の歴史は、コンピュータの登場よりもずっと以前から始まりました。戦争で勝つためには、味方の情報が敵に漏れないように保護することが必須だったからです。
古代スパルタでは、上の写真のような木の棒を利用して軍事機密を伝えたそうです。木の棒をスキーテールと呼んだので別名スキーテール暗号化と言いますが、 方法は次のとおりです。
① 送信者と受信者は、事前に同じ形状とサイズの木の棒を分けています。
② 送信者は、長い形状の羊皮紙を木の棒に巻き付けた後、水平方向にメッセージを書きます。
③ 棒に巻いた羊皮紙を再び広げて受信者に渡します。
④ 受信者は再び羊皮紙を棒に巻きつけてメッセージを解読します。
単純な方法ですが、暗号学の主な概念をすべて含んでいます。じっくり見てみましょう。
スパルタの兵士が暗号化された手紙を伝えようとしてアテネ軍に捕まったと仮定しましょう。アテネ君は羊皮紙に書かれたメッセージを一生懸命読んでも本当の意味を分かるわけがないでしょう。
スキーテール暗号化は、暗号化と復号化の鍵がともに「スキーテールの太さ」でした。このように暗号化と復号化が同じ鍵を使用する暗号化方式を「対称鍵(symmetric-key)暗号方式」といいます。再び捕獲されたスパルタ兵の話に戻り、対称鍵暗号方式のメリットとデメリットについて見てみましょう。
アテネ兵士の一人がスキーテール暗号化について聞いたことがあるとしましょう。この兵士が直接木の棒を作って羊皮紙を巻いてみてはいかがでしょうか? 捕まえられた兵士が使っていたような太さではないと復号化できません。暗号化アルゴリズムが知られているにもかかわらず、復号化キーであるスキーテールがないから安全です。
ただし、スパルタ兵士が復号化に必要なスキーテールを一緒に伝えようとした時に捕まえられたものであれば、話が変わります。兵士の一人がアルゴリズムについて知っているので、スキーテールを奪取したら、手紙を復号化できるはずです。AESのような現代の対称キーアルゴリズムは、スキーテールよりもはるかに複雑な暗号化方法を使用していますが、途中で奪取されたら終わりという根本的な弱点を克服することはできませんでした。
暗号化通信を行うには、最初の1回だけは相手に暗号化アルゴリズムと鍵を渡さなければなりません。鍵を渡せず奪取された場合、その後の通信は平文で送るものと変わらなくなります。さらに、敵軍が奪取したスキーテールで偽のメッセージを作成したら混乱をもたらす可能性もあります。
このリスクのある対称鍵暗号方式を使用する理由は、次に紹介する非対称暗号化よりもはるかに高速で暗号化および復号化を行うことができるからです。 暗号鍵を渡すときにのみ安全なアルゴリズムで保護し、残りの通信は対称キーアルゴリズムを介して暗号化する方法が多く使用されます。
逆に暗号化に使用する鍵と復号化に使用する鍵が異なる「非対称暗号化」もあります。非対称暗号化では、鍵のペアを一緒に使用します。この鍵をそれぞれ公開鍵と秘密鍵といいます。 公開鍵と秘密鍵は互いを介してのみ復号化できます。つまり、公開鍵で暗号化したメッセージは秘密鍵で復号化し、秘密鍵で暗号化したメッセージは公開鍵で復号化しなければなりません。
受信者は「私にメッセージを送信するときは、この鍵を介して暗号化しなさい」と送信者に公開鍵を渡します。このとき公開鍵を渡す過程で誰かが傍受したり盗んだりしても構いません。スキーテールを奪うかと思って戦戦恐恐たるスパルタ兵の姿を考えると驚くべきことです。通信プロセスを見ながら、どうしてこんなことが可能なのか見てみましょう。
① 受信者が公開鍵を公開します。
② 送信者は受信者の公開鍵を介して自分のメッセージを暗号化して転送します。
③ 受信者は秘密鍵を使用して転送されたメッセージを復号します。
ハッカーが途中でパケットを傍受すると、受信者の公開鍵と暗号文のみを取得できます。復号化に必要な秘密鍵は受信者だけであるため、メッセージの復号化はできません。メッセージを解読するには、受信者のコンピュータに直接浸透して秘密鍵を得る方法しかありません。これはパケットを傍受するよりもはるかに困難です。スキーテールを伝えていた兵士を捕まえるよりも敵陣に攻め込んで奪うのが難しいのと同じことです。
前に対称鍵暗号方式を説明する際、暗号鍵を奪取されれば暗号文の内容を敵にバレるだけでなく、偽のメッセージにだまされることも生じることがあると言いました。非対称暗号化アルゴリズムを使用すると、偽のメッセージにだまされることを防ぐことができます。非対称暗号化アルゴリズムを使用した通信プロセスを段階的に調べると、次のようになります。
① 送信者は次の2つのデータを公開します。
a. 公開鍵
b. 秘密鍵を使用して暗号化されたメッセージ
② 受信者は公開鍵でメッセージの復号を試みます。
③ 復号化の結果に応じて、次のように判断します。
a. 成功:メッセージは送信者が送信したものです。
b. 失敗:メッセージは送信者ふりをする他の誰かに送信されました。
復号化に失敗した場合、なぜ偽造されたメッセージだと分かるのでしょうか。ハッカーがパケットを盗んでも、暗号化に使用した送信者の秘密鍵を分かる方法はありません。したがって、偽のメッセージを暗号化するには、自分が所有している別の秘密鍵を使用するしかありません。このように暗号化したメッセージは、送信者の公開鍵で暗号化できないため、偽造されたことがバレるようになるのです。
最後に、復号化が不可能な「一方向暗号」があります。一方向暗号を理解するには、まず「ハッシュ関数」の概念を知る必要があります。ハッシュ関数とは、引数で何を設定しても、含数値の大きさが一定の関数をいいます。たとえば、一方向暗号アルゴリズムの中で広く使用されているsha-256は、引数の長さに関係なく32バイトのハッシュ値を返します。この関数の引数を平文として与え、返された文字列を暗号文として使用するのが一方向暗号化です。
ハッシュ関数も数学関数の一種なので、引数が同じであれば含数値も同じです。しかし、含数値を見て引数が何であったかを調べることは不可能です。つまり、平文が同じであれば暗号文も同じですが、暗号文を見て平文が何だったのか調べることは不可能です。2つの文字列を暗号化する例を見てみましょう。
F903118960A7FF1FC5948220EBDF60AD3AEE8AC9884736891A0C7944EDA57244
13BB3932FD59710CECA3FBC421CD3C344864341C3A585000268A9FC9B1DB7566
「WhatapLabs」と「WhaTap Labs」の違いは中にスペースがあるかどうかの一つだけです。ところで、結果の文字列はまったく異なります。このように小さな違いにも結果が変わるのを「雪崩」効果といいます。暗号化に使用するハッシュ関数は、雪崩効果が非常に強く起こります。
あるユーザーがパスワードを「WhatapLabs」と設定したと仮定しましょう。平文をそのままデータベースに保存すると、漏洩時にユーザーのダメージが非常に大きくなります。代わりにハッシュ値「F90311…」 ’を保存すると、流出事故が発生しても復号化できず、被害が制限されます。幸いなことは、ログイン機能の実装にも支障はありません。ログインしたいユーザーが入力したパスワードのハッシュ値が「F90311…」と一致したら成功であり、そうでなければログイン失敗と処理します 。
注意すべきことは、一方向暗号を使用しても弱点がまったくないわけではないということです。異なる引数のハッシュ関数値が同じ現象を「衝突」といいます。 衝突の発生方法がわかっている場合は、パスワードを復号したのと同じ効果を得ることができます。たとえば、Webサイトで使用されているハッシュ関数が、引数「WhatapLabs」と「Monitoring」の両方に同じ関数値を返すとします。ハッカーはWhatapLabsという平文を知らなくても「Monitoring」というパスワードを入力してログインできるようになります。
前に紹介したsha-256のような安全なアルゴリズムは、ハッシュ衝突が発生した場合の数がまだ見つかっていません。一方、md5やsha-1などの古いアルゴリズムは衝突が発生することが知られているため、パスワードなどの機密情報を暗号化するときは絶対に使用しないでください。
今日は、情報保護に使用する暗号化方式について簡単に紹介させていただきました。現在のネットワーク環境では暗号化が使われない区間がほとんどないと言っても過言ではありません。次回からは暗号化アルゴリズムの具体的な使用ケースについて学んでいきたい思います。