第五話
そろそろ、ここで暮らすようになって一ヶ月が経とうとしていた。
その間に春香は、宿主であるチャチャイの後を見え隠れしつつ着いて行く事で、随所に自分用の秘密のネットワークを拡げて行った。
それは、『ママと夏美』の仇を討つ力を手に入れるためであると同時に、あれ以降全く行方の知れなくなった仇を捜すための探索網を構築するためでもあった。
そしてその過程で、宿主のスキルを確実に我が物として行った。
そうして行く内にこの宿主が到底好意を懐く事の出来そうもない相手である事を再認識した。
彼は、他人の物を盗むのに全く躊躇いを覚えなかったし、面白半分での破壊行動は行わない(この点に付いてはネットワークの荒野を我が物顔でのして行く無法者達の中ではまあましな方だ)が、その理由は『利益にならない危険を犯す必要はない』からであり、自分の目的を果たすために必要だと思えば、破壊も躊躇わなかった。
実際に、侵入のために人命に関わる恐れのある機器を外部から操作して、クラッシュさせるのも見た。
それによる直接の死者や負傷者が出なかったのは、単に運が良かっただけの事に過ぎない。
要するに、徹頭徹尾自己中心的な人物なのである。
彼女の中の母譲りの正義感はとてもそれを許容する事は出来ないが、それでも目的を達成するためにはその冷徹さを見習わなくてはならないと知っており、沸き上がる嫌悪感を懸命に抑えて学習を続けていた。
チャチャイはあの妙なトラップを踏んでから、以前にも増して慎重に行動する様に心掛けていた。
あの時も、できるだけ自分を特定できる情報を残さない様に作業したはずだが、それでもいつになくのめり込んでしまい要らざる行動をかなりしてしまったので、思わぬ痕跡を残している可能性があったのだ。
あれからかなり経つので、今だに何も起こらない所を見ると、やはり只の手の込んだいたずらだったのであろうと判断したが、自戒を込めてもうしばらく慎重に振る舞う事にしている。
そうして控えめにではあるが、それでも日々の稼ぎのためにあちこちを探索している内に、妙なストレージを見付けた。
それは、打ち棄てられた無意味なノイズの詰まったジャンク情報のストレージの様に見えた。
しかし彼の鋭い嗅覚は、そのノイズの中に何か埋め込まれている情報がありそうだと言っていた。
それは、一見するとノイズとしか言い様のない無意味な文字の羅列であったが、恐らくは意味のある何らかの情報を暗号化した物ではないかと感じられたのだ。
ヒントとなったのは、ある隠語遊びであった。
彼等の様にアンダーグラウンドで活動する者達は、仲間内だけで通用する隠語を自然に多用する事になる。
この世界に足を踏み入れたばかりのスクリプト・キディ(初心者)は、格好付けでそれらの隠語を覚えようとするが、だんだん慣れて来るとそれは単なる格好付けの問題ではない事に気付く。
彼等の会話は往々にして傍聴されているので、差し障りがある話は隠語を交えて行わなければ、危険なのである。
だから、隠語がまともに使いこなせる様になるまで、誰も実のある会話はしてくれないのだ。
その隠語には多くの語彙が含まれているが、それでも全ての単語を網羅する事は出来ないので、即席の隠語として元の単語の文字をずらして判らなくするという方法が良く使われる。
例えばWGICCを二文字ずらしてYIKEEとする様な物である。
そこである程度ベテランになると、意味の不明な文字列を見ると、無意識に何文字かずらして意味のある単語を捜すという習慣を身に付ける様になる。
この一見すると無意味としか思えない様な文字列の数ヶ所に、同じ文字列の断片らしき物が見える事に気付くと、それを疑うのはおかしな話ではない。
ただし、データ全体を一定文字数ずらして見るという簡単なマクロを組んで実行してみたが、意味のありそうな文字列にはならなかった。
そこで彼は、換字式暗号を疑って見た。
換字式暗号とは、暗号化する前の平文を構成する各文字を一定の法則に従って他の文字に置き換える物で、ユリウス・カエサル(ジュリアス・シーザー)が使用していた事で知られている。
カエサル暗号と呼ばれるそれは、アルファベットを三文字づつずらした物で、それだけの操作ならハッカー達が使う即席の隠語と同じであり、先程のアプローチで解読できる筈である。
そうならなかったという事は、もう少し複雑な手順が使われていると思われる。
実際に単純なカエサル暗号なら、暗号文全体を一文字ずらしてみて、意味が取れなければ二文字、三文字とずらす幅を変えてみる事で、最大でも25回試行すれば、必ず解読できる。
つまり、暗号の強度(解読に対する抵抗力)は大変低いのである。
そこで、全部の文字を一律に同じルールでずらすのではなく、文字毎にずらすルールを変えるという手法が自然発生的に使われる様になった。
Aは二文字ずらしてCに、Bは五文字ずらしてGにといった具合に不規則かつ各種類の文字の変換先となる文字が被らない様に変換する事で、この変換ルールの対応表が無ければ復号出来ない様にしたのである。
ただしこの操作では、平文上の各種類の文字は必ず暗号文に変換した際に他の文字の変換結果と重複しない文字に変換される。
もし平文上の二種類以上の文字が暗号文上の同じ文字に変換される(例えばA→CかつX→Cの様に)と、変換先が重複する文字(先程の例で言えばC)を復号する際にどの文字に戻すべきか(AかXか)が決められなくなるため、復号が出来なくなるのだ。
この方法が使われる様になった事で、一旦は換字式暗号は解読不能になったと思われた。
しかし、これに対して平文の言語的特性を利用した解読法である出現頻度法が考案された。
例えば平文が英語なら、その中で最も使用頻度の高い文字はEである事から、暗号文上で最も出現頻度の高い文字をEと仮置きするという風に、各文字毎の出現頻度や、更には二文字・三文字のセットの出現頻度を使って解析する事で、よほど短い暗号文以外なら解読が可能となった。
こうして換字式暗号は過去の物となったかに見えたが、トリテミウスが改良を加えて、これに新たな生命を吹き込んだ。
それは先頭からの文字の位置によってずらす幅を変えるという物で、例えば一文字目は三文字ずらし、二文字目は四文字ずらすといった具合である。
こうする事で、特定の文字が必ず対応する特定の文字に変換される事がなくなり、平文上の文字の出現頻度が暗号文上の文字の出現頻度と関係しなくなった。
つまり、出現頻度によるアプローチが不可能となったのである。
とは言え、文字の位置でずらし方を変えるにあたりその変え方を規則的(例えば一文字目は一文字ずらし、二文字目は二文字ずらし・・・)にしたのでは、その難易度は少し上がるだけで十分な強度が確保できるとは言えない。
ずらし方をランダムに変えればその強度は飛躍的に上昇するが、今度はその変え方をどうやって記憶するかが問題となる。
そこから考えられた手法が『キーワード』である。
ある程度の長さを持つ単語をずらし方の規定に使用する事で、ずらし方の規則を簡単に覚えられる様にするのだ。
例えば、キーワードに『ABLE』を使用するとして、キーワードのAは一文字ずらし、Bは二文字ずらし・・・を意味するという風に決めれば平文『ABCD』はA+A→B、B+B→D、C+L→O、D+E→Hという操作で暗号『BDOH』に変換される。
この時、キーワードにはできるだけ長くかつ同じ文字の出てこない物を選ぶ事で、変換が不規則となり解読が難しくなる。
ただし平文上で同じ文字が連続した場合、暗号文の該当箇所にはキーワードを同じルールでずらしただけの文字列が出てしまう。
最も極端な例では、平文上のA~Zだけを変換しかつ変換先の文字としてZの次はAに戻るというルールを使用した場合に平文上でZが連続していると、Z+A→A、Z+B→Bという具合に暗号文にキーワードがそのまま出てくる。
つまり同じ文字列があちこちに出てくる場合は、平文上で同じ文字が連続しているために、キーワードをその文字でずらした物が出ている可能性が高いのである。
改めて文字列を見直すと、同じ文字列がほぼ等間隔で出現していた。
この間隔を文字列の一単位(例えば一行)の長さと予想して、同じ文字列の位置を手掛かりに一行の長さを計って見ると、128バイトになる事が判った。
それを手掛かりにデータの中身を検討した結果、この128バイトは概ね同じ内容の20バイトと28バイトの二つの部分に挟まれた様々な内容の80バイトの部分という3つの部分で構成されていると推測された。
ここから、このデータの内容は文字列の形で入力する実行命令の記録だろうと予測した。
実際に入力されたコマンドの80バイトに、記録するための日時情報等を持つヘッダー20バイトと、実行結果情報等を持つフッター28バイトが付与されているのだろうと考えたのである。
ずっと昔の、チャチャイの感覚でいえば石器時代に相当するコンピュータ創世期には、コンピュータへの入力は紙のカードに空けた無数の孔でデータを表現するパンチカードが使用されていたが、このパンチカードは一枚が80バイトだった。
だから、一つのコマンドは80バイトとなるのが普通だった。
今ではそんな制約は関係なくなっているのだが、それでもコマンドの標準形式では、一行80バイトというサイズが普通に使われている。
これより長いコマンドは、80バイト目に次行への継続を示すコードを入れて次の行にその続きを打ち、80バイトに満たないコマンドに付いては、その残りを何か意味のない同じコードで埋めるのである。
そこで彼は、この暗号文を前から20バイト・80バイト・28バイトに分割して、その80バイト部分の後部に注目した。
このコマンド後部の埋め草となる箇所には同じコードが並ぶので、暗号文のそこから全て同じコードを引くと、キーワードがそのまま出てくる可能性が高いのだ。
チャチャイは、その埋め草となるコードを16進数でいう20(10進数でいえば32)と予想した。
これはスペースを表している。
これがどういうコンピュータのコマンドなのかは判らないが、ほとんどのコンピュータはコマンドの埋め草としてスペースを使用するのだ。
そして、埋め草と思われる箇所の全ての文字からそれを引いて見たところ、出て来た文字列は『ANREBYATHANR』だった。
恐らく『REBYATHAN』の繰り返しなのであろう。
旧約聖書に出てくる海の怪物レビヤタン(レバイアサン)だと思われる。
いかにもそれらしい単語ではある。
そこで一行を128バイトと仮定して、各行の頭から『REBYATHAN』を繰り返し引いて見た。
予想通り、見覚えのあるコマンドの列が出現した。
どうやら、これでほぼ間違いは無さそうだ。
ただしその恐ろしく大量にあるコマンド列は、随所に意味不明の文字列を含んでいた。
ここまでの操作に何か誤りがあったかとも思ったが、もし解読操作を間違えたのならこの様に解読結果の大半が解釈可能な文字列になる確率はまずゼロと考えて良いので、その可能性はすぐに打ち消した。
それではこの意味不明の文字列をどう解釈するかだが、その不明部分の内容は、前後の解釈可能な文字列の内容から見て、アドレスやID、パスワードといった言わばその機能の中核となる部分であろうと思われる。
つまりこの部分は極めて重要なので、二重に暗号化されているのだろう。
そこで、今度はディクショナリー攻撃で使用する使われそうな単語を網羅する辞書と突き合わせて、何か意味のある文字列が出てこないか試すマクロを組んで見た。
しばらくマクロを走らせて見たが、どうも当たりは無さそうである。
まあ普通に考えて、一旦中核となる部分を隠蔽するために暗号化した後で更に全体を暗号化する、つまり暗号化を二階建てで行っているわけだから、二階が一階と同じやり方では二階建てにする意味がない。
となれば恐らく、この部分のキーワードはありきたりな意味のある単語ではなく、もっと類推し難い文字列、恐らくは乱数列を使用していると思われる。
乱数列とはその文字列自体が何の規則性も意味も持たない数字の羅列の事で、例えばサイコロを振って出た目を順に記録して行くといった方法で生成される。
乱数となるとその配列に規則性が無いので(規則性があればそれは乱数ではない)推理するための手掛かりが無く、そう簡単には解読出来ないが、全く歯が立たないわけでもない。
同じ乱数を使っている暗号文同士を比較する事で、キーを部分的に推理する事ができる。
例えば同じ乱数列を使用する暗号文同士を突き合わせて先頭から一バイトずつ引き算して見る。
この操作で答が0となる部分は、平文上で偶然に同じ文字が同じ位置に入っているという事なので、これをヒントにその文字を推理すると、それを手掛かりとしてその位置に対応する乱数をある程度絞り込む事ができる。
そういった操作を繰り返すと、仮想的な乱数列を組み立てる事が可能となる。
ただしこれを行うためには、同じ乱数列を使用する暗号文が大量に必要である。
この暗号文を見ると、中核となる部分を先に乱数で暗号化してから、全体をキーワード『REBYATHAN』で再度暗号化していると思われる。
またログという物の性質上、後で復元できなければ意味がないので、都度別の乱数を使用していると、その時に使用した乱数列を各箇所とセットで保有しなければならなくなるが、暗号文と乱数列を一緒に置いておくのは、錠を下ろした扉の横に鍵をぶら下げておくのと同じ事であり、それでは錠を掛ける意味がない。
つまり、この長大なコマンド列の随所に出てくる暗号化部分は、所有者だけが保有する単一の乱数列で暗号化されている可能性が高いので、そういう意味では同じ乱数列を使用する暗号文が大量にあるという条件を満たしていると見なしても良さそうである。
チャチャイはこの半解読文を一般的なコマンドの形式に当てはめて、まだ暗号状態にあると思われる箇所を抽出するマクロを組んだ。
抽出自体は僅か数秒で終わり、その結果を開いて見た。
最短で5バイト、最長で40バイト程度の暗号文が、数百個も得られた。
恐らく短い物はIDかパスワードであり、長い物はアドレスであろう。
この場合は、暗号文は長い方が好ましいのだが、贅沢は言えない。
数がそれなりにあるだけでもましなのである。
ここから後は、一般的なハッキングで良く行われる作業となる。
彼はツールボックスから乱数暗号の解析ツールを選んで、この暗号文を解析に掛けて見た。
現時点で世界最古のコンピュータと見なされているコロッサスは、その雛形といえるボンベと共に第二次大戦時のドイツの暗号機エニグマが使用する乱数列を解析するためにイギリスの数学者アラン・チューリングによって作られた。
つまりこれは、最も正統的なコンピュータの利用法なのである。
その機能は、得られた暗号文を順列組合わせで比較し、その結果を検討して得られた仮想乱数列を全ての暗号文に適用して、仮想の解読結果に不整合があれば再度組合わせを変えて比較して新たな仮想乱数列を探すという物なので、実行にはかなり時間を要する。
取り合えず解析処理が走っている間に、他の探索作業を行う事にした。
春香はチャチャイの後を追うかどうか一瞬躊躇したが、追わずにこのまま解析を見守る事にした。
この半解読文からは、ある臭いが微かに立ち上っていたのだ。
それは母が、絶対に忘れてはならないと念を押してから教えたアイツの臭いの様に思えた。
全体の量が大した物では無いのでそれが発する臭いもごく弱い物だし、偶然の一致という可能性も否定できないが、それでも彼女にとって『ママの言葉』を無視する事は出来なかった。
それは物の例えではなく、彼女の存在意義を否定する行為その物だったのである。
もしかすると初めて目にするアイツの痕跡かもしれない、そう思うと彼女の胸は高鳴った。
春香は、じりじりと焦燥に炙られつつ結果が出るのを待っていた。