通信相手を偽るなりすましや,通信途中でデータを改ざんする攻撃から通信を守るには,通信の前に相手を確認したり,届いたデータが間違いなく相手からのものであるかを調べることが必要になる。改ざんされていないことを確認する技術も重要である。こうした目的にはデータを暗号化する「共通鍵暗号」だけでは不十分。そこで,「一方向暗号」や「公開鍵暗号」という別の暗号技術を併用する。Part2では,暗号通信の中核になる共通鍵暗号,一方向暗号,公開鍵暗号という三つの暗号技術を個別に解説していく。

 暗号通信の目的は,インターネットのような環境で相手と安全で確実な通信を実現することだ。インターネットのような環境とは,不特定多数の第三者に通信内容を盗み見されたり,妨害される可能性があるという意味である。つまり,さまざまなタイプの悪意ある第三者からの攻撃に耐えられるようにしなければならない(図1)。

図1●安全な通信を成立させる三つの暗号技術
図1●安全な通信を成立させる三つの暗号技術
悪意のある第三者はいろいろな攻撃を仕掛けてくる。これらに耐えて相手と秘密を守った通信を実現するには,単純に通信データを暗号化するだけでは不十分。

共通鍵暗号だけでは不十分

 通信データの内容を第三者が読めないように隠すことだけが暗号の目的だとすると,通信データを暗号化するだけで事足りる。きちんと暗号化したデータなら,暗号鍵を持たない第三者は解読できないからだ。

 しかし通信データを暗号化するだけでは,通信相手を偽るなりすましや,通信途中でデータを改ざんする攻撃にほとんど無力である。本来の通信相手になりすました第三者に暗号鍵を渡してしまったら,通信データを暗号化しても意味がない。通信の途中でデータがすり替えられたり,通信が妨害されて途中のデータが抜け落ちたのに気がつかないこともある。

 こうした攻撃から通信を守るには,通信の前に相手を確認したり,届いたデータが間違いなく相手からのものであるかを調べることが必要になる。さらに,改ざんされていないことを確認する技術も重要である。

一方向暗号と公開鍵暗号を併用

 しかし,こうした目的にはデータを暗号化する共通鍵暗号だけでは不十分。そこで通信の世界では,一方向暗号や公開鍵暗号という別の暗号技術を併用する。これら二つは共通鍵暗号とは異なる性質を持つため,共通鍵暗号では防げない攻撃に対応できるのだ。

 三つの技術を組み合わせる具体的な方法はPart3でじっくり説明するとして,ここでは暗号通信の中核になる三つの暗号技術を個別に解説していく。それぞれの特徴を理解していないと,全体像が見えてこないからだ。ということで,順番に見ていこう。

共通鍵暗号
通信データの暗号化に使う

 まずは,共通鍵暗号から見ていこう。共通鍵暗号は通信データ自体の暗号化を担う。暗号通信という観点から見ると,中心的存在と言える。

 共通鍵暗号の歴史は古い。というより,有史以来ごく最近までは「暗号=共通鍵暗号」を指していた。

 共通鍵暗号の基本的な使い方は,次の通りだ(図2上)。まず通信の両側でお互いに利用する暗号方式と,暗号化/復号に利用する暗号鍵を決めておく。そして送信側がデータを暗号化して送信し,受信側は同じ暗号鍵でデータを復号する。

図2●通信データの暗号化に使う共通鍵暗号<br>通信データの暗号化には共通鍵暗号が使われる。共通鍵暗号は暗号化と復号で同じ暗号鍵を使う。当たり前の話だが,利用するには通信の両側で同じ鍵を持っている必要がある。技術的にはデータを暗号化する方式の違いでブロック暗号とストリーム暗号に分けられる。
図2●通信データの暗号化に使う共通鍵暗号
通信データの暗号化には共通鍵暗号が使われる。共通鍵暗号は暗号化と復号で同じ暗号鍵を使う。当たり前の話だが,利用するには通信の両側で同じ鍵を持っている必要がある。技術的にはデータを暗号化する方式の違いでブロック暗号とストリーム暗号に分けられる。
[画像のクリックで拡大表示]

 要するに,通信の両端で同じ暗号鍵を使う。だから共通鍵暗号と呼ばれるわけだ。対称暗号と呼ばれたり,鍵を秘密にすることから秘密鍵暗号と呼ばれることもある。

共通鍵暗号には2種類ある

 共通鍵暗号は,元のデータを暗号化するときの手法の違いでブロック暗号とストリーム暗号の二つに分けられる。

 ブロック暗号は元データを一定の長さ(ブロック)に区切って,そのブロックに対して個別に暗号化する(図2左下)。Part 1で見てきた転置処理や換字処理は,このブロックに対して施されることになる。復号もブロックごとに処理される。

 ブロックのサイズは暗号方式によって異なる。一般に,設計が古めの暗号なら64ビット,新しい暗号は128ビットになっていることが多い

 一方のストリーム暗号は元データをブロックに区切らず,1ビットずつ順番に暗号化する(図2右下)。

 中核は,暗号鍵を基に元データと同じ長さのビット列(鍵ストリーム)を発生させる点にある。発生させた鍵ストリームと元データをXORすることで暗号化する。受信側では同じ鍵から同じ鍵ストリームを発生させ,暗号データにXORして復号する。