Podstawa wykładowa: Część 2 - slajdy 33, 35: kryptoanaliza Enigmy, wkład Biura Szyfrów (Rejewski, Różycki, Zygalski), niemiecka procedura podwójnego
szyfrowania klucza depeszy, permutacje iloczynowe AD, BE, CF, twierdzenie o rozkładzie permutacji na cykle.
Cel
Celem ćwiczenia jest zrekonstruowanie fundamentalnego przełomu matematycznego Mariana Rejewskiego z 1932 roku. Student bada procedurę podwójnego szyfrowania trójliterowego
klucza depeszy stosowaną przez Niemców przed II wojną światową, generuje depesze w symulatorze Enigmy, tworzy w Pythonie program wyznaczający permutacje iloczynowe łączące znaki 1-4, 2-5
i 3-6, rozkłada je na cykle rozłączne i wykazuje, jak struktura cykli identyfikuje położenie bębnów bez znajomości łącznicy.
Scenariusz – opis
W tym zadaniu odtwarzasz jedno z największych osiągnięć w historii kryptologii – metodę permutacji Mariana Rejewskiego. Otwierasz w przeglądarce zaawansowany symulator maszyny
Enigma oraz konsolę JSLinux z interpreterem Python. Zapoznajesz się z ówczesną niemiecką procedurą wojskową: operator wybierał klucz dzienny z książki kodów, a następnie wymyślał własny
trójliterowy klucz depeszy (np. R-T-Z). Aby uniknąć błędów transmisji radiowej, operator szyfrował ten klucz depeszy dwukrotnie na ustawieniach klucza dziennego, przesyłając na początku
depeszy sześcioliterowy nagłówek. Jeżeli klucz depeszy brzmiał RTZ, to szyfrowaniu podlegał ciąg RTZRTZ, dający 6 liter szyfrogramu l1, l2, l3, l4, l5, l6.
Co ma wykonać student / grupa
W symulatorze Enigmy ustawiasz bębny w konfiguracji I, II,
III, reflektor B oraz losowo wybrane ustawienie dzienne (np. D-A-N). Na łącznicy Steckerbrett konfigurujesz 6 par wtyków (np. AB, CD, EF, GH, IJ, KL). Generujesz 30 różnych
sześcioliterowych nagłówków, wybierając różne klucze depesz i szyfrując każdy podwójnie na tej samej konfiguracji dziennej. Zapisujesz otrzymane nagłówki do pliku
depesze_rejewski.txt w środowisku JSLinux.
Tworzysz w JSLinux program rejewski_cycles.py w języku
Python. Program wczytuje przechwycone nagłówki i buduje relacje przejścia pomiędzy 1. a 4.
literą nagłówka (reprezentujące permutację iloczynową AD). To samo wykonuje dla par liter 2-5 (permutacja BE) oraz par liter 3-6 (permutacja CF).
Następnie skrypt implementuje algorytm teorii grup rozkładający każdą z wyznaczonych permutacji na rozłączne cykle (np. cykle o długościach 10, 8, 5, 3). Z twierdzenia
Rejewskiego wiesz, że struktura tych cykli zależy wyłącznie od ułożenia wirników, a łącznica kablowa jedynie zamienia litery wewnątrz cykli, nie zmieniając ich długości. Uruchamiasz
program i rejestrujesz otrzymaną charakterystykę cykliczną (zbiór długości cykli) dla permutacji AD, BE oraz CF. Zmieniasz w symulatorze konfigurację łącznicy kablowej, dodając inne
pary wtyków, lecz pozostawiając wirniki w identycznym położeniu D-A-N.
Generujesz nową serię nagłówków, uruchamiasz skrypt i porównujesz strukturę cykli. Z zachwytem stwierdzasz, że długości cykli pozostały dokładnie takie same, co w pełni
potwierdza genialne twierdzenie polskiego matematyka. Wykonujesz zrzuty ekranu symulatora z ustawieniami Enigmy, kodu programu w JSLinux oraz wygenerowanych rozkładów cyklicznych.
Sporządzasz tabelę przedstawiającą permutacje iloczynowe, ich rozkład na cykle oraz dowód niezmienniczości względem łącznicy. Podsumowujesz ćwiczenie wnioskiem o fundamentalnym
znaczeniu algebry abstrakcyjnej w pokonaniu Enigmy.
Przykładowe kroki do wykonania jako sugestia
- Otwórz w przeglądarce symulator Enigmy oraz terminal JSLinux Alpine.
-
Skonfiguruj Enigmę: wirniki I
-II-III, reflektor B, pozycję dzienną
(np. D-A-N) oraz 6 par wtyków.
- Zrozum procedurę podwójnego szyfrowania: klucz depeszy xyz szyfrowany jako xyzxyz.
- Wygeneruj 30 nagłówków sześcioliterowych przy różnych kluczach depeszy i stałym kluczu dziennym.
- Zapisz nagłówki w pliku
depesze_rejewski.txt w JSLinux.
-
Stwórz plik
rejewski_cycles.py w edytorze nano.
-
Zaimplementuj wczytywanie nagłówków i tworzenie grafu przejść dla par znaków (
1, 4),
(2, 5) oraz (3,
6).
- Napisz funkcję rozkładającą permutację na rozłączne cykle permutacji.
-
Zaimplementuj formatowanie i sortowanie długości cykli (charakterystyka cykliczna). Każdą permutację wypisuj dwupoziomowo: najpierw pełne łańcuchy
(
np. A→F→W→A, długość 3), potem posortowaną listę długości
(np. [10, 8, 5,
3]) - łańcuchy pozwalają zweryfikować poprawność kodu na pojedynczym nagłówku, a lista
długości służy do porównania dwóch próbek przy dowodzie niezmienniczości względem łącznicy.
-
Uruchom program i odczytaj długości cykli dla permutacji
AD, BE i
CF.
- Zmień konfigurację łącznicy kablowej w symulatorze (inne pary wtyków) przy zachowaniu tych samych wirników.
- Wygeneruj drugą próbkę nagłówków i powtórz analizę w skrypcie.
- Udowodnij tożsamość długości cykli w obu przypadkach (niezmiennik Rejewskiego).
-
Wyjaśnij,
jak Biuro Szyfrów wykorzystało te charakterystyki do stworzenia katalogu kart i bomby kryptologicznej.
- Wykonaj zrzuty ekranu symulatora i konsoli JSLinux z wypisanymi cyklami.
- Sporządź raport laboratoryjny opisujący matematyczne tło przełomu Rejewskiego.
Kontrola zaliczenia (checklist):
- Zrekonstruowano metodę Rejewskiego na wektorze ze startera: z depesz z podwójnie szyfrowanym kluczem wyznaczono cykle permutacji i odtworzono ustawienia bębnów.
- Wykazano różnicę: procedura podatna (powtórzony klucz — cykle ujawniają bębny) vs poprawiona (bez powtórki — brak relacji 1-4/2-5/3-6); dołączono porównanie logów.
- Dołączono log ataku (rozkład na cykle, katalog charakterystyk) + kod łatki (procedura bez powtórki / losowy klucz depeszy).
- Opisano w 3–5 zdaniach kompromis: wygoda operacyjna powtórki vs katastrofa kryptograficzna, niezmienniczość cykli sprzężonych, droga do bomb.
Wariant offline (fallback): Praca w pełni offline na wektorach ze startera w lokalnym Pythonie 3 bez sieci; symulator Enigmy/CyberChef zastąp logiem skryptu; do sprawozdania dołącz kod ataku, log odzyskanych tekstów oraz opis kompromisu bezpieczeństwo/wydajność.
Sugerowane wnioski i podsumowanie - co student ma osiągnąć
Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:
- W jaki sposób niemiecki błąd proceduralny podwójnego przesyłania klucza stworzył relacje pomiędzy pozycjami 1-4, 2-5 i 3-6.
- Dlaczego twierdzenie o niezmienniczości cykli permutacji sprzężonych pozwoliło oddzielić bębny od łącznicy kablowej.
- W jaki sposób katalog charakterystyk cyklicznych doprowadził do powstania polskich bomb kryptologicznych.
- Student potrafi odtworzyć metodę Rejewskiego programistycznie i zinterpretować rozkład permutacji na cykle.