D 2
「で。例のあれだ」
鞍内はそう言うと手元のコーヒーを一口飲んだ。
「そう。それだ」
おれも手元のマンデリンを一口飲む。
「あれはやっぱりケンちゃんからケンちゃんへ届いたものだ」
「と、言うと?」
「ヒントは文字化けしてなかったタイトルにあったんだ。そこだけ化けてないのにはなんか理由があるだろうと思って考えてみた。一歩前を行くおれへ、ってことは差出人はそのおれよりも一歩後ろにいる」
鞍内は名探偵なにがしみたいにもったいぶってしゃべりやがる。
「なるほど」
まるでなるほどじゃない。
「それでおれはもう一度もらった文字列を見直した。あのなんて読むかわからないあれだ」
鞍内はそこで言葉を切ったけれどおれには挟むべき相槌もなにもなかったのでそのまま先を待った。鞍内はテレビのクイズ番組みたいに期待がほとんど怒りに変わるほど間を置きやがる。
「貰った文字列の最初の一つが読点だったろ。あれがメールの最後の一行なら頭はスペースじゃないかと考えたんだ。なぜかと言えば。それはケンちゃんがおれにくれるメール。その最後の行の先頭はいつもスペースだからだ。ケンちゃんは最終行で先頭にスペースを一つあけて自分の名前を書いてくる。おれへのメールには澤木とだけ書いてあるけど、その前に必ずスペースが一つある。だからおれはスペースが読点に変換されてるんだと仮定した」
鞍内はまた言葉を切っておれの顔を見る。
「ケンちゃんは文字コードって知ってる?」
「ほとんど知らない。そういうものがあるってことぐらいしか」
「まあごく簡単に言えばコンピュータで文字を扱うための仕組みのこと。そういうのの中に世界中のあらゆる文字を全部共通のコードで表そうっていう動きがあって、それをユニコードって言うんだ」
「ユニコードって言葉は聞いたことがある」
「今回のこのメールはユニコードのコードナンバーをいじってあるんだ」
「コードナンバー?」
「文字コードってのはユニコードに限らずどれでも、符号化っていう意味では同じなんだ。符号化ってのは一つ一つの文字にコード、つまり番号を割り当てるっていうこと。コンピュータは文字を直接扱うわけじゃなくて、文字を符号化したそのコードを扱っているわけ。そのコード化のルールを決めたものが文字コード」
「なるほど。ということは文字を例えばユニコードのルールでコードに変換すればそれはなんかしらの番号になるということ?」
「そう。厳密にはコンピュータで文字を扱えばそれはすでにビット列で、そのビット列を解釈することで人間の読める文字にするんだ。そしてビット列は二進数として解釈できて、二進数ということは数値として扱える。で、ここがポイントなんだけど、数値として扱えるということは演算ができるということなわけ」
「演算?」
「簡単に言えば計算ってこと。例えば四則演算。足し算引き算掛け算割り算。なんでも可能」
「そんなことする意味あるわけ?」
「普通はない。違う字になっちゃうから。でも今回みたいに本来の文字を別の文字にして意味不明なものにする、ということを意図的にやるなら意味はある」
おれはびっくりした。
「で問題の読点。この読点はユニコードで3001というコードになる。書くときは
「それは読点は3001番だってこと?」
「そうじゃない。この3001は十六進数だから十進数にすると12289になる。そして、このメールが一歩後ろから来たことを踏まえて、それを一歩手前に戻すためにここから1を引いてみる。すると12289は12288になって、十六進数の3001は3000になる」
「ふむ」
「ユニコードのU+3000はなんと。聞いて驚けよ。全角のスペースだ」
「なるほど」
「おい。もっと驚け。まあ次の結果を言えばもっと驚くだろうけどな。ケンちゃんが送ってきたあの文字列。読点から始まって読めない字が並んでるあれ。あれを全部ユニコードにして1を引いてみたらどうなったと思う?」
「おれか」
「その通り。全角スペースの後に漢字で澤木健祐」
鞍内はそう言うと手元のコーヒーを口にしてからかばんを取り出してごそごそやり始めた。おれはそれを眺めながら今聞かされたことの意味を考えようとした。考えてもわかりそうにないということだけがわかった。かばんの中を探す鞍内の姿が同じ動作を繰り返すサイクルアニメーションみたいに見えてきて、どこが始まりかな、などということを思っていると鞍内がループを抜けてかばんから何かを取り出した。
「はいこれ」
おれは差し出されたそれを受け取った。それはUSBメモリと呼ばれるタイプの小型のフラッシュメモリだった。
「その中にファイルが2つ入ってる。澤木のPCには
「Pythonってプログラム言語の?」
「そう。なければ入れる必要がある。なに、ネットで調べりゃ簡単だよ」
そう言うと鞍内はまたコーヒーをちょっと口にしてから説明を続けた。
「そこに入ってる2つのファイルのうち1つがPythonのスクリプトで、もう一つはその使い方を書いたテキスト。メールの本文を文字コードUTF-8でテキストファイルにして、そのスクリプトと同じフォルダに入れる。でもってコマンドラインからコマンドを打つんだけど、最後の数値をマイナス1にすれば暗号文を元に戻せる。逆に普通に書いたものを用意して最後の数値を1にすれば普通の文を暗号文にできる。最後の数値がユニコードの値に加算する数値になるんだ。一歩先を行ってる澤木は後ろの澤木に向かって1を足して送信する。後ろの澤木から送られてきたものは1を引けば読めるようになる。1引くってことは当然マイナス1を足すってことだ」
「すごいな。昨日あれから作ったのか、そんなプログラムを」
おれはそう言いながら、鞍内がこの狂った事態を笑い飛ばすこともなく本気で受け止めている事実に驚いていた。鞍内は熱のこもった口調で話し続けている。こいつもだいぶおかしいのかもしれない。
「そんなプログラム自体はどうということはない。中身さえ思いつけば5分で書ける程度のものだよ。一文字ずつコード化して計算して、その結果をまた文字に戻すだけだからな」
「それが簡単なことなのかどうかもおれにはよくわからんけどな。さんきゅ。帰ったらさっそく全文これに通してみるよ」
「なんかすごいな。そのメールの主はさ、きっとプログラマだよ。プログラム自体は初歩的なものだけど発想はちょっとディープだ。どんなやつだろうな。一歩後ろの澤木」
「気狂いだろう」
「それにしたってだいぶ手の込んだ気狂いだぞ。なんて書いてあるんだろうな。そのメール。気になるな。解読したらおれにも教えてくれよ」
「そりゃあまあ教えて差し支えなさそうな話なら教えるよ。解読器作ってもらったしな」
おれは受け取ったUSBメモリを見せて答えた。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます