暗号や認証,公開鍵(かぎ)方式などネットワーク・セキュリティの基本技術について学びます。今回は暗号技術について,その原理と工夫点などを解説します。

 4つのセキュリティ・モデル(図1)のうち,もっとも理解しやすいのが,「盗聴モデル」でしょう。誰かに情報を伝える場合,読んでほしくない人に情報を読み取られてしまうリスクがあります。この盗聴を防止するために使われる技術が暗号です。今回はその暗号について取り上げます。

図1●4つのセキュリティ・モデル
図1●4つのセキュリティ・モデル
[画像のクリックで拡大表示]

 通信で,これから送る情報を平文といいます。平文は誰でも読み取れるので,流す前に暗号化します(図2)。平文と鍵の情報が組み合わされ,出来上がった情報が暗号文になります。暗号化はコンピュータで行われるために,鍵といってもその実体はある大きさを持った数値です。

図2●共有鍵暗号
図2●共有鍵暗号
両者は通信を開始するに当たって,事前に鍵を共有しておく。

 暗号文は,鍵を持っていない人にとっては,全く意味をなさない情報に見えます。正規の受信者もやはり鍵を持っており,その鍵で暗号文を平文に戻すこと(復号化)ができます。暗号鍵と復号鍵は同じもので,通信を始める前に事前に共有しておかなければなりません。このような暗号方式を共有鍵暗号方式(プリシェアード方式)といいます。

 インターネットを流れる情報は,文字や画像,音声などさまざまです。それらの情報はすべて数値に変換されてネットワークに送り出されます。ネットワークの中をのぞき見るメガネがあれば,おびただしい量の数値が飛び交っているのが見えるでしょう。しかし,数字だけ見てもそれが何を意味しているのか分かりません。例えば41という数値は,何らかの文字を表すのか,画像情報の明るさを表すのか,それとも音の大きさなのか? これはあるルールがあり,その規則に従って,情報が数値化されているのです。

 情報を何らかの数値に変換するのは符号化といって,暗号化とは区別されます。符号化されて数値化された情報が平文です。平文は基本的には誰でも入手できる符号化規則によってその意味を知ることができます。暗号化は平文の数値情報をさらに別の数値に変換することになります。

 数値を別の数値に変換する操作は演算と呼ばれます。演算は足し算,引き算などが思い浮かびますが,暗号化の演算は排他的論理和(XOR)がよく使われます。

 XORは,2進数に適用されます。演算される2つの数値が異なるときに1,等しいときに0が出力されます(図3)。この演算にはという記号を使います。例えば,11=0,10=1となります。どんな数値もいったん2進数に直して,一けたずつ計算します。繰り上がりや繰り下がりはありません。PK=Cという演算では,Pが平文,Kが鍵,Cが暗号文です。排他的論理和演算は,可逆的な性質があり,PK=CであればCK=Pとなります。これは暗号文に鍵を作用すれば平文に戻る復号化を表します。暗号化と復号化には同じ鍵が使えるのです。

図3●XOR演算を使えば同じカギで元に戻せる
図3●XOR演算を使えば同じカギで元に戻せる

高速に処理するDES型暗号

 実際には,鍵と平文の長さは違いますので,平文をずらしながら暗号化することになります。しかし,長文を暗号化する場合などに,同じパターンの数値列,例えば0の連続などが含まれていると,暗号文の中に鍵がそのまま現われることになります。実際にはこのような単純な暗号は,ほとんど使われませんが,ここではXOR演算が暗号化においては重要な役割を果たしていることを覚えておいてください。

 では,実際にはどのような暗号が使われるのでしょうか。現在最も多く用いられているのが,DES(デス)暗号です。暗号化と復号化に同じ鍵を使う共有鍵暗号方式の一つです。

 DESの最大の特徴は,暗号化処理が高速であることです。最近になり,データを暗号化あるいは復号化しながら100Mビット/秒で通信できるブロードバンド・ルーターが入手できるようになってきました。まだ1Gビット/秒クラスの回線を暗号化できる製品はそう多くありませんが,1Gビット/秒が当たり前になったときにも,暗号化処理がボトルネックにならないようにしなければなりません。

 DES暗号はブロック暗号です。図4のように,平文を一定の長さ(ここでは64ビット)に区切り,それを暗号化して別の64ビットのデータにします。それを順次繰り返していきます。

図4●ブロック暗号の仕組み
図4●ブロック暗号の仕組み

 DESでは64ビット長の暗号化鍵を使いますが,パリティ・ビットという冗長データが含まれており,実際に鍵データとして使われるのはそのうちの56ビットです。

 この56ビットを使って,入力された64ビット長の平文を別の64ビット長データに変換するのです。それを図式化したものが図5です。64ビットのデータに「ある処理」を施して別の64ビット・データに変換します。その処理を16回繰り返すことで,最終出力の64ビット暗号文が得られます。その16回繰り返される処理は,同じアルゴリズムですが,毎回,入力データと鍵が異なります。鍵は56ビット長のビット列の順序を入れ替えたり回転させたりして,異なる16種類の48ビット長の子鍵を作り出します。

図5●DES型暗号処理の全体像
図5●DES型暗号処理の全体像
[画像のクリックで拡大表示]

 「ある処理」を示したのが,図6です。暗号化では64ビットの入力を左右半分に分けて,右半分に「かき混ぜ関数」処理をします。その出力と左半分のデータの排他的論理和を取って,新しい右半分のデータとします。一方新しい左半分のデータは,元々右半分だったデータをそのまま利用します。かき混ぜ関数は, 48ビットの鍵と32ビットの入力データに対し,32ビットのデータが固定的に決まるテーブル(表)だと考えてください。

図6●DES処理の仕組み
図6●DES処理の仕組み
[画像のクリックで拡大表示]

 図6の右半分が復号化処理を表しています。面白いところは,かき混ぜ関数を逆関数として使っていないところです。かき混ぜ関数は複雑な処理をしますので,逆関数を持つようには作られていません。しかし,排他的論理和を巧妙に組み合わせることによって,暗号化も復号化もかき混ぜ関数を同じ方向に使っているのに,ほとんど同じ処理で暗号化と復号化が実現されています。図6左の下部に現れた64ビット出力を,そのまま右側の64ビット入力に入れると,元のデータが復元されることが分かるでしょう。これにより暗号化鍵と復号化鍵を共通にするのです。

 このようにDESは,ビット入れ替えの処理を何度も繰り返すことによって入力データからは想像も付かないような複雑な暗号を生成しつつ,再度同じ処理を施すだけで,元のデータが復元できる構造になっています。

 ビットの入れ替え処理は,ソフトウエアで実施すると途端に処理は遅くなるために,DES型暗号は専用LSIで実施することが一般的です。しかし後で説明するように,速度を気にしなければLinuxでもソフトウエアでDES型暗号を実施することも可能です。