エニグマ暗号機作ってみた

Javaエニグマ暗号機作ってみました
参考にしたのはサイモン・シン著「暗号解読」です

エニグマ暗号とはなにかというと、暗号の発祥から話さなければならないのですが、
文章力がないので流れを書くと
アルファベットを数文字ずらすシーザー暗号(abc⇒BCD)やカーマスートラに記述されている暗号(用意されたアルファベット二文字のペアでお互い入れ替える)などの換字式暗号

シーザー暗号で何文字ずらすかを一文字ごとに指定するヴィジュネル暗号

これらの暗号化法を合わせて機械化したものがエニグマ暗号

といった感じです
実際の構造は
スクランブラー(リングに26個の入力端子と26個の出力端子があって、あみだくじのように違う場所の出力端子から出てくる仕掛け)が3つ、
リフレクター(あみだくじを逆にたどると元に戻れる原理で、出力を別の出力につないで入力に戻す仕掛け)、
プラグボード(ユーザーが自由にアルファベットを入れ替えられる仕掛け)、
キーボード(入力)、
ランプ(出力。暗号化された文字のランプが光る)
からなっていて、文字を一つ打つごとにスクランブラーがひとめもり回ります(車のメーターのように)
イメージはこんな感じ

緑の枠がスクランブラーで一文字ごとに一番下のが回り、一周すると上のも回ります


こういう複数の機構をもったものをプログラムで再現する時クラスが大活躍ですね
実際、今回Alphabets、Ring(スクランブラー)、Reflecter(リフレクター)、Ringset(RingとReflecterからなるいわばエニグマ)、Enigma(上記のクラスは数字を変換しているのでそれにアルファベットをあてはめる)といったクラスを作りました

このソフトを作る上で勉強になったことをぼちぼち上げて行こうと思います