モジュール詳細:アンフェア暗号

フェアにプレイする気はないようだ。

このモジュールには2つのディスプレーがある。上のディスプレーには暗号化されたメッセージが表示されている。LEDの列は現在のステージ数を表している。

右のディスプレーを押すと、白字で表示されるモジュールIDと、赤字で表示されるモジュールが認識したミスの回数の表示で切り替わる。これらはどちらもローマ数字で表示される。

このモジュールにおいて、ミスの回数を参照する場合、必ずこの赤字で表示されたミスの回数を参照する。

モジュールによって暗号化されたメッセージは、3文字の命令を繋げたものである。これは異なるを使ったプレイフェア暗号によって暗号化される。すべての正しい入力を行うとモジュールが解除される。

  • 暗号化の手順は次の通りである: 原文 → 鍵Aによる暗号化 → 鍵Cによる暗号化 → カエサル暗号。これらを逆順に復号すると元の命令を得られる。

鍵A

  1. 最初に、爆弾のシリアルナンバーを参照する。
  2. すべての英字を、その英字のアルファベットでの位置の数字で置き換える(A=1、B=2...)
    • これにより、数字のみで構成された文字列を得る。
    • ただし、最初の文字が英字でそのアルファベットでの位置が20以上である場合、その文字を無視する。
  3. シリアルナンバーの4つ目か5つ目の文字が母音であった場合、最後の数字を取り除く。
    • どちらも母音であった場合でもこの操作は一度しか行われない。
  4. この数字を十六進数に変換する。詳細の方法については、付録:D3K2H3Xを参照する。
  5. 十六進数を、数字と英字で構成された文字列として見る。左から順にみて、すべての数字に以下の操作を行う:
    • その数字の後の文字も数字で、その数字と合わせると10から26の間の数字を構成する場合、その2桁の数字を、アルファベットでの位置がその数字である英字1文字と置き換える。
    • そうでない場合、その1桁の数字をアルファベットでの位置がその数字である英字1文字と置き換える。数字が0である場合、その数字を無視する。
  6. モジュールID、ポートプレートの数、バッテリーホルダーの数を、それぞれアルファベットでの位置がその数字である英字1文字に変換する。ただし、値が0である場合、それを無視する。値が1 ~ 26の範囲外である場合、範囲内になるまで26を足し引きする。
  7. 得られた1~3文字の英字を、これまでの結果の最後に結合する。
  8. これが鍵Aである。

鍵B

以下の表から鍵Bを得る。曜日と月は、爆弾が起動した時間を参照する。

1月2月3月4月5月6月7月8月9月10月11月12月
曜日 ABDAFEVDBHCBLDDBIEAFEFAFCGCQHDEAIFEAAEFABDECC
ABDBFEWDBHDBLEDBIFAFEGAFCHCQIDEAAFEABEFACDECD
ABDCFEXDBHEBLFDBIGAFEHAFCICQADEABFEACEFADDECE
ABDDFEYDBHFBLGDBIHAFEIAFCACQBDEACFEADEFAEDECF
ABDEFEZDBHGBLHDBIIAFEAAFCBCQCDEADFEAEEFAFDED
ABDFFEBGDBHHBLIDBIAAFEBAFCCCQDDEAEFEAFEFBDEDA
ABDGFEBHDBHIBLADBIBAFECAFCDCQEDEAFFETEFBADEDB

鍵C

鍵Bを利用したプレイフェア暗号によって、鍵Aを暗号化する。これが鍵Cである。

詳細の方法については、付録:PL4YF4112 101を参照する。

解法 — ステップ1: カエサル暗号

条件 操作
ポートの種類1つにつき - 2
ポートプレート1つにつき + 1
シリアルナンバーの子音1つにつき + 1
シリアルナンバーの母音1つにつき - 2
点灯したインジケーター1つにつき + 2
点灯していないインジケーター1つにつき - 2
バッテリー1つにつき - 1
バッテリーがない場合 + 10
ポートがない場合 × 2
モジュールの数が31以上である場合 ÷ 2

カエサル暗号のオフセットを計算する。0から開始し、上記の表のうち満たす条件の操作を上から順に適用する。

除算については、あまりを無視する。例: 除算の結果が-1.5である場合、-1を利用する

暗号文を復号するには、オフセットが負であるならば、画面に表示された文字をそれぞれその数だけ前に進める。反対に、オフセットが正であるならば、文字をそれぞれその数だけ後ろに戻す。Aから後ろに戻す場合はZになり、反対にZから前に進める場合はAになる。

解法 — ステップ2: プレイフェア暗号

ステップ1で復号された暗号を、鍵Cを使ったプレイフェア暗号で復号する。

この操作をさらに、鍵Aを使ったプレイフェア暗号で繰り返す。

ここで得られた文字列が原文である。

解法 — ステップ3: 命令の実行

メッセージには4つの命令がある。左から右の順に命令を実行する。

小さいディスプレーを押すことで、モジュールIDとミスの回数の表示で切り替えられる。ミスの回数は赤で表示される。どちらもローマ数字で表記されている。

命令:

「%」は剰余算 (左の数を右の数で割った時のあまり)を示している。
内心とは、中心にある白い円を表す。
外心とは、色のついたボタンの外にある、灰色の三角形状の枠を示す。
素数のリストについては、付録:PR1M3を参照する。

  • PCR: 赤のボタンを押す。
  • PCG: 緑のボタンを押す。
  • PCB: 青のボタンを押す。
  • SUB: タイマーの秒を表す2つの数字が一致する時に、外心を押す。
  • MIT: タイマーの秒数の一の位が(m + c + s) % 10と一致するときに、内心を押す。ただし、mはモジュールID、cは最後にミスが記録されたとき(ミスが記録されていない場合は初期状態)から色のついた(赤、緑、青のいずれか)ボタンが押された回数、sは現在のステージ(1から開始)の番号を表す。
  • PRN: モジュールID % 20が素数である場合、内心を押す。そうでない場合、外心を押す。
  • CHK: モジュールID % 20が素数である場合、外心を押す。そうでない場合、内心を押す。
  • BOB: 内心を押す。
    • 点灯したBOBのインジケーターが爆弾の唯一のインジケーターで、バッテリーがちょうど二つある場合、これを押すと即座にモジュールが解除される
  • REPまたはEAT: 最後の命令を繰り返す。これが最初の命令である場合、内心を押す。
  • STRまたはIKE: のボタンを0個目として、色のついたボタンを時計回りに記録されたミスの回数分だけ数え、その位置のボタンを押す。
    • これらの手順におけるミスの回数は、モジュールにある小さいディスプレーに表示される認識されたミスの回数を参照する。
十進数 十六進数
0 - 9 0 - 9
10 A
11 B
12 C
13 D
14 E
15 F
16 10
26 1A
... ...

付録:D3K2H3X

以下のステップを参照して整数を十六進数に変換する

  1. 数字を16で割り、その商と余剰を計算する。
  2. 以下のテーブルを利用して、余剰を十六進数で利用される数字に変換する。
  3. 同様のステップを、商を新しい数字として繰り返す。これを余剰が0になるまで行う。
  4. 得られた十六進数で利用される数字の列の順番を逆転させる。
  5. 先頭に0がある場合、それらを消す。

付録:PR1M3

  • 素数(20以下): 2, 3, 5, 7, 11, 13, 17, 19

付録:PL4YF4112 101

  • 次の手順により、5×5の英字からなる行列を作成する。まずの英字を左上から読み順に埋め、残りの使われていないアルファベットをアルファベット順で埋める。全ての英字は、一度しか行列に利用することができないため、1回目の出現時のみ行列を埋める。「J」と「I」は同一の英字として扱う。
  • 以下の手順で(D)と書かれた手順は復号するときのみ適用し、(E)と書かれた手順は暗号化するときのみ適用する。
  • メッセージを2文字ずつのペアに分ける。メッセージが奇数個である場合、メッセージの最後に「X」を付け足す。ペアの文字が同じである場合、二つ目の文字を「X」に変換する。それぞれのペアについて:
    • 文字が行列の同じ行に出現する場合、それぞれの文字を(D)/(E)に隣接する文字に変換する。その位置に文字が存在しない場合は、反対側の列にループする。
    • 文字が行列の同じ列に出現する場合、それぞれの文字を(D)/(E)に隣接する文字に変換する。その位置に文字が存在しない場合は、反対側の行にループする。
    • 文字が行列の異なる行・列に出現する場合、それぞれの文字を同じ行で、もう片方の文字の列にある文字に変換する。
  • 必要があれば、「X」をペアのもう片方の文字に置き換えるか削除し、「I」を「J」に置き換える。