はやし雑記

はやしです

みんなReactになったからエニグマ暗号を実装してみた

そしてみんなReactになった

小学生の頃、親に「みんな○○」みたいな事を言うと、みんなじゃないでしょ!って言われたけど、未だに言ってしまうので多分一生治らない

令和になり、みんなReactをやってる(多分平成から、知らんけど)

iOSアプリもネイテイブじゃなくてReactNativeで作ってるみたいな話をよく聞く

なんかReactNative万歳みたいな世の中で、Nativeのほうが好きな私は生きづらい でも批判するにも知識が必要なので、まずはReactを触ってみることにした

話は飛んで、ベネディクト・カンバーバッチについて

ベネディクト・カンバーバッチ、最近良く映画とかで見ますよね

皆さんはベネディクト・カンバーバッチといえばなんのイメージですか?

ピーター?(裏切りのサーカス)カーン?(スタートレック)ドクター・ストレンジ?(ドクター・ストレンジ)アラン・チューリング?(イミテーションゲーム)

私は断然シャーロック(シャーロックっていうドラマ)です

先日久しぶりにイミテーションゲームを観ました

「イミテーション・ゲーム/エニグマと天才数学者の秘密」という映画は、数学者アラン・チューリングが第二次世界大戦中にエニグマ暗号の解読を頑張る、という内容です。

エニグマ暗号とは、ナチス・ドイツが用いていた暗号のことで、主人公のアラン・チューリングはコンピューターの誕生に重要な役割を果たした人です

劇中では登場人物の皆が暗号解読に苦労していて、実際にどんな暗号だったのか気になったので、調べて実装してみることにしました

あと、今回始めてたいぷすくりぷとなるものを使ってみた

エニグマの仕組み

むつかしー

ローターと反転ローターについて

ローター

ローターとは、入力された文字を他の文字に変換する機構 エニグマのローターは、文字入力の度に回転する つまり、AAAとい文字を入力してもEKMのように、毎回変換される文字が変わる

例えば、初期位置が

In  | ABCDEFGHIJKLMNOPQRSTUVWXYZ
Out | EKMFLGDQVZNTOWYHXUSPAIBRCJ

という対応になっているローターがあるとする Inは入力される文字で、Outは出力される文字

ローター内部の配線によって、AEが対応し、ELと対応している

次に、ローターを1文字ぶん回転させると、入力に対する出力が変化する

In  | ABCDEFGHIJKLMNOPQRSTUVWXYZ
Out | KMFLGDQVZNTOWYHXUSPAIBRCJE

Outが1つずれて、今度はAKが対応し、EGと対応するようになる

可動式のローター1枚の場合、In/Outの対応が既知であれば暗号化の方法は  26 通り ローターのIn/Outの対応が未知であれば、対応の組み合わせは  26!\sim4\times10 ^ {26} となる

ローターが3枚の場合、In/Outの対応が既知であれば  26 ^ 3=17,576 通りになる また、3枚のローターの順番を入れ替えれば、  3! \times 26 ^ 3=105,456 通りになり、5枚のローターを用意しておいて、そのうちの3枚を用いるようにすれば、 {} _ 5 \rm{P} _ 3 \times 26 ^ 3=1,054,560 通りとなる

反転ローター

反転ローターも入力された文字を他の文字に変換する機構 ただし、ローターとは異なり、入力と出力が1:1対応する

例えば、Aに対してFを出力する反転ローターは、Fに対してAを出力する

エニグマはこの反転ローターによって、平文と暗号文が1:1対応するという特徴がある つまり、ローターの初期位置をマシンにセットして、平文を打ち込めば暗号文が、暗号文を打ち込めば平文が出てくる また、入力文字と出力文字は絶対に同じにはならないので、平文と暗号文の組み合わせがあれば、解読のヒントになるらしい

反転ローターの設定方法は、A-Zの文字を13組に分けるので、全部で

\begin{aligned}
\sum_{n=1}^{13} \frac{{}_{2n} \rm{C}_2}{13!}=\frac{26!}{2^{13} 13!}=7,905,853,580,625
\end{aligned}

通りになる

反転ローターの構成が既知の場合、出力される文字は入力文字以外の 25 通りとなる

モノ

hayashikun.github.io

上部のEncoderは暗号機で、下部ではローター間でどのように電流が流れているかを可視化している

暗号化はR1→R2→R3→Reflector→R3→R2→R1の順で行われる

ローターの設定は、Enigma Iというモデルの、I, II, IIIをそれぞれR1, R2, R3に設定している。 また、反転ローターにはReflector Aというものを用いた。

see also: Enigma rotor details - Wikipedia

ローター位置がそれぞれ、B, C, D、つまりそれぞれ1つ、2つ、3つズレているときに、Aを入力すると

f:id:hayashikunsan:20190602174322p:plain

となる。

まず、Aと入力すると、R1Bの位置(1つズレているので)に電流が入り、Kから電流が出る。これは、Jの位置(1つズレているので!)に対応している。 次に、R2Jの位置にある、L(2つズレているので)に電流が入り、Hから電流が出て…… という感じで反転ローターまで達し、OからQへと電流が流れ、最終的にZが光る

つまり、この構成では、AZが対応している

実装

github.com

Reactに関してはあまり自信がない……

Reactは関係無く、Enigmaの暗号機

Enigma/Enigma.ts at master · hayashikun/Enigma · GitHub

諸々のコンポーネントたち

Enigma/src/component at master · hayashikun/Enigma · GitHub

感想

割とReactは楽しかった

もっと触ってみたい

あと、英語版Wikiにはエニグマ関連の記事がいろいろ揃ってて面白そうなのでもう少し読んでみよう