三崎律日/Alt F4さんの動画シリーズ「世界の奇書をゆっくり解説」の今回のネタは「Liber Primus」だ。と言うか、「Liber Primus」という本?の登場までの経過(「Cicada3301」によるネット上の騒ぎ)の紹介が実はメインストーリーだ。だが当然のように暗号解読や素数の具体的な話が何度も出てくるし、個々のエピソードを深掘り気味に取り扱っているので、1回の視聴で騒ぎの全体像を把握するのはなかなかに難しいと感じた。
ちなみに私が「Cicada3301」に関する話を知ったのは、ゆっくりまっちゃさんの動画「【ゆっくり解説】インターネット上最大の謎『cicada3301』について語るぜ」のおかげだ。上記の「暗号解読や素数の話?」となった人はこちらの動画を先に観て、騒ぎの流れ全体をコンパクトに押さえておくのも良いかと思う。
さて、今回の動画の最後近く、三崎律日/Alt F4さんは視聴者に「暗号」を出した。40桁の数字である。視聴者への挑戦と言うよりもサービスという感じだ。当然、解読に挑戦した。
結果から言うと、約30分で解くことができた。ただし解読の最後のステップは自力では乗り越えられず、私よりも更に30分程度早く解読した人(つまり私の着手時には解いていた・・・)の動画へのコメントに助けられた。コメントを一見して「あ!」となったときの感覚は独特のものだ。
動画のコメントを追い、ネットで情報を拾っていけば解読はできるだろうが、やはり「知っていることが多い」人の方が解読には有利だ。解読の流れは大まかに以下のようになる。
- 40桁の暗号数字列を4桁毎に分ける。4桁の数字は動画の再生時間を表しており、前の2桁が分、後ろの2桁が秒となる。10点の時間が順番通りに並んでいるのは解読者へのサービスだろう。6を超える数字が少ないことから時間の可能性を類推し易いとは思うが、時間(4桁の数字)の並びが入れ替えられているとそれに気づきにくくなるのは間違いない。
- 10点の時間にはそれぞれ画面内に4文字のアルファベット列が表示されるので、これらをメモした。ここで私が幸運だったのは、4文字のアルファベット列がBase64でエンコードされた文字列の可能性にメモを一瞥して気づいたことだ。20世紀にSJISにしか対応していない(海外からのメールは確実に化ける)困ったメーラーを使う組織に属していたことがあり、海外とのやり取りにBase64でエンコードしたテキストを使うことが多かったからだ。つまり、要らん苦労の所為でBase64でエンコードされた文字列を見慣れていた訳だ。
デコード前文字列:azE1eTBuMDUzazQxNWgxXzJfazRuazB1azN0dDMx - ウェブ上のツールを使ってBase64テキストをデコードした。が、一見意味があるような文字列にならなかった。分かったことは、数字の2が独立して現れる("_2_")こと、一見「カ〇〇ウ」とローマ字読みできそうな文字列があることだ(アンダースコア"_"を根拠無く『空白、ブランク、スペース』と解釈したのも単なる幸運だ)。そこで上記の「私よりも更に30分程度早く解読した人」のコメント中の"leet"と言う単語に気づいた。その次の瞬間には文字列は読め、解読成功を確信した。スッと読めたのは、三崎律日/Alt F4さんが既に自著を出版していることを知っていたことが大きい。
私の解読結果(白文字):奇書の世界史 2 刊行決定 (k15y0n053k415h1_2_k4nk0uk3tt31)
と言うような流れで暗号解読に成功した訳だが、幸運はBase64を使った経験と三崎律日/Alt F4さんの活動についてちょっとした情報を知っていたこと、そして"Leet"と言われればそれが何かが分かるぐらいの知識があったことだろう。逆に「Base64って何?」「Leetって何?」では遠回りが避けられず、解くことをあきらめた可能性が高かったろう。
ちょっと話がずれるが、古代文字の解読にはその文字が記述している言語が分かっていることが重要だ。エジプトのヒエログリフ(古代エジプト文字の一書体)を解読したシャンポリオンは言語の天才でもあり、ヒエログリフが記述していた古代コプト語に関する知識があったらしい。マヤ文字の解読も、古代マヤ語の直系の可能性が高い方言が特定されてから加速した。ちなみにエジプト文字もマヤ文字も表音文字である。私は「解読結果として得られるものはローマ字表記の日本語だろう」と仮定して解読に着手した訳だが、それ故に"Leet"に思い至れなかったとも言える。
解読結果をある程度予測できていれば、厳密な解読でなくても良ければ"Leet"は解読に不要だ。これは"Leet"を使わないと言うことではなく、「一般的な"Leet"が使われていることを意識しないまま、"Leet"を使ってしまう」と言うことだ。この場合、"Leet"は一種の換字暗号として取り使われていることになる。ちなみに"Leet"は「見た目が近い別の文字(または文字列)に置き換えるもの」なので、上記の通り「一見『カ〇〇ウ』とローマ字読みできそうな文字列がある」なんてことが当たり前に起こる。|V|とタイプしても人の目ならMに見えなくもないでしょ?だから暗号としては弱い。でもコンピュータにとってはそうじゃないところがミソだ。
上述の通り"_2_"と「カンコウ」が見つかれば、「あぁ、あの本の第2巻/集が刊行されるのか」という推測は十分できる。これは三崎律日/Alt F4さんが自著の出版歴を持つこと、その本が動画と関係あることを私が知っているからだ。ならば探すべきは第1巻/集の書名である「奇書の世界史」、換言すればk、i、s、y、o、n、e、a(ヘボン式なら更にh)がどの文字に置き換えられているかを特定することだ。「カンコウ」がもしその通りならば、kとnとuはそのまま、aは4、oは0、までの変換ルールが得られたことになり、焦点は、sは5、iは1、eは3、yとhはそのまま、の変換ルールで良いのかと言う点に集約される。何故ならこれらルールに従えば、得られている文字列の先頭が「kisyonosekaishi_2」となるからだ。更に、tはそのまま、の変換ルールを加えれば、全文が意味ある文章として読める。この一連の流れは、第二次世界大戦中に英国がドイツのエニグマ暗号の解読キー(厳密には暗号化ローターの初期設定。毎日変更される)を総当り法で解く際に、例えば通信文の最後に高確率で「ハイル・ヒトラー」という文字列が入っていることを利用して解読を効率化したことにも似ている。
ただ、これら文字変換ルールが正しい保証が全くない。少なくとも既存のルールに従ったものでなければ、他者も同じ結果を得る保証にならない。そこで"Leet"だ。"Leet"は規格化されたりといった「唯一の変換ルール群」ではないが、「広く使われている変換ルール群」と言う意味で標準化されていると言える(デファクトスタンダートってやつだ)。だから、文字列を大文字に変換した上で、Wikipediaに掲載されている"Leet"の変換表との齟齬が無ければ良いこととした。
なお、"Leet"の文字変換は基本的に1対1ではない。だから、原文中で同じ文字でも"Leet"適用時にはそれぞれ別の文字に変換しても良い。解かれたくない場合は特にそうだ。でもそうしていないあたりが、この暗号が動画視聴者へのサービスであるひとつの証左と言えよう。
ただ、大文字も当然扱えるBase64のデコード結果が小文字と数字の文字列なのに、基本的には大文字表記を対象とする"Leet"(例えば、4はAにはまぁ見た目近いがaにはほど遠い)を適用させるってあたりはちょっと意地悪な一捻りとは言えるかも。まぁ、大文字だとほとんど見た目で読めちゃうのが"Leet"だからねぇ。
本日の成果はこの暗号解読です、うむ~。とか言いつつ、この解読が間違っていたらどうしましょうかね。