deszyfrowanie wiadomości
ostatecznie aby móc odszyfrować otrzymaną (lub przechwyconą) wiadomość należało znać następujące parametry:
- wersję użytych wirników (I..VIII) oraz ich kolejność osadzenia (Walzenlage)
- wartość przesunięcia każdego z pierścieni wirników (Ringstellung)
- rodzaj użytego reflektora (Umkehrwalze / UKW)
- ustawienia początowe każdego z wirników(Grundstellung)
- ustawienia połączeń na łącznicy kablowej (Steckerbrett)
Poniżej przedstawiono parametry prawdziwego szyfrogramu odebranego przez łódź U-516 30 kwietnia 1945
przykładowe rzeczywiste parametry ustawień dla Enigmy M4
- Reflektor: C (UKW-C)
- Walzenlage: Gamma, II, I, V
- Ringstellung:ASOD (1 19 15 4)
- Grundstellung AMZI (1 13 26 9)
- Steckerbrett: AD LR ZJ XI BU KV SW FH EN MY
- szyfrogram:
HRQN SMAD LVIO DMMW JLKN GSRJ VNLC IKGT MDRB IDAW YLIK IFIF CMCG HRQN SMAD
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.
Poniżej przedstawiam rozkodowanie tej wiadomości przy użyciu programu aenig4 (emulatora Enigmy):
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
ASTVASTV
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
DERFUEHRERISTTOTXDERKAMPFGEHTWEITERXDOENITZX
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.
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
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:
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:
- Reflektor: B (UKW-B)
- Walzenlage: II I III
- Ringstellung 26 (Z) 23 (W) 4 (D)
dodajemy 1 (A) na początku (ponieważ program emuluje M4) - Grundstellung FRX (06 18 24) (przesłany jawnie w nagłówku. My dodamy A na początku)
- Steckverbindungen EZ BL XP WR IU VM JO
- szyfrogram:
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:
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
AGIAG I
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:
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 XOdszyfrowana 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:
- X - spacja, kropka albo podział wyrazu
- KLAM / KK - nawias ()
- ZZ - przecinek (,)
- Z - kropka (kończąca zdanie) (.)
- YY - punkt lub kropka, czasami myślnik lub wykrzyknik (.-!)
- FRAGE/FRAGEZ/FRAQ/UD = znak zapytania (?)
- ABS - nowy paragraf
- Q - CH np. SQIFF oznaczało Schiff (łódź), RIQTUNG -> RICHTUNG (kierunek)
- ZXZT (z.Zt) = "zur Zeit" - obecnie / aktualnie
- liczby: NULL EINZ ZWO DREI VIER FUNF SEQS SIEBEN AQT NEUN