Wprowadzenie §
Szyfr Enigma był szyfrem polowym używanym przez Niemców podczas II wojny światowej. Enigma jest jedną z lepiej znanych historycznych maszyn szyfrujących, a w rzeczywistości odnosi się do szeregu podobnych maszyn szyfrujących. Pierwsza maszyna Enigma została wynaleziona przez niemieckiego inżyniera Arthura Scherbiusa pod koniec pierwszej wojny światowej. Była ona wykorzystywana komercyjnie od wczesnych lat dwudziestych XX wieku, a także przez służby wojskowe i rządowe wielu krajów – najbardziej znana przez nazistowskie Niemcy przed i podczas II wojny światowej. Wyprodukowano wiele różnych modeli Enigmy, ale niemiecki model wojskowy, Wehrmacht Enigma, jest wersją najczęściej omawianą.
Jeśli chciałbyś zaszyfrować niektóre z własnych wiadomości Enigmy, spójrz na przykład javascript.
Algorytm §
Ta sekcja będzie mówić o Enigmie I aka Wehrmacht Enigma, inne warianty są podobne w działaniu. Klucz” do enigmy składa się z kilku elementów:
- Wirniki i ich kolejność
- Pozycje startowe wirników
- Ringstellung, czyli ustawienia pierścieni
- Steckerverbindungen, czyli ustawienia płytek wtykowych
Informacje na temat procedur stosowanych przez Niemców w czasie II wojny światowej podczas wysyłania wiadomości Engima, w tym sposobu ustawiania wskaźników, można znaleźć w tym opisie.
Wirniki §
Załóżmy, że nasze wirniki to I,II,III poruszające się od lewej do prawej, i próbujemy zaszyfrować literę 'A’. Przyjmiemy na razie, że podczas szyfrowania litery 'A’ każdy rotor znajduje się w pozycji startowej (’AAA’).Ponieważ nasze rotory to I,II,III poruszające się od lewej do prawej, znak A przejdzie najpierw przez rotor III. Każdy rotor wykonuje prostą operację podstawiania. Tabelę podstawiania dla rotora III można zobaczyć poniżej.
ABCDEFGHIJKLMNOPQRSTUVWXYZBDFHJLCPRTXVZNYEIWGAKMUSQO
B jest zastępowane przez D, C jest zastępowane przez F itd. Tak więc po przejściu litery „A” przez wirnik, wychodzi ona jako „B”. Litera „B” jest teraz wprowadzana przez wirnik II, gdzie jest zastępowana przez „J” itd. Najlepiej zobrazować to za pomocą tabeli (pełny opis okablowania każdego wirnika znajduje się na tej stronie wikipedii):
III | II | I | Reflektor | inv(I) | inv(II) | inv(III) |
A -> B | B -.> J | J -> Z | Z -> T | T -> L | L -> K | K -> U |
Po przejściu litery przez wirniki III,II,I trafia ona na reflektor i ulega kolejnej prostej substytucji. Po wyjściu z reflektora, litera jest wysyłana z powrotem przez rotory w odwrotnym kierunku (oznacza to, że stosowana jest substytucja odwrotna). Widzimy z tabeli, że po tym jak zaszyfrowana litera wychodzi z rotora III na końcu, zostajemy z literą U. Ważnym krokiem, o którym jeszcze nie wspomniałem, jest fakt, że rotory inkrementują się przed każdą literą, która jest zaszyfrowana. Jeśli pozycje początkowe rotorów to 'FEQ’, to zostaną one najpierw inkrementowane do 'FER’ zanim pierwsza litera zostanie zaszyfrowana.
Inkrementacja rotorów §
Częstym błędem podczas implementacji enigmy jest założenie, że rotory działają jak standardowy licznik kilometrów, istnieje jednak kilka kluczowych różnic. Każdy wirnik ma wycięcie, które powoduje, że wirnik po jego lewej stronie robi krok. Rotor I powoduje, że następny rotor robi krok przy przejściu z Q do R, rotor II przy przejściu z E do F itd. Rotory od I do V są używane w enigmie Wermachtu, później dodano kolejne rotory, które miały dwa nacięcia.
I | II | III | IV | V | VI | VII | VIII |
Q | E | V | J | Z | Z,M | Z,M | Z,M |
Jest jeszcze jeden dodatkowy, mylący szczegół, a mianowicie „podwójne stąpanie”. Kiedy wirnik wykonuje krok, powoduje to również krok wirnika po jego prawej stronie. Nie jest to zauważalne, gdy drugi rotor robi krok, ponieważ pierwszy rotor robi krok po każdym naciśnięciu klawisza. Jednakże, gdy trzeci (najbardziej lewy) wirnik wykonuje krok, powoduje to, że drugi wirnik również wykonuje krok. Thismeans the machines period is not 26x26x26, but only 26x25x26.
The Ringstellung §
The Ringstellung (ring settings) are generally provided as a 3 letter string e.g. 'FAM’ (or alternativelyas numbers between 1 and 26, representing the letters). W poprzedniej dyskusji założyłem, że prosty szyfr substytucyjny każdego rotora był stały. Ringstellung dają możliwość przesuwania szyfru zastępczego w następujący sposób. Przy ustawieniu pierścienia na 'A’ (lub 1), podstawienie rotora I wygląda następująco:
ABCDEFGHIJKLMNOPQRSTUVWXYZEKMFLGDQVZNTOWYHXUSPAIBRCJ
Przy ustawieniu pierścienia na 'B’ (lub 2), podstawienie rotora I wygląda następująco:
ZABCDEFGHIJKLMNOPQRSTUVWXYEKMFLGDQVZNTOWYHXUSPAIBRCJ
Steckerverbindungen §
Steckerverbindungen (plugboard) to dodatkowa warstwa zabezpieczeń, która składa się z 13 przewodów, które podłącza się do gniazd z przodu maszyny enigma.Każdy przewód łączy 2 litery, np. P z O. Te pary są określone jako część materiału klucza. Kiedy litera jest wpisywana, zanim trafi do pierwszego wirnika, jest podstawiana zgodnie z tablicą wtyczek, a następnie po wyjściu litery jest ona ponownie poddawana podstawianiu zgodnie z tablicą wtyczek, zanim zostanie wysłana na zewnątrz. Przykładowe ustawienie plugboardu jest następujące: PO ML IU KJ NH YT GB VF RE AC (Oznacza to, że P i O są zamieniane, M i L są zamieniane itd.)
Jeśli użyjemy powyższego przykładu, gdzie litera 'A’ została zaszyfrowana za pomocą rotorów I, II i III z pozycjami startowymi AAA, mamy literę A zaszyfrowaną jako U. Jeśli teraz weźmiemy pod uwagę plugboard, używając ustawień plugboardu z poprzedniego paragrafu, 'A’ jest najpierw tłumaczone na 'C’ przed encipherment. Encipherment kontynuuje się jak zwykle, tym razem 'C’ jest wyprowadzane jako 'J’. Litera ta jest następnie ponownie kierowana przez plugboard i zastępowana przez 'K’. Tak więc teraz mamy 'A’ zaszyfrowane jako 'K’ przy użyciu plugboardu. Plugboard znacznie zwiększa siłę szyfru enigmy jako całości, bardziej niż dodanie kolejnego rotora.
Przykład JavaScript §
Plaintext
ustawienia klucza:
ustawienia pierścienia:
Rotory:
Ustawienia tablicy wtyczek:
szyfrogram
Inne implementacje §
Aby szyfrować własne wiadomości w pythonie, można użyć modułu pycipher. Aby go zainstalować, użyj pip install pycipher. Aby zaszyfrować wiadomości za pomocą szyfru Enigmy (lub innego szyfru, zobacz dokumentację tutaj), zobacz przykład tutaj.
Kryptanaliza §
Dla niektórych kodów do automatycznego łamania wiadomości Enigmy zobacz Cryptanalysis of Enigma.
Wiele pracy włożono w łamanie Enigmy, niektóre metody, takie jak rodding i buttoning up były używane podczas drugiej wojny światowej, ale wymagają 'cribs’, lub znanych kawałków plaintext. Metody te są omówione na stronie wikipedii.
Najnowsze podejścia obejmują pracę Jima Gillogly’ego „Ciphertext only Cryptanalysis of the Enigma”. List uzupełniający, poprawiający niektóre błędy w pracy, można znaleźć tutaj. Inna praca, która opiera się na pracy Jima Gillogly’ego to 'Applying Statistical Language Recognition Techniques in the Ciphertext only Cryptanalysis of Enigma’ autorstwa Heidi Williams. Innym interesującym źródłem jest The Cryptographic Mathematics of Enigma.
.