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.
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.
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.
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.