A00000
B00001
C00010
D00011
E00100
F00101
G00110
H00111
I01000
J01001
K01010
L01011
M01100
N01101
O01110
P01111
Q10000
R10001
S10010
T10011
U1010
V1011
W1100
X1101
Y1110
Z1111

モジュール詳細:算術暗号

ソフトウェア特許に死を!

モジュールは、3つのディスプレー、キーボード、2つの矢印、及び現在のページを表示するボタン(送信ボタン)で構成されている。

右の矢印を押すと、次のページに移動できる。左の矢印を押すと前のページに移動できる。ページは全部で2ページある。

モジュールを解除するには、以下のルールに従って単語を解読する。復号された単語を取得したら、それを送信する。入力を開始すると、全てのディスプレーが暗転し下のディスプレーに入力された文字が表示される。

入力を消去するには、いずれかの矢印をクリックする。

入力に問題がなければ、「SUB」と書かれたボタンを押して、回答を送信する。

ステップ1:暗号化二進法探索

このステップでは、1ページの上のディスプレーの英字を使用する。各英字を左から順に右の表のバイナリコードに置き換え、変換された英字を二進数に変換する。

これをバイナリ・ストリームと呼ぶ。各ビットは左から順番に取り除かれる。

ステップ2:度数探索

1ページの真ん中と下のディスプレー、そして2ページの3つすべてのディスプレー(数字は無視)上の英字を順に連結させる。各英字をアルファベット上の位置の数字に変換し、1~26の範囲の数字を27個取得する。先頭26文字に対してA~Zの英字、最後の文字には「EOF」を割り当てる。これらの数字は度数を示す。

各要素に対して累積度数も求める必要がある。ラベルAは0、BはAの度数、CはA+Bの度数、……と続き、EOFに対してはA-Zすべての度数の和を与える。

最後に、合計の値を求める。これは、 すべての度数の和(つまり、EOFの累積度数に自身の度数を足した値)である。この値は確認用に最後のディスプレーに表示される。

ステップ3:算術復号

このプロセス内では、3つの20ビットの値が関係する。

  • — 1048575(二進数で11111111111111111111)から始まる。
  • — 0(二進数で00000000000000000000)から始まる。
  • コード — バイナリ・ストリームから最初の20ビットを取り出した値から始まる。

以下のステップを繰り返し実行する。

  • 以下の式の割り算はすべて整数の割り算(切り捨て)である。
  • ((コード - 低 + 1) * 合計 - 1) / (高 - 低 + 1)を求める。
  • EOFの累積度数≤この値の場合、終了する。
  • そうでない場合、その累積度数≤この値となる最も末尾の文字を見つける。
  • この英字を回答の単語の文字として追加する。
  • の新たな値を、以下のようにして求める。
    • 高 = (前の高 - 前の低 + 1) * (v + f) / 合計 + 前の低 - 1
    • 低 = (前の高 - 前の低 + 1) * v / 合計 + 前の低
    vは変換した英字の累積度数、fはその英字の度数である。
  • コードを20桁の二進数に変換し(必要に応じて先頭にゼロを付ける)、以下の手順に従って調整する。
    • 左端から順に、最も左にあるが等しくなっている(以下の赤印)ビットを削除する。連続している場合は、まとめて削除する。
    • 削除した列の次の列から、最も左にあるが0かつが1である(以下の青印)であるビットを削除する。連続している場合は、まとめて削除する。
    • 「1」のビットのみを用いての右端を埋めて、20ビットに戻す。
    • 「0」のビットのみを用いての右端を埋めて、20ビットに戻す。
    • バイナリ・ストリームから必要な分ビットを取り出し、それを用いてコードの右端を埋めて、20ビットに戻す。バイナリ・ストリームを使い切った場合、「1」のビットを使用する。
0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 0 0 コード . . . . . . . . .