すっかり身近になった暗号通信。でも暗号通信は,単純に通信内容を暗号で隠しているだけではない。いくつかの暗号技術を組み合わせ,通信相手の確認や改ざんの有無も調べている。なぜそんなことができるのか,どうして安全なのか。暗号技術と暗号通信のキモをきちんと押さえれば,わかってくるはずだ。 Part1では,まず暗号の原理を説明しよう。

 ネットワークでは,いろいろな局面で暗号技術が使われている。セキュリティを高めるためには,なんらかの形で通信データを暗号化するのが当たり前。Webアクセスで使うSSLのほか,無線LANではWEP(ウェップ)やWPA,LAN間通信やリモート・アクセスではIPsec(アイピーセック)などの暗号技術を使っている。

 ただ,ひと口に「暗号化」と言っても,通信機器やプログラムの中でどんな処理をしているのか,なぜ安全なのかは,なかなか見えてこない。いっそブラック・ボックスとして扱えれば良いのだが,「×××の暗号が破られた」といったニュースが飛び込んでくると,自分が使っている暗号技術は大丈夫か心配になる人も多いだろう。

扱うデータはすべてビット列

 暗号というと,シャーロック・ホームズの「踊る人形」のような推理小説を想像するかもしれない。一見すると意味不明に見える図形列に隠された意味を,ホームズが解き明かす物語である。このように暗号とは,解き方を知らない第三者には本来の意味がわからないように隠す技術である。

 通信で使う暗号も目的は同じだ。送り手はデータの内容を第三者に解読されないように暗号化して相手に送る。受け手はあらかじめ決めたルールに従って解読(復号)する。

 ここで思い出してほしいのは,ディジタル通信では,あらゆるデータを2進数のビット列に変換してから送るということ。テキストや画像,音声といった区別なく,すべてをビット列に変換して送る。つまり,現代の通信で扱うデータはビット列なのである。

順番を何度も並べ替える

 通信で使う暗号とは,要するに元データのビット列を加工する特殊な変換方法である。

 元のデータ(ビット列)と,暗号鍵(これもビット列)と呼ばれる秘密のデータを組み合わせ,あらかじめ決められたルールに従って,元データのビット列を並べ替えていくのである。しかし,やみくもにビット列を変換してしまったのでは,受信側で元に戻せない。そこで,元に戻せるように変換ルールを決め,暗号鍵と組み合わせてビット列を並べ替えていく。

 文章にして書くだけではわかりにくいので図にしてみよう。図1は,あらかじめ決めた二つのルールで,8ビットのデータを暗号化する例だ。ここでは,ルールを実行するかどうかを決めるために暗号鍵を使っている。

図1●暗号化の基本はビット列を並べ替えていく処理
図1●暗号化の基本はビット列を並べ替えていく処理
暗号化とは元のデータのビット列を並べ替えていく処理である。並べ替えのルールは最初から決まっているが,処理の内容が鍵によって変化するように作る。そのためルールと鍵の両方がそろわないと元に戻せない。

 たった2段階だが,元データのビット列がどうやって異なるビット列に変化したのかがわかるはずだ。こうした処理を繰り返せば,第三者には解読できない暗号データを作れる。しかし,ルールと鍵を知っている受信者は,暗号化したときと逆の手順を実行することで,暗号化されたビット列から元の正しいデータに戻せる。

 これが暗号技術の基本的な原理の一つで,「転置処理」と呼ばれる。

置換表を使う手法も併用

 転置処理によって,元データのビット列はごちゃごちゃになる。しかし,これだけだと弱い面もある。例えば,元のビット列がすべて「0」だったら,転置処理によって暗号化したデータも同じになってしまう。そこで,実際の暗号処理では「換字処理」という,もう一つの技術を併用する。

 換字処理とは,ルールとして何種類もの置換表を用意しておき,暗号鍵のバリエーションによってどの置換表を使うかを決める手法。その置換表に沿ってビット列を置き換えていくのである。

 例えば,元のデータを4ビットずつに区切ったら,最初の4ビットが「1100」だったとしよう。一方,暗号鍵のビット列から置換表Xを使うことが決まった。この置換表Xを見ると「1100→1010」と書かれている。すると暗号処理の中では,最初の4ビットを「1010」に変換する。これで,最初の4ビットが暗号化されたことになる。

 こうした処理を繰り返せば,すべてのビット列が変換される。また,受信側では暗号鍵からどの置換表を使ったかがわかるので,その置換表に沿って復号できる。

 ただし,このような換字処理ではデータ全体がごちゃ交ぜにはならず,データを区切ったブロック単位の変換になる。データ全体を大きく入れ替える転置処理と組み合わせることで,より強固な暗号になる。

「XOR」だけは覚えておこう

 このほか,実際の暗号処理では「XOR(エックスオア/排他論理和)」という論理演算も多用される。論理演算と聞いただけで逃げ出したくなる読者もいるだろうが,難しいものではない。暗号技術をきちんと理解するには不可欠なので,お付き合いしてほしい。

 XOR演算はとても簡単だ。「1+1」が「0」になることと,ケタ上がりしないこと以外は,普通の足し算と同じである。別の見方をすると,二つのビットが同じなら0,異なったら1を出力する(図2左)。

図2●暗号化によく利用されるXOR演算<br>XORは排他論理和と呼ばれる演算で,暗号処理の内部でよく使われる。元のデータと同じ長さのビット列を鍵データとして,1ビットごとにXOR演算することで暗号化する。暗号化したデータにもう一度鍵データをXORすると元に戻る。
図2●暗号化によく利用されるXOR演算
XORは排他論理和と呼ばれる演算で,暗号処理の内部でよく使われる。元のデータと同じ長さのビット列を鍵データとして,1ビットごとにXOR演算することで暗号化する。暗号化したデータにもう一度鍵データをXORすると元に戻る。
[画像のクリックで拡大表示]

 なぜよく使われるかというと,便利だからだ。まず,元データと同じ長さの適当な暗号鍵(ビット列)を用意する。この暗号鍵を元のデータとXORするだけで暗号データになる(図2右)。

 復号は,この暗号データに同じ暗号鍵でもう一度XORすればよい。同じ鍵で2度XOR演算すると,同じ数字同士なので,すべて「0」になる。「0」の場合,XOR演算しても元のまま。復号はこの性質を利用しているのだ。また,このことからすべて「0」の暗号鍵はあり得ないことがわかる。