trochę historii i podstaw teoretycznych
Maszyna szyfrująca Enigma to urządzenie mechaniczno-elektryczne wyglądem przypominające trochę bardziej skomplikowaną maszynę do pisania. Powstało w latach 20-tych XX wieku jako urządzenie komercyjne do zabezpieczania komunikacji i/lub korespondencji. W latach 30-tych XX wieku przejęte i udoskonalane przez III Rzeszę dla potrzeb czysto militarnych. Podstawą działania maszyny jest mechanizm obracających się wirników (niem.Walzen), które dzięki zmieniającym się wciąż ustawieniom powodują przepływ prądu ciągle innymi ścieżkami. Wielokrotna zmiana ścieżki przepływu prądu implikuje za sobą wielokrotną zamianę znaku wejściowego. Wciśnięcie klawisza na klawiaturze powodowało przepływ prądu przez „tymczasowy obwód” utworzony z połączonych ze sobą wirników. W tym samym momencie następował także obrót pierwszego z wirników o jedną pozycję. Tutaj rozwiązano to w sposób czysto mechaniczny poprzez system zapadek i mechanizm "kołyski". Od spodu znajdowała się ruchoma rama. Wciśnięcie klawisza powodowało przechylenie się przedniej części ramy w dół i tym samym tylna część była kierowana ku górze, co powodowało popchnięcie mechanizmu zapadki. Dodatkowo, dzięki specjalnym wyżłobieniom w wirnikach pełny obrót pierwszego z nich wymuszał przesunięcie następnego o jedną pozycję itd. Wraz ze zmieniającymi się, w takt obrotów wirników, ścieżkami połączeń zmianom ulegał wciąż algorytm podstawieniowy dla każdej z wprowadzanych liter. Wyjście z ostatniego wirnika połączone było z tzw. wirnikiem powrotnym (odwracającym), zwanym także reflektorem (niem. Umkehrwalze, w skrócie UKW). Jego zadaniem było ponowne "przepuszczenie" sygnału przez trzy poprzednie wirniki, tyle że teraz w odwrotnej kolejności (i z innymi już ustawieniami). Dzięki tylu zmianom połączeń, ponowne wciśnięcie danego klawisza dawało zawsze inny rezultat na wyjściu. Jakby tego było mało, wirniki odwracające także występowały w kilku wariantach (A,B,C), które różniły się między sobą sposobem połączeń wewnętrznych. Na zdjęciu 1 przedstawiono otwartą Enigmę wraz z opisem poszczególnych jej elementów.
W zależności od modelu w Enigmie znajdowały się trzy (modele M1, M2,M3) lub cztery (model M4) wirniki (niem. Walzen), których wybór, kolejność ułożenia (niem. Walzenlage) oraz ustawienie początkowe (niem. Grundstellung) miały znaczenie. Model M3 bazujący na cywilnej wersji Enigmy umożliwiał wybór trzech spośród pięciu dostępnych wirników. Wirniki różniły się między sobą nie tylko połączeniem wewnętrznym wyjść (inne mapowanie liter), ale także liczbą wyżłobień, co przekładało się na częstość zmian położenia winika leżącego w dalszej kolejnośći. Aby móc rozkodować wiadomość należało m.in wiedzieć który wirnik (1 z 5) występował w maszynie szyfrującej na której pozycji, a także jakie mial ustawienie początkowe. Wirniki numerowano liczbami rzymskimi: I, II, III, IV, V itd. Za wyjątkiem czwartych wirników Enigmy M4, które oznaczono greckimi literami Β (Beta) lub Γ (Gamma ). Wirnik odwracający (UKW) także występował w kilku wariantach połączeń i był oznaczany literami A, B, C. Oprócz wyżej wymienionych w Enigmie występował jeszcze walec wstępny (niem. Eintrittswalze / ETW). Był on nieruchomy i do niego dochodziły przewody przyłączoniowe z klawiatury. Dzięki połączeniu sprężynowemu przekazywał on sygnał dalej do obracającego się wirnika występującego na pierwszej pozycji (patrząc od prawej strony).
ustawienia podstawowe: Walzenlage & Grundstellung
Pierwotnie by zaszyfrować lub odszyfrować wiadomość należało wybrać trzy wirniki (spośród 5 dostępnych) i osadzić je w maszynie w odpowiedniej kolejności. W języku niemieckim parametr ten określano mianem Walzenlage (dosłownie: położenie wirników) . Następnie na każdym z wirników wybierano ustawienie początkowe - tj. ustawiano odpowiednią literę (lub cyfrę - w zależności od modelu). Ustawienie początkowe w nomenklaturze Enigmy nazywano w j. niemieckim terminem Grundstellung (ustawienie podstawowe). Jako, że każdy z wirników zapewniał inne połączenia wewnętrzne oba powyższe parametry jak i rodzaj użytego reflektora (UKW-A, UKW-B lub UKW-C) musiały być wcześniej znane obu stronom komunikacji. We wczesnych wersjach Enigmy pierścień był na stałe przytwierdzony do wirnika i obracał się tylko wraz z nim.Ringstellung
W celu zwiększenia liczby możliwych kombinacji ustawień w późniejszym okresie dodano możliwość ustawienia położenia pierścienia względem osi wirnika. Ustawienie to nosiło właśnie nazwę Ringstellung (niem. Ring - pierścień, Stellung - ustawienie) i wprowadzało dodatkowe przesunięcie (offset) względem standardowych ustawień wirników (sprzed modyfikacji). Aby ustawić pierścień we właściwej pozycji najpierw odhylano sworzeń sprężynowy w prawą stronę, tak by pierścień mógł się swobodnie przesuwać na korpusie wirnika. Następnie obracano pierścieniem tak by czerwony trójkąt wskazywał żądaną pozycję - patrz zdj. 2. Po zwolnieniu sworznia, zostaje on zatrzaśnięty w otworze z boku pierścienia, co uniemożliwia dalsze poruszanie się pierścienia względem osi wirnika.
Tutaj ważna uwaga, bo dla mnie to przez dłuższy czas nie było do końca jasne: przesunięcie pierścienia nie zmieniało układu wewnętrznych połączeń elektrycznych w wirniku!. Zmianie ulegała relacja pomiędzy wewnętrznymi połączeniami a literami wybitymi na pierścieniu. Następowało wówczas przesunięcie. Parametry maszyny odczytywane z książki kodów dla każdego dnia zawierały m.in ustawienie pierścieni dla każdego z wirników. Parametr ten ulegał częstej zmianie i jako taki stanowił element kodu zabezpieczeń. Na obracanym pierścieniu występowało też nacięcie (wyżłobienie), od którego zależał obrót następnego wirnika. Zatem zmiana położenia pierścienia determinowała też moment obrotu kolejnego wirnika, a to już miało przełożenie na obwód elektryczny. Szczegółowy opis działania tego mechanizmu znajdziesz tutaj.
zdj. 2 ustawienie pierścienia względem osi wirnika | (Ringstellung) |
zdj. 3 kompletny wirnik Enigmy (pierwszy od lewej strony) oraz jego części składowe na prawo. Źródło: Wikipedia
Steckerbrett
kolejne modyfikacje: dodanie łącznicy kablowej
zdj. 4 Steckerbrett - łącznica kablowa Enigmy (źródło: Wikipedia)
Kolejną modyfikacją znacząco zwiększającą liczbę permutacji podstawień było dodanie łącznicy kablowej usytuowanej od frontu urządzenia (w polskiej wersji maszyny znajdowała się ona z tyłu). Łącznica (krosownica) - zwana w j. niemieckim Steckerbrett (der Stecker - wtyk, das Brett - deska) umożliwiała dodatkową podmiane znaków poprzez dodanie połączeń krzyżowych (zamieniających litery). Użycie łącznicy nie było obligatoryjne. Technicznie zostało to zrealizowane w ten sposób, że w przypadku braku wpiętego wtyku przy danej literze, od tyłu deski wejście danej litery było zwarte metalowym stykiem z jego wyjściem, a więc w tym przypadku nie następowała żadna podmiana. Wciśnięcie wtyku odsuwało mechanicznie metal, który zwierał wejście z wyjściem rozwierając obwód i wymuszając przepływ prądu przez zewnętrzne połączenie kablowe. Po wyciągnięciu wtyku specjalne sprężyny przyciągały z powrotem metal, aby ponownie zwierał wejście litery z jej wyjściem (patrz zdj. 5).
zdj. 5 tył łącznicy podczas renowacji - zdjęcie pochodzi ze strony enigmamuseum.com
zdj. 6 tył łącznicy podczas renowacji - zdjęcie pochodzi ze strony enigmamuseum.com
Enigma M3 vs M4 - różnice oraz tryb kompatybilności.
W modelu M4 dołożono jeszcze jeden wirnik, zwiększając w ten sposób liczbę możliwych permutacji połączeń. Przy czym czwarty wirnik w trakcie pracy maszyny pozostawał nieruchomy i nie był kompatybilny gabarytowo z pozostałymi. Musiał być mniejszy aby upchnąć go w istniejącej przestrzeni. Z tego samego powodu Enigma M4 miała też mniejszy wirnik odwracający (reflektor / UKW). Na zdjęciu 7 przedstawiono Enigmę M4. Czwarty wirnik występował w dwóch wersjach - Beta i Gamma, różniącymi się wewnętrznym układem połączeń. Wirnik ten nazywano greckim (od oznaczeń Beta / Gamma) lub dodatkowym (ZW - Zusatzwalze).
zdj. 7 Enigma model M4.
Zwróć uwagę na 4 wirniki oraz znacznie mniejszy reflektor niż na zdjęciu 1 (zdjęcie pochodzi ze strony cdvandt.org)
Enigm M4 używano wyłącznie w marynarce wojennej (Kriegsmarine), m.in. na łodziach podwodnych. W celu zachowania możliwości komunikacji z oddziałami wyposażonymi w modele M3, przy pewnych ustawieniach model M4 jest zgodny (kompatybilny) z wcześniejszymi wersjami. W szczególności IV wirnik (beta lub gamma) musiał być ustawiony w pozycji A (Grundstellung oraz Ringstellung). I teraz w zależności czy po „drugiej stronie” używano reflektora typu B lub C należało użyć tego samego rodzaju reflektora (a w zasadzie odpowiednika, gdyż reflektory dla Enigmy M4 były mniejsze gabarytowo) o raz dobrać odpowiednio czwarty wirnik (beta dla reflektora typu B i gamma dla C). Czyli M4 UKW-B + Beta (A) = M3 UKW-B lub M4 UKW=C + Gamma (A) = M3 UKW-C.
Radiotelegrafista w trakcie odbioru zaszyfrowanej wiadomości zapisywał jej znaki na kartce (niem. schluessel Zettel) w postaci 4-ro lub 5-cio znakowych bloków. Następnie arkusz z zaszyfrowaną wiadomością (szyfrogramem) przekazywał do szyfranta. Ten z kolei wprowadzał go do swojej Enigmy wpisując odpowiednie znaki na klawiaturze, zapisując jednocześnie litery zapalających się kolejno żarówek na osobnej kartce. Niemcy jeszcze przed wojną przyjęli zasadę, że pierwsze dwa bloki szyfrogramu stanowił zaszyfrowany powtórzony kulcz wiadomości. W tej konkretnej wiadomości bloki z zaszyfrowanem kodem zostały dopisane także na końcu wiadomości. Klucz ten należało rozszyfrować, zgodnie z ustawieniami książki kodów dla danego dnia i przyjętymi z nagłówka wiadomości ustawieniami początkowymi (Grundstellung). Po rozszyfrowaniu pierwszych 6 znaków szyfrogramu otrzymywano powtórzony 2x klucz wiadomości. Dla omawianego przykładu - z bloku HCALNU po rozszyfraowaniu orzymano ciąg ASTVASTV. Podwójny zapis tego kodu miał na celu zabezpieczenie przed ewentualnymi przekłamaniami powstałymi w drodze radiowego przesyłu wiadomości. Jak się jednak okazało - był to poważny błąd Niemców - rozpracowany później przez polskich kryptologów. Ci ostatni, ustaliwszy, że pierwsze 6 zakodowanych znaków szyfrogramu (np. HCALNU) zawierała zawsze dwa powtórzone trój-literowe bloki (jawnego tekstu), byli w stanie ustalić zależności pomiędzy znakami szyfrogramu (H-L / C-N / A-U) i na tej podstawie odtworzyć przebieg połączeń wirników w maszynie (tzw. teoria cyklów Mariana Rejewskiego).
W późniejszych latach wojny zrezygnowano z tej metody, gdyż Niemcy połapali się, że ich wiadomości najprawdopodobniej są odczytywane przez Aliantów. Wprowadzili wówczas coś, co nazywano grupy identyfikatorów (Kenngruppen). Więcej na ten temat opiszę w dalszej części. Wróćmy jednak do rozszyfrowania tej wiadomości. W pierwszej kolejności szyfrant ustawiał wirniki i pozostałe parametry Enigmy zgodnie z książką kodów dla danego dnia bieżącego miesiąca (tutaj: Grundstellung: AMZI i Ringstellung: ASOD). Następnie rozszyfrowywał dwa pierwsze bloki, wprowadzając na klawiaturze sekwnecję HRQN i SMAD. Odszyfrowana wartość tych bloków to ciąg ASTVASTV.
marek@Enigma:~$ echo HRQNSMAD | /usr/local/enigma/bin/aenig4 -k "c gamma II I V 1 19 15 4 AMZI AD LR ZJ XI BU KV SW FH EN MY" --filter
Następnie jeśli powtórzony 2x kod zgadzał się (nie było przekłamań w odbiorze), operator zmieniał ustawienia podstawowe wirników na odczytaną wartość (tutaj ASTV). Przy czym zmieniano ustawienia samych wirników (Grundstellung) - pozostałych parametrów nie zmieniano. Dalsza część wiadomości została odszyfrowana jako
marek@Enigma:~$ echo "LVIODMMWJLKNGSRJVNLCIKGTMDRBIDAWYLIKIFIFCMCG" | /usr/local/enigma/bin/aenig4 -k "c gamma II I V 1 19 15 4 ASTV AD LR ZJ XI BU KV SW FH EN MY" --filter
co możemy odczytać jako "Der Fuhrer ist tot. Der Kampf geht weiter Doenitz" (Führer nie żyje. Walka trwa dalej Dönitz). Niemcy używali znaków X jako spacji, której normalnie w Enigmie nie przewidziano. Wiadomość ta została nadana przez Karla Dönitza oficera marynarki wojennej, naczelnego dowódcę Kriegsmarine w latach 1943–1945.
Inna przykładowa (rzeczywista) wiadomość nadana przez Wehrmacht jeszcze przed wojną, w 39 roku
Wiadomość została nadana zanim maszyny M4 w ogóle istniały, dlatego rozkodowując ją programem aenig4 musimy narzucić mu w tryb kompatybilności z M3.
nagłówek wiadomości:
marek@Enigma:~$ echo 'HCALN U' |/usr/local/enigma/bin/aenig4 -k "b beta ii i iii 1 26 23 4 AFRX EZ BL XP WR IU VM JO" --filter
W wyniku otrzymaliśmy ciąg znaków AGIAG I (czyli powtórzone 2x AGI). Ustawiamy zatem pojedynczą wartość AGI jako Grundstellung dla rozkodowania następnej części wiadomości. Pamiętamy jednak aby „dodać” czwarty wirknik z ustawieniem A, ponieważ program jest emulatorem Enigmy M4. Czyli:
deszyfrowanie wiadomości
ostatecznie aby móc odszyfrować otrzymaną (lub przechwyconą) wiadomość należało znać następujące parametry:
Warto zauważyć, że pierwsze trzy pozycje z powyższej listy wymagały otwarcia pokrywy Enigmy i ustawienie to było przeprowadzane przez oficera (lub kogoś wyższego rangą) na podstawie zapisu z księgi kodów dla danego dnia bieżącego miesiąca. Następnie można było zablokować dostęp do wnętrza maszyny, umożliwiając szyfrantowi zmianę tylko ustawień podstawowych (Grundstellnung), zmieniających się przy każdej depeszy.
Poniżej przedstawiono parametry prawdziwego szyfrogramu odebranego przez łódź U-516 30 kwietnia 1945
przykładowe rzeczywiste parametry ustawień dla Enigmy M4
HRQN SMAD LVIO DMMW JLKN GSRJ VNLC IKGT MDRB IDAW YLIK IFIF CMCG HRQN SMAD
ASTVASTV
DERFUEHRERISTTOTXDERKAMPFGEHTWEITERXDOENITZX
Na podstawie ustawień wirników możemy przypuszczać, że wiadomość została zakodowana w sposób umożliwiający odczyt także na maszynach M3 (Ringstallung dla wirnika gamma ustawiony na literę A oraz Grundstellung czwartego wirninka także ustawiono na literę A).
Na potwierdzenie tej tezy na rysunku poninżej przedstawiłem wiadomość zdekodowaną w emulatorze Enigmy M3 dla Androida
AN HEERESGRUPPENKOMMANDO 2 =
2109 -1750 - 3 TLE - FRX FRX - 1TL -172 =
Z nagłówka możemy dowiedzieć się, że wiadomośc została nadana 21/09 o godzinie 17:50. Składa się z trzech części (3 TLE). Pierwsza część (1TL - niem. Teil - część) zawiera 172 znaki. W nagłówku jawnym tekstem przekazano także ustawienia początkowe wirników (Grundstellung) - FRX, jakie należało ustawić aby odszyfrować klucz wiadomości. W późniejszym okresie zaniechano takich praktyk. Zatem mamy:
dodajemy 1 (A) na początku (ponieważ program emuluje M4)
HCALN UQKRQ WUQTZ KFXZO MJFOY RHYZW VBXYS IWMMV WBLEB DMWUW BTVHM RFLKS DCCEX IYPAH RMPZI OVBBR VLNHZ UPOSY EIPWJ TUGYO SLAOX RHKVC HQOSV DTRBP DJEUK SBBXH TYGVH GFICA CVGUV OQFAQ WBKXZ JSQJF ZPEVJ RO
W pierwszej kolejności musimy ustalić kod, którym została zaszyfrowana właściwa wiadomość. W tym celu używając ustawień początkowych rozszyfrowujemy tylko pierwsze 6 znaków wiadomości:
AGIAG I
marek@Enigma:~$ echo 'QKRQ WUQTZ KFXZO MJFOY RHYZW VBXYS IWMMV WBLEB DMWUW BTVHM RFLKS DCCEX IYPAH RMPZI OVBBR VLNHZ UPOSY EIPWJ TUGYO SLAOX RHKVC HQOSV DTRBP DJEUK SBBXH TYGVH GFICA CVGUV OQFAQ WBKXZ JSQJF ZPEVJ RO' |/usr/local/enigma/bin/aenig4 -k "b beta ii i iii 1 26 23 4 AAGI EZ BL XP WR IU VM JO" --filter
AUFB EFEHL DESOB ERSTE NBEFE HLSHA BERSS INDIM FALLE XZXZT XUNWA HRSCH EINLI CHENX FRANZ OESIS QENAN GRIFF SDIEW ESTBE FESTI GUNGE NJEDE RZAHL ENMAE SSIGE NUEBE RLEGE NHEIT ZUMTR OTZZU HALTE NX
AUF BEFEHL DES OBERSTEN BEFEHLSHABERS SIND IM
FALLE X Z X ZT X UNWAHRSCHEINLICHEN X FRANZOESISQEN
ANGRIFFS DIE WESTBEFESTIGUNGEN JEDER ZAHLENMAESSIGEN
UEBERLEGENHEIT ZUM TROTZ ZU HALTEN X
Odszyfrowana wiadomość pokazuje nam również, że w szyfrowaniu obowiązywały pewne zasady i skróty (także myślowe). Enigma nie mogła szyfrować ani liczb, ani znaków interpunkcyjnych zatem zastępowano je pisząc cyfry słownie, a spacje i inne znaki często zestępowano znakiem X. Niektóre zestawy liter - jak np. ch zastąpiono na „Q”. Kilka przykładowych podmian: