モジュール詳細:アンフェアの逆襲

2ヶ月の制作期間は、多大な反発という結果に終わった。更なる1ヶ月の制作期間はこれ以上の被害を増やさないためのものだ。これはこれ以上なく不公平アンフェアだ。

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

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

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

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

すべての暗号において「アルファベットでの位置」を参照する場合は、特に指定のない限りA1Z26を利用する。

  • 暗号化の手順は次の通りである: 原文 → プレイフェア暗号 → アフィン暗号 → カエサル暗号 → ピッグペン暗号。これらを逆順に復号すると元の命令を得られる。

鍵A

  1. 最初に、爆弾のシリアルナンバー最初の3文字を参照する。
  2. この文字列を三十六進数の数字として解釈する。
    • 三十六進数に含まれない数字が存在する場合、その文字を「I」として扱う。
  3. この数字を十進数に変換する。詳細の方法については、付録:三十六進数からの変換を参照する。これによって得られた数字は、後に得られる結果の先頭に結合される。
  4. 次に、爆弾のシリアルナンバー最後の3文字を参照し、英字をアルファベットでの位置の数字で置き換える(A=1、B=2...)。
    • これにより、数字のみで構成された文字列を得る。
  5. 三十六進数の変換によって得られた数字の最後に、この数字を結合する。
  6. この数字を十六進数に変換する。詳細の方法については、付録:D3K2H3Xを参照する。
  1. 十六進数を、数字と英字で構成された文字列として見る。左から順にみて、すべての数字に以下の操作を行う:
    • その数字の後の文字も数字で、その数字と合わせると10から26の間の数字を構成する場合、その2桁の数字を、アルファベットでの位置がその数字である英字1文字と置き換える。
    • そうでない場合、その1桁の数字をアルファベットでの位置がその数字である英字1文字と置き換える。数字が0である場合、その数字を無視する。
  2. モジュールID、ポートプレートの数、バッテリーホルダーの数を、それぞれアルファベットでの位置がその数字である英字1文字に変換する。ただし、値が0である場合や数字が26より大きい場合は、ステップ7の手順によって変換する。
  3. 得られた英字を、これまでの結果の最後に結合する。
  4. これが鍵Aである。

鍵B

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

1月2月3月4月5月6月7月8月9月10月11月12月
曜日 ABDA FEV DBHC AEI DBIE PLAY AFCG ONE DEAI ALPH EFAB DECC
ABDB FEW DBHD OUY DBIF HIDE AFCH TWO DEAA BETA EFAC DECD
ABDC FEX DBHE WBC DBIG SECR AFCI THRE DEAB CHAR EFAD DECE
ABDD FEY DBHF DFG DBIH CIPH AFCA FOUR DEAC DELT EFAE DECF
ABDE FEZ DBHG HJK DBII FAIL AFCB FIVE DEAD ECHO EFAF DED
ABDF FEBG DBHH LMN DBIA PART AFCC SIX DEAE FOXT EFB DEDA
ABDG FEBH DBHI PQR DBIB BECO AFCD SEVN DEAF GOLF EFBA DEDB

鍵C

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

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

解法 — ステップ1: ピッグペン暗号

以下の図を利用して、上のディスプレーに表示された記号を英字に変換する。

A pigpen encryption table would be shown here.

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

条件 操作
ポートの種類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になる。

解法 — ステップ3: アフィン暗号

条件 操作
「BOB」「CAR」「CLR」のインジケーター1つにつき: 点灯していれば+1、点灯していなければ-1
「FRK」「FRQ」「MSA」「NSA」のインジケーター1つにつき: 点灯していれば+2、点灯していなければ-2
「SIG」「SND」「TRN」のインジケーター1つにつき: 点灯していれば+3、点灯していなければ-3
バッテリー: 奇数ならば+4、偶数ならば-4
パラレルポートがあるポートプレートが存在する: 1つに付き+5、シリアルポートと同じポートプレートにあるならば-4
DVI-Dポートがあるポートプレートが存在する: 1つに付き-5、ステレオRCAポートと同じポートプレートにあるならば+4

上記の表を利用して、アフィン暗号で利用するオフセットを計算する。0から開始して、条件に当てはまる段の操作を全て適用する。オフセットが負である場合、その絶対値を利用する。この数字はこのステップにおいて「X」と表される。

メッセージのそれぞれの文字について:

  • その文字のアルファベットでの位置の数に(2X+1)を乗算する。
  • 1から26の範囲の数になるまで、26を繰り返し引く。
  • これが暗号化された文字のアルファベットでの位置の数である。

復号するには、暗号化された文字のアルファベットでの位置に、その数が(2X+1)で割り切れるまで26を繰り返し足す。その数を(2X+1)で割った時の値が復号した文字のアルファベットでの位置である。

ただし、Xが整数nを使って13n+6の形で表すことができる場合、代わりにアトバシュ暗号を利用する。アトバシュ暗号の暗号化/復号方法については、次の章で説明する。

必要であれば、以下の表を利用してアフィン暗号を復号しても良い。Xの値に応じて、上からX+1番目の段を利用する。1番目の段は同時に暗号化前の文字を示している。

アフィン暗号変換表
ABCDEFGHIJKLM NOPQRSTUVWXYZ
CFILORUXADGJM PSVYBEHKNQTWZ
EJOTYDINSXCHM RWBGLQVAFKPUZ
GNUBIPWDKRYFM TAHOVCJQXELSZ
IRAJSBKTCLUDM VENWFOXGPYHQZ
KVGRCNYJUFQBM XITEPALWHSDOZ
X = 6の場合、暗号を復号することはできない。
ODSHWLAPETIXM BQFUJYNCRGVKZ
QHYPGXOFWNEVM DULCTKBSJARIZ
SLEXQJCVOHATM FYRKDWPIBUNGZ
UPKFAVQLGBWRM HCXSNIDYTOJEZ
WTQNKHEBYVSPM JGDAXUROLIFCZ
YXWVUTSRQPONM LKJIHGFEDCBAZ

解法 — ステップ3A: アトバシュ暗号

ステップ3において、Xが整数nを使って13n+6の形で表すことができない場合は、このステップを利用しない。

暗号化するメッセージにおいて、それぞれの文字をアルファベットの位置が(27-P)である文字に置き換える。ただし、Pは暗号化する文字のアルファベットでの位置である。

復号するには、それぞれの文字をアルファベットの位置が(27-E)である文字に置き換える。ただし、Eは復号する文字のアルファベットでの位置である。

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

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

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

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

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

メッセージは4つの命令からなる。それぞれの命令を左から順に実行する。

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

命令:

「%」は剰余算 (左の数を右の数で割った時のあまり)を示している。

内心とは、中心にある白い円を表す。

外心とは、色のついたボタンの外にある、灰色の円形の枠を示す。

色のついたボタンは常に同じ順番で配置されている。左上から時計回りに、赤、黄、緑、シアン、青、マゼンタの順である。

素数のリストについては、付録:PR1M3を参照する。

  • PCR: 赤のボタンを押す。
  • PCG: 緑のボタンを押す。
  • PCB: 青のボタンを押す。
  • SCC: シアンのボタンを押す。
  • SCM: マゼンタのボタンを押す。
  • SCY: 黄のボタンを押す。
  • SUB: タイマーの秒を表す2つの数字が一致する時に、外心を押す。
  • MIT: タイマーの秒数の一の位が(m + c + s) % 10と一致するときに、内心を押す。ただし、mはモジュールID、cは最後にミスが記録されたとき(ミスが記録されていない場合は初期状態)から色のついた(赤、緑、青、シアン、マゼンタ、黄のいずれか)ボタンが押された回数、sは現在のステージ(1から開始)の番号を表す。
  • PRN: モジュールID % 20が素数である場合、内心を押す。そうでない場合、外心を押す。
  • CHK: モジュールID % 20が素数である場合、外心を押す。そうでない場合、内心を押す。
  • BOB: 内心を押す。
    • 点灯したBOBのインジケーターが爆弾の唯一のインジケーターで、バッテリーホルダーがちょうど2つかつバッテリーがちょうど4つある場合、これを押すと即座にモジュールが解除される
  • REPまたはEAT: 最後の入力を繰り返す。これが最初の命令である場合、内心を押す。時間による制約は無視しても良い。
  • STRまたはIKE: のボタンを0個目として、色のついたボタンを時計回りに記録されたミスの回数分だけ数え、その位置のボタンを押す。
    • これらの手順におけるミスの回数は、モジュールにある小さいディスプレーに表示される認識されたミスの回数を参照する。
  • SIG: 内心を押す。この命令が最後の命令ではなく、次の命令をスキップすることができる場合、さらにシアンのボタンを押して次の命令をスキップする。そうでない場合、内心のみを押す。
  • PVPまたはNXP: 最後に押した色のついたボタンから開始する。(まだ一度も色のついたボタンを押していない場合は左上から開始する。)そのボタンから、反時計回り(PVP)/時計回り(NXP)に数えて、最初の原色(赤、緑、青)のボタンを押す。
  • PVSまたはNXS: 最後に押した色のついたボタンから開始する。(まだ一度も色のついたボタンを押していない場合は左上から開始する。)そのボタンから、反時計回り(PVS)/時計回り(NXS)に数えて、最初の二次色(シアン、マゼンタ、黄)のボタンを押す。
  • OPP: 最後に押したボタンと直径方向に正反対の位置のボタンを押す。最後に押したボタンが外心である場合、内心を押し、内心である場合、外心を押す。これが最初の命令である場合、外心を押す。
三十六進数 十進数 三十六進数 十進数
0 - 90 - 9O24
A10P25
B11Q26
C12R27
D13S28
E14T29
F15U30
G16V31
H17W32
I18X33
J19Y34
K20Z35
L211036
M221137
N23......

付録:三十六進数からの変換

右の表は三十六進数と十進数変換の早見表である。以下のステップを参照して整数を十六進数に変換する。

  1. 一番左の桁から、初期値0で開始する。
  2. 現在の桁の三十六進数での値を加算する。
  3. これが最後の桁でなければ、数字に36を掛け、次の桁に移動する。
  4. 全ての桁についてステップ2、3を繰り返す。
  5. 得られた結果が十進数の数字である。
十進数 十六進数
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」に置き換える。