今回のお題は暗号化の手法である。日常生活でも、インターネットで個人情報や機密情報をやりとりする場面、あるいは金融機関で情報交換などの暗号化によってデータを保護しなければならない場面はいろいろある。しかし、軍事用途の通信になればもう、暗号化の重要性は言うまでもない。

暗号化にまつわる用語

本題に入る前に、用語の整理を少々しておこう。

暗号化とは、素の通信文(平文)を、当事者以外にはわからない形(暗号文)に変換する行為である。変換に際して一定のルールがないと、暗号文を受け取った側で、元の平文に戻すことができない。だから、ルールについては当事者同士で事前に打ち合わせておかなければならない。

その、正しい受信者が暗号文を平文に戻す操作のことを復号化という(複合化ではない)。それに対して、正しくない受信者、つまり通信を傍受あるいは盗み取った誰かさんが、強引に暗号文から平文を得ようとする操作のことを解読という。

だから、暗号解読は通信傍受とワンセットであり、正規の受信者が行う操作は、解読ではなく復号化と言うべきであろう。実際には、正規の受信者が行う作業でも解読という言葉を使っている事例がたくさんあるが。

そして、暗号化や復号化に使用するルールのことを「アルゴリズム」という。ただし、アルゴリズムを決めるだけでは、同じアルゴリズムを利用しているユーザー同士で復号化を好き勝手にできることになってしまって具合が悪いので、ユーザーごとに固有の情報を加味できるようにする。それが鍵である。

同じアルゴリズムでも鍵が違えば、平文を変換することで吐き出される暗号文は別のものになる。もちろん、同じアルゴリズムと同じ鍵を持っていなければ、復号化はできない(公開鍵暗号の場合、「同じ鍵」ではないが、「正規の鍵ペアがそろう」と言えばよいだろうか)。

サイファー

cypherあるいはcipherという。文字単位で変換操作を行う暗号化手法の総称だ。基本的な考え方は、「換字表」(変換表)を用意しておいて、平文で使われている文字を1文字ずつ、別の文字に置き換えるというものだ。現代のコンピュータ・ベースの暗号も、こちらに属すると言えるだろう。ただし、文字単位ではなくビット単位、あるいはビット列単位になる。

この方法で作られた暗号文を解読する際の典型的な手法は、頻度分析である。アルファベット26文字、すべてが平均的に文中に出現するとは限らず、どうしても「よく出てくる文字」「あまり出てこない文字」の違いは出てくる。だから、換字を行った後の暗号文について、頻出する文字を調べれば、換字のパターンを推測する手がかりにつながってしまう。

そして、頻度分析をやらせるのであれば、人手でせっせと数えるよりもコンピュータに勘定させたほうが速くて確実だ。

頻度分析による解読を防ぐには、換字表を複数用意するなどの手段により、換字のパターンを増やす方法が考えられる。具体的な手法について述べ始めると「軍事とIT」の話から脱線してしまう。幸いにもこの手の話について書かれた書籍はたくさんあるので、興味があったら探してみていただきたい。

いずれにせよ、この方法は漢字文化圏では使いにくい。例えば、日本語の場合、何千文字もある漢字・ひらがな・カタカナ・数字・記号について、いちいち変換表を作り、しかも元と同じ文字に変換しないようなものを作らなければならないのでは、手間がかかりすぎる。

その点、英語圏ならアルファベット26文字で済むから、これならどうにかなる。数字が加わったところで、10文字だから知れている。

コードと乱数表

では、日本語の暗号文を作るにはどうすればよいか。ということで、もう1つの暗号化手法である「コード(code)」が登場する。要するに、単語ごとに暗号書を作るものだ。

例えば、日本海軍が使っていたD暗号書は4桁の数字暗号だった。つまり、地名や艦名、各種の用語、日本語として文章を組み立てるために必要となるさまざまな単語、それでもカバーできない場面のために個別の文字について、それぞれ4桁の数字を割り当てるのである。すると「聯合艦隊ハ 本日 出航」という文面が「2314 4239 4419」といった具合に数字の並びに化ける。

それを受信した側では、同じ暗号書を使って元の文面を得る。だから、通信する当事者同士が同じ暗号書を持っていなければ、通信が成立しない。通信内容を誰かさんが傍受しても、数字の並びから元の単語を割り出すのは不可能である。

この例では日本語を数字列に置き換えたが、まるで意味が違う(しかし、事情を知らない者には普通の文章に見える)文面に置き換える手法もある。これも一種のコードと言えるかもしれない。

例えば、「X日ヲ一二月八日トスル」が「新高山登レ一二〇八」になる。これは真珠湾攻撃の決行日を知らせる有名な通信文だが、これをそのまま発信したわけではない。実際には、前述した「数字列を列挙する暗号書」を使って、数字の並びに置き換えてから発信した。

これで秘匿はバッチリ……と言いたいところだが、そうは問屋が卸さない。コールサイン(呼出符号)を基にして送信者と宛先を推測したり、作戦行動の状況と通信のタイミングを照合したり、方向探知機で発信源の所在を調べたり、といった具合にさまざまな情報を組み合わせることで、通信内容を推測しようと試みることができる。

また、軍隊の通信は文学作品とは違うから、必要なことだけを簡潔に、決まり切った文面で書くことが多い。そのことが、似たような文面、あるいは同じ単語の頻出につながり、これもまた通信内容を推測する手がかりにつながる。例えば、気象通報は毎日、同じ時間に同じ関係者同士で、似たような文面で発信されるものの典型例である。

そこで、同じ単語が必ず同じ数字列になって出てくる事態を避けようとして考え出されたのが乱数表。つまり、暗号書を使ってこしらえた数字列に対して、事前に用意しておいたランダムな数字列の並びを加算する。ただしその際に繰り上がりはしないので、結果は以下のようになる。

乱数表の例。Excelなどのツールを使って簡単に作成できる

これを相手に送信するのだが、その際に「乱数表のどこそこから」という情報(乱数開始符)を付加しておく。受信した側では、同じ乱数表の指定された場所から乱数の列を拾い出して、上とは逆の操作をする。双方が同じ暗号書と乱数表を持っていれば、これで元の文面が出てくるはずである。