第二次世界大戦でナチス・ドイツにより用いられ、解読困難なことで有名なエニグマ(Enigma)暗号変換器をPythonで再現しました。
この記事では、エニグマ暗号について簡単に紹介し、Pythonコードを用いて暗号変換を行う方法を解説します。
エニグマ暗号の原理
エニグマ暗号では、入力された文字の情報が3つのローターを経由し、出力暗号として出力されます。
そしてこのローターは出力ごとに回転するため、同じ文字を入力しても、毎回異なる文字が出力されます。
つまり入力と出力が1対1で対応していないため、解読が非常に難しくなります。
さらに、たとえ暗号変換の原理を理解していたとしても、26の3乗(17,576)通りのローターの初期設定がわからなければ解読することができません。
エニグマ暗号器の図解は、以下のカラパイアの記事を参照してください。
ちなみに、実際の暗号解読ではドイツ軍の通信の冒頭には、常に「ヒトラー万歳」の文字列が含まれていることに注目し、ローターの設定を見破ったそうです。
エニグマ暗号変換器のPythonコード
enigma.pyの設置
プログラムを使用するためには、作業用フォルダに記事末のコードをenigma.py
として設置します。
その後、コマンドプロンプトで作業用フォルダに移動してください。
作業用フォルダとしてデスクトップ下のenigma
フォルダを使用する場合、cd
コマンドで以下のように入力します。
...>cd desktop/enigma
.../Desktop/enigma>
enigma.pyの起動
enigma.py
を起動する際は、
python enigma.py pack/unpack 文字列
のようにコマンドプロンプトに入力します。
引数にpack
を指定すると文字列から暗号文を作成し、unpack
を指定すると暗号文から元の文字列を表示します。
なお、文字列はアルファベットにのみ対応しており、スペース等は使えません。
使用例
文字列AABB
を暗号文に変換します。
.../Desktop/enigma>python enigma.py pack AABB
YEVT
ここで出力された暗号文YEVT
を復元します。
.../Desktop/enigma>python enigma.py unpack YEVT
AABB
enigma.pyの設定
プログラム中で、以下の変数を設定することができます。
変数名 | 意味 |
---|---|
hand (1,2) | 第1・第2ローターの針の位置。ここを越えると上位ローターが回転する |
rot_state (1,2,3) | 文字を変換する組み合わせを生成するための乱数シード |
chr (1,2,3) | 第1・第2・第3ローターの初期値 |
これらを変更することで、独自の変換器を作ることができます。
もっと知りたいこと、感想を教えてください!