PR

エニグマ(Enigma)暗号変換器の仕組みとPythonによる実装

Python便利帳
Sponsored

第二次世界大戦でナチス・ドイツにより用いられ、解読困難なことで有名なエニグマ(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ローターの初期値

これらを変更することで、独自の変換器を作ることができます。

もっと知りたいこと、感想を教えてください!