モジュール詳細:赤色ハフマン暗号

最も低効率な暗号は、そもそも実用的ではなかったのだ。

モジュールは、3つのディスプレー、キーボード、左右の矢印、及び「#/Y」の形式で現在のページを表示するボタン(送信ボタン)で構成されている。Yはページの総数である。

矢印を使用してページを移動することができる。最後のページと最初のページは、ループする。ページ数は単語生成に使用された二進数の長さによって変化する。平均ページ数は2ページである。

モジュールを解除するには、以下の3ステップに従って単語を復号する。復号された単語を取得したら、キーボードを使用して入力する。入力を開始すると、ディスプレーが空白になり、下のディスプレーに現在入力されている内容が表示される。

入力を消去するには、いずれかの矢印をクリックする。
入力に問題がなければ、「SUB」と書かれたボタンを押して、回答を送信する。 ミスが記録された場合、モジュールの最初のページに戻るが、暗号の再生成はされない。

ステップ1:二分探索

文字バイナリ文字バイナリ文字バイナリ文字バイナリ文字バイナリ文字バイナリ文字バイナリ文字バイナリ
A0000 B0001 C0010 D0011 E0100 F0101 G0110 H0111
I1000 J1001 K1010 L1011 M1100 N1101 O1110 P1111
Q00 R01 S10 T11 U0 V1

各ページには、元のメッセージの変換に使用される最大18個の文字が含まれている。ページの情報を読み順に使用し、一つの長い文字列を作成する。表示されたこれらの文字をバイナリの部品に変換し、一つの長いバイナリ文字列を作成する。これは、後の2ステップで使用する。

ステップ2:ハフマン木の構築

取得したバイナリ文字列を使用し、26個の葉を取得するまで、以下の手順を繰り返す。葉とは、ハフマン木の末端にある節のことである。各桁は左から右に一度だけ読み取られ、戻ることはない。

  1. 「0」と「1」の葉から開始する。
  2. バイナリの桁を、バイナリ文字列内の先頭にある一つの節に出会うまで読み続ける。
  3. その情報を部分的なバイナリ文字列として分離させ、バイナリ文字列から始まりそれぞれ「0」と「1」で終わるような2つの項目に変更する。分割の際、葉の順序は維持すること。
  4. 上記の2ステップを繰り返す。

例 - 赤色ハフマン暗号用の木の構築

先頭8桁のみを示す。
初期バイナリ文字列: 0111100000110101
[0]111100000110101

[0][1]

1回目の分離後のバイナリ文字列: 111100000110101
[1]11100000110101

[00][01][1]

2回目の分離後のバイナリ文字列: 11100000110101
[11]100000110101

[00][01][10][11]

3回目の分離後のバイナリ文字列: 100000110101
[10]0000110101

[00][01][10][110][111]

4回目の分離後のバイナリ文字列: 0000110101
[00]00110101

[00][01][100][101][110][111]

5回目の分離後のバイナリ文字列: 00110101
[001]10101

[000][001][01][100][101][110][111]

6回目の分離後のバイナリ文字列: 10101
[101]01

[000][0010][0011][01][100][101][110][111]

7回目の分離後のバイナリ文字列: 01

[000][0010][0011][01][100][1010][1011][110][111]

8回目の分離後の葉:

[000][0010][0011][010][011][100][1010][1011][110][111]

ステップ3:ハフマン木の読み取り

ハフマン木のそれぞれの葉に、0から始まる葉を優先してアルファベットを割り当てる。

バイナリの桁を、残りのバイナリ文字列内の先頭にある一つの葉に出会うまで読み続ける。この英字を記録し、そのバイナリをバイナリ文字列から切り離す。これを、バイナリ文字列を使い切るまで繰り返す。 順番に取得した英字が、復号された単語になる。

例 — 赤色ハフマン暗号バイナリの読み取り

この例では、アルファベット26文字の代わりに文字列「BLACKSMITH」を使用し、4文字を読み取る。

初期の残ったバイナリ文字列:1001011010011

[000][0010][0011][010][011][100][1010][1011][110][111]
BLACKSMITH

“100”, S
1文字目読み取り後のバイナリ文字列:1011010011

[000][0010][0011][010][011][100][1010][1011][110][111]
BLACKSMITH

“1011”, I
2文字目読み取り後のバイナリ文字列:010011

[000][0010][0011][010][011][100][1010][1011][110][111]
BLACKSMITH

“010”, C
3文字目読み取り後のバイナリ文字列:011

[000][0010][0011][010][011][100][1010][1011][110][111]
BLACKSMITH

“011”, K
復号された単語:SICK