Pet project: Symulator Enigmy

Jakiś czas temu, zainspirowany filmem The Imitation Game, zacząłem drążyć temat niemieckiej maszyny szyfrującej Enigma z II Wojny Światowej. Chciałem zrozumieć jej działanie i, być może, spróbować stworzyć moją własną, elektroniczną, wersję tego urządzenia.

The Imitation Game (2014)

Zrozumienie mechanizmu zajęło mi więcej czasu niż przypuszczałem. Bardzo pomógł mi w tym film na YT na kanale numberphile, w którym prowadzący objaśnia temat na prawdziwym egzemplarzu Enigmy.
Oprócz tego ciekawym dodatkiem z punktu widzenia historycznego okazał się rozdział o Enigmie z książki Łamacze Kodów – Historia Kryptologii Davida Kahna. Autor w zajmujący sposób opowiada o tym, jak maszyna ewoluowała w czasie tak, aby coraz bardziej utrudniać przeciwnikom łamanie szyfrów.

Łamacze kodów Historia kryptologii David Kahn
Enigma widnieje nawet na okładce książki

Ostatecznie okazało się, że nie jest to aż tak skomplikowane urządzenie. Powiedziałbym wręcz, że jest genialne w swojej prostocie. Wiedząc już jak działa Enigma zabrałem się za pisanie programu.

Napisanie samego algorytmu okazało się być naprawdę proste – całość logiki zamknęła się w 160 liniach Javascriptu.
Bardziej czasochłonne okazało się stworzenie UI – prawdopodobnie przez moje niezbyt wysublimowane umiejętności tworzenia arkuszy CSS oraz to, że postanowiłem jednocześnie nauczyć się obsługi webpacka 🙂

Uważam że całkiem fajnie wygląda też łączenie kabli w panelu w dolnej części aplikacji (plugboard) gdzie wykorzystałem pakiet https://github.com/sasza2/arrows który pozwala na rysowanie zakrzywionych (krzywe Beziera) linii bardziej przypominających kable niż zwykłe, proste odcinki.

Plugboard z krzywymi Beziera

Całość kodu i instrukcję można znaleźć pod tym adresem: https://github.com/Bajena/enigma a pobawić się można tutaj: https://bajena.github.io/enigma/index.html.

Symulator enigmy w akcji
Symulator enigmy w akcji