Laboratorium 2
Zadania laboratoryjne dla studentów IT - ocena 3.0

Poziom: ocena 3.0 - podstawy technik klasycznych i narzędzia webowe

Zestaw 10 praktycznych zadań laboratoryjnych do wykonania w trakcie zajęć (90–100 minut).
Kierunek: Informatyka, semestr 7, przedmiot: Kryptologia.
Podstawa materiałowa: wykład część 2 (szyfrowanie konwencjonalne - techniki klasyczne).
Zadania do wykonania samodzielnego.

Wskazówki dla studenta i zasady realizacji:

  • Zadania na ocenę 3.0 skupiają się na praktycznym zrozumieniu mechanizmów szyfrów klasycznych: podstawieniowych (Cezar, AtBash, afiniczny, monoalfabetyczne, Vigenère, Playfair) oraz przestawieniowych (płotowy, transpozycja kolumnowa), a także budowy maszyny Enigma.
  • Wszystkie zadania są w pełni wykonalne bez praw administratora na systemie Windows - wymagają wyłącznie nowoczesnej przeglądarki internetowej i darmowych narzędzi online (CyberChef, dCode, Boxentriq, Cryptii) oraz konsoli linuksowej w emulatorze JSLinux Alpine.
  • Każde zadanie realizowane jest w czasie 90–100 minut w trakcie zajęć laboratoryjnych.
  • Wymagania formalne sprawozdania laboratoryjnego:
    • Strona tytułowa zawierająca: imię i nazwisko studenta, numer albumu, kierunek, semestr, grupę laboratoryjną, rok akademicki, numer i temat laboratorium, numer oraz nazwę realizowanego zadania, deklarowaną ocenę (3.0).
    • Opis konfiguracji środowiska badawczego, adresów serwisów WWW oraz wykorzystanych poleceń.
    • Szczegółowy opis wykonanych czynności, uzasadnienie wyboru narzędzi, zrzuty ekranu oraz wklejone fragmenty danych wejściowych i wyjściowych dokumentujące rzetelne wykonanie pracy.
    • Struktura raportu: spis treści, spis ilustracji (z numerami i podpisami), spis tabel (z numerami i podpisami) oraz wykaz źródeł literaturowych i internetowych.
Kryptologia
lab 2 - 3.0
Spis
Spis zadań laboratoryjnych na ocenę 3.0
01/10
Zadanie 1. Model szyfrowania symetrycznego i szyfr Cezara w konsoli Linux oraz serwisie CyberChef
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef
Podstawa wykładowa: Część 2 - slajdy 4, 6, 7, 8: model szyfrowania konwencjonalnego, zasada Kerckhoffsa, mechanizm szyfru Cezara z arytmetyką modulo 26, przestrzeń 25 kluczy, atak brute force.

Cel

Celem zadania jest praktyczne przećwiczenie modelu szyfrowania symetrycznego na przykładzie szyfru Cezara. Student bada proces szyfrowania oraz deszyfrowania z wykorzystaniem narzędzia sieciowego CyberChef oraz standardowych poleceń konsoli linuksowej w środowisku JSLinux. Ponadto student demonstruje podatność małej przestrzeni 25 kluczy na atak siłowy brute force bez znajomości klucza.

Scenariusz – opis

Na stanowisku laboratoryjnym otwierasz przeglądarkę internetową i przechodzisz do darmowego narzędzia CyberChef pod adresem gchq.github.io/CyberChef. Równolegle w drugiej karcie uruchamiasz wirtualną maszynę z konsolą Linux w serwisie JSLinux pod adresem bellard.org/jslinux. Twoim pierwszym zadaniem jest przygotowanie tekstu jawnego w języku polskim o długości co najmniej 120 znaków bez polskich znaków diakrytycznych. Wklejasz przygotowany tekst do panelu wejściowego Input w serwisie CyberChef. Z lewego panelu operacji odnajdujesz i przeciągasz operację ROT13 do obszaru Recipe, po czym zmieniasz domyślną wartość przesunięcia Amount na wybraną liczbę z przedziału od 1 do 25, na przykład 7.

Co ma wykonać student / grupa

Obserwujesz w panelu wyjściowym Output powstały szyfrogram i analizujesz, jak każda litera została przesunięta o zadaną stałą liczbę pozycji w alfabecie łacińskim. Zapisujesz wygenerowany szyfrogram do pliku tekstowego na swoim dysku lub kopiujesz go do schowka systemowego.

Teraz przechodzisz do konsoli JSLinux, aby zrealizować to samo przekształcenie za pomocą standardowego uniksowego polecenia tr. W konsoli tworzysz zmienną tekstową zawierającą twoją wiadomość początkową. Konstruujesz potok z poleceniem tr, w którym definiujesz mapowanie zakresu liter alfabetu na zakres przesunięty o tę samą wartość klucza. Porównujesz szyfrogram uzyskany w konsoli z szyfrogramem wygenerowanym wcześniej przez CyberChef, weryfikując pełną zgodność obu rezultatów.

Kolejnym krokiem jest zasymulowanie sytuacji podsłuchania transmisji przez stronę trzecią, która nie zna wartości użytego klucza. Kopiujesz uzyskany szyfrogram z powrotem do CyberChef i usuwasz z receptury dotychczasową operację szyfrującą. Wyszukujesz operację ROT13 Brute Force i przeciągasz ją do panelu Recipe. Pamiętasz o konwencji znaku: operacja Brute Force obraca litery w przód (dodaje Amount), więc szyfrogram zaszyfrowany kluczem k odszyfrujesz wierszem o numerze Amount = 26 − k (na przykład dla k = 7 czytelny jest wiersz Amount = 19, ponieważ 7 + 19 = 26 ≡ 0 (mod 26)).

Analizujesz wygenerowaną listę 25 wariantów odszyfrowania i odnajdujesz ten wiersz, który zawiera w pełni czytelny tekst w języku polskim. Zwracasz uwagę na indeks przesunięcia odpowiadający czytelnemu tekstowi i porównujesz go z kluczem użytym podczas szyfrowania.

W konsoli JSLinux piszesz jednolinijkową pętlę w powłoce sh lub prosty skrypt, który iteruje po 25 przesunięciach i wypisuje kolejne odszyfrowania. Wybierasz z wypisanych linii poprawny tekst jawny i dokumentujesz czas potrzebny człowiekowi oraz maszynie na sprawdzenie wszystkich kombinacji. Podsumowujesz eksperyment, wyjaśniając, dlaczego przestrzeń zaledwie 25 kluczy uniemożliwia zapewnienie poufności we współczesnych systemach. Wszystkie wykonane polecenia, zrzuty ekranu z serwisu CyberChef oraz wyjście konsoli JSLinux zbierasz jako materiał dowodowy do sprawozdania laboratoryjnego. Weryfikujesz, czy każdy krok został należycie udokumentowany i czy wyniki obu środowisk są spójne.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz stronę internetową narzędzia CyberChef (gchq.github.io/CyberChef) w przeglądarce.
  2. Otwórz w nowej karcie terminal JSLinux Alpine (bellard.org/jslinux/vm.html?cpu=x86_64&url=alpine-x86_64.cfg&mem=256).
  3. Sformułuj komunikat testowy w języku polskim (np. komunikat techniczny o konfiguracji serwera) pozbawiony polskich ogonków.
  4. Wprowadź tekst do panelu Input w CyberChef.
  5. Dodaj do Recipe operację ROT13 i ustaw pole Amount na wybraną wartość przesunięcia (np. 7).
  6. Skopiuj uzyskany szyfrogram z okna Output i zapisz go do pliku notatek.
  7. W konsoli JSLinux wprowadź polecenie: echo 'TWOJ TEKST' | tr 'A-Za-z' 'H-ZA-Gh-za-g'.
  8. Porównaj wynik z konsoli z wyjściem CyberChef i upewnij się, że są identyczne.
  9. W CyberChef wyczyść recepturę i wklej szyfrogram do panelu Input.
  10. Dodaj operację ROT13 Brute Force i zbadaj wygenerowaną tabelę 25 możliwych przesunięć.
  11. Wskaż numer przesunięcia przywracający oryginalną wiadomość jawną.
  12. W terminalu JSLinux uruchom pętlę w powłoce testującą wszystkie 25 przesunięć poleceniem tr (gotowy szablon - wklej obie linie; za C podstaw swój szyfrogram): C='TU_WKLEJ_SZYFROGRAM'; A=ABCDEFGHIJKLMNOPQRSTUVWXYZ; s=1; while [ $s -le 25 ]; do enc=$(echo "$A" | cut -c$((s+1))-26)$(echo "$A" | cut -c1-$s); echo "$s: $(echo "$C" | tr "$enc" 'A-Z')"; s=$((s+1)); done. Pętla dla kandydata s buduje alfabet przesunięty o s i odwraca go na A-Z; linia z czytelnym tekstem polskim wskazuje klucz (dla szyfrowania k = 7 będzie to linia 7:).
  13. Wykonaj zrzut ekranu przedstawiający pomyślny wynik ataku brute force w CyberChef.
  14. Wykonaj zrzut ekranu konsoli JSLinux dokumentujący polecenie tr oraz pętlę łamiącą.
  15. Sporządź tabelę zestawiającą tekst jawny, klucz, szyfrogram oraz zidentyfikowane przesunięcie.
  16. Zapisz zebrane dane, przygotowując opisy i wnioski do raportu laboratoryjnego.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: tekst jawny PL (min. 200 znaków), szyfrogramy Cezara dla min. 2 kluczy oraz pełny log przeglądu 25 przesunięć z wyraźnym wskazaniem trafienia.
  2. Dołączono 2–3 zrzuty z podpisami: przepis (Recipe) Caesar w CyberChef, pętla łamiąca / polecenie tr w JSLinux oraz tabela jawny–klucz–szyfrogram.
  3. Opisano w 2–3 zdaniach wybór narzędzi (CyberChef do demonstracji, JSLinux/tr do powtarzalnego brute force) i zgodność wyników obu środowisk.
  4. Zapisano wnioski (3–5 zdań): rola modulo 26, rozmiar przestrzeni 25 kluczy, jawność algorytmu = dyskwalifikacja szyfru w praktyce.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Dlaczego przestrzeń 25 kluczy pozwala na natychmiastowe odzyskanie tekstu bez znajomości algorytmu deszyfrującego.
  • Jak operacja modulo 26 zapewnia kołowe zawijanie alfabetu i odwracalność przekształcenia.
  • Dlaczego jawność algorytmu przy znikomej przestrzeni klucza całkowicie dyskwalifikuje szyfr Cezara w praktycznych zastosowaniach.
  • Student potrafi wdrożyć szyfrowanie i atak brute force w dwóch niezależnych narzędziach (CyberChef i JSLinux).
Zadanie 1 - ilustracja
02/10
Zadanie 2. Szyfr lustrzany AtBash – badanie właściwości inwolucji i braku przestrzeni kluczy
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + Cryptii
Podstawa wykładowa: Część 2 - slajd 9: mechanizm szyfru AtBash, inwolucja (samoodwracalność), kryptografia hebrajska, brak stopnia swobody klucza.

Cel

Celem ćwiczenia jest zbadanie matematycznej właściwości samoodwracalności (inwolucji) na przykładzie klasycznego szyfru lustrzanego AtBash. Student przeprowadza szyfrowanie tekstu w serwisie Cryptii oraz CyberChef, a następnie weryfikuje operację w konsoli JSLinux. Ćwiczenie ma na celu uświadomienie studentowi, czym różni się funkcja samoodwracalna od szyfrów wymagających odrębnego algorytmu lub klucza deszyfrującego.

Scenariusz – opis

Rozpoczynasz ćwiczenie od uruchomienia w przeglądarce serwisu Cryptii pod adresem cryptii.com oraz narzędzia CyberChef. W terminalu JSLinux przygotowujesz środowisko do przetwarzania potokowego tekstu. Wybierasz fragment tekstu technicznego liczący co najmniej 100 znaków i dokonujesz jego normalizacji, usuwając znaki specjalne oraz zamieniając wielkie litery na małe lub odwrotnie. W serwisie Cryptii wybierasz w polu wejściowym format tekstu jawnego, a jako komponent przekształcający wskazujesz szyfr Atbash. Obserwujesz, w jaki sposób litera A zostaje zamieniona na Z, litera B na Y, a kolejne litery według osi symetrii alfabetu łacińskiego.

Co ma wykonać student / grupa

Kopiujesz otrzymany szyfrogram i wklejasz go ponownie do drugiego okna wejściowego, stosując dokładnie tę samą operację Atbash. Zauważasz, że ponowne nałożenie tego samego przekształcenia bez żadnych zmian w konfiguracji przywraca pierwotny tekst jawny.

Przechodzisz do serwisu CyberChef, gdzie w panelu Recipe umieszczasz operację Atbash z biblioteki ciphers. Wklejasz swój tekst wejściowy i porównujesz wygenerowany ciąg znaków z wynikiem uzyskanym uprzednio w serwisie Cryptii.

Następnie dodajesz w CyberChef drugą identyczną operację Atbash bezpośrednio pod pierwszą w tym samym przepływie Recipe. Analizujesz uzyskane wyjście, potwierdzając matematyczną właściwość inwolucji, czyli spełnienie równości E(E(M)) = M.

Przechodzisz do konsoli JSLinux, aby zaimplementować to samo przekształcenie za pomocą jednego polecenia systemowego. Wpisujesz polecenie z programem tr, w którym zbiór źródłowy definiuje alfabet rosnący, a zbiór docelowy alfabet odwrócony od Z do A. Przekazujesz wynik przez potok do kolejnego wywołania tego samego polecenia tr, obserwując powrót do tekstu początkowego. Analizujesz przestrzeń kluczy szyfru AtBash i odnotowujesz w notatkach fakt, że wynosi ona dokładnie 1, ponieważ reguła jest sztywna. Wyjaśniasz, dlaczego w myśl zasady Kerckhoffsa system posiadający tylko jedną konfigurację nie zapewnia żadnego bezpieczeństwa.

Sporządzasz tabelę zamiany wszystkich 26 par liter w alfabecie łacińskim dla szyfru AtBash. Wykrywasz punkty stałe, badając, czy w alfabecie o parzystej liczbie liter jakakolwiek litera przekształca się w samą siebie. Dokumentujesz zrzutami ekranu przebieg pracy w serwisach Cryptii, CyberChef oraz w konsoli JSLinux. Przygotowujesz kompletny opis ćwiczenia z wnioskami do raportu laboratoryjnego. Sprawdzasz poprawność sformułowanych wniosków technicznych przed dołączeniem ich do dokumentacji.

Przykładowe kroki do wykonania jako sugestia

  1. Wejdź na stronę serwisu Cryptii (cryptii.com) i wybierz operację Atbash Cipher.
  2. Otwórz w osobnej karcie serwis CyberChef (gchq.github.io/CyberChef).
  3. Wprowadź do Cryptii przygotowany tekst w języku polskim (np. opis macierzy dyskowej bez polskich znaków).
  4. Odczytaj wyjściowy szyfrogram i zanotuj zamianę początkowych liter.
  5. Wklej uzyskany szyfrogram na wejście Cryptii i sprawdź, czy odszyfrowany tekst jest tożsamy z oryginałem.
  6. W CyberChef dodaj operację Atbash do Recipe i podaj ten sam tekst wejściowy.
  7. Dodaj drugą operację Atbash do Recipe i zaobserwuj natychmiastowe odzyskanie tekstu pierwotnego.
  8. Uruchom maszynę JSLinux Alpine w oknie przeglądarki.
  9. W konsoli JSLinux wykonaj: echo 'tekst_jawny' | tr 'a-z' 'zyxwvutsrqponmlkjihgfedcba'.
  10. Wykonaj podwójne przekształcenie potokowe: echo 'tekst' | tr 'a-z' 'zyxwvutsrqponmlkjihgfedcba' | tr 'a-z' 'zyxwvutsrqponmlkjihgfedcba'.
  11. Zanotuj wynik i sprawdź zachowanie wielkich liter przy użyciu zakresu A-Z.
  12. Zbadaj parzystość alfabetu łacińskiego (26 liter) i odpowiedz na pytanie o istnienie punktów stałych.
  13. Sporządź tabelę mapowania 26 znaków alfabetu w szyfrze AtBash.
  14. Wykonaj zrzuty ekranu z Cryptii oraz CyberChef prezentujące test inwolucji.
  15. Zarejestruj polecenia konsoli JSLinux i ich rezultaty.
  16. Sformułuj wnioski dotyczące bezpieczeństwa algorytmów pozbawionych zmiennego klucza tajnego.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: szyfrogram AtBash oraz dowód inwolucji — ponowne szyfrowanie szyfrogramu odtwarza tekst jawny (porównanie diff, E(E(x))=x).
  2. Dołączono 2–3 zrzuty z podpisami: szyfrowanie w Cryptii/CyberChef oraz weryfikacja potokiem tr w JSLinux dla tego samego tekstu.
  3. Opisano w 2–3 zdaniach wybór narzędzi i dlaczego inwolucja zwalnia z implementacji osobnego deszyfrowania.
  4. Zapisano wnioski (3–5 zdań): brak przestrzeni kluczy = brak szyfru w sensie Kerckhoffsa, samoodwracalność, wpływ braku punktów stałych na statystykę.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Na czym polega inwolucja i jakie niesie zalety konstrukcyjne (brak konieczności implementowania odrębnego algorytmu deszyfrującego).
  • Dlaczego brak przestrzeni kluczy sprawia, że AtBash nie spełnia współczesnych definicji szyfru kryptograficznego.
  • Jak brak punktów stałych w alfabecie 26-literowym wpływa na cechy statystyczne szyfrogramu.
  • Student potrafi wykazać własność samoodwracalności w narzędziach webowych oraz w potoku linuksowym.
Zadanie 2 - ilustracja
03/10
Zadanie 3. Szyfr afiniczny – wyznaczanie dozwolonych mnożników i szyfrowanie w serwisie dCode
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + dCode + Python 3
Podstawa wykładowa: Część 2 - slajdy 10, 11: szyfr afiniczny e(x) = (a*x + b) mod 26, warunek względnej pierwszości NWD(a,26)=1, 12 dozwolonych wartości a, przestrzeń 312 kluczy, odwrotność modularna.

Cel

Celem zadania jest opanowanie matematycznych podstaw szyfru afinicznego, łączącego mnożenie modularne i przesunięcie. Student wyznacza zbiór dopuszczalnych współczynników multiplikatywnych a, sprawdza istnienie odwrotności modularnej a^(-1) mod 26, a następnie przeprowadza szyfrowanie i deszyfrowanie w serwisie dCode oraz weryfikuje operacje prostym skryptem w Pythonie w środowisku JSLinux.

Scenariusz – opis

Zadanie rozpoczynasz od analizy matematycznej wzoru szyfru afinicznego e(x) = (a * x + b) mod 26. Uruchamiasz przeglądarkę internetową i otwierasz serwis dCode pod adresem dcode.fr/affine-cipher. W drugiej karcie uruchamiasz konsolę JSLinux z dostępem do interpretera języka Python. Twoim pierwszym krokiem analitycznym jest sprawdzenie warunku względnej pierwszości mnożnika a z rozmiarem alfabetu wynoszącym 26. W konsoli JSLinux uruchamiasz interpreter python3 i piszesz krótką pętlę sprawdzającą warunek math.gcd(a, 26) == 1 dla liczb od 1 do 25.

Co ma wykonać student / grupa

Odnotowujesz dokładnie 12 dozwolonych wartości mnożnika a oraz obliczasz całkowity rozmiar przestrzeni kluczy wynoszący 12 * 26 = 312 kombinacji. Dla wybranej pary klucza, na przykład a = 5 oraz b = 8, wyznaczasz ręcznie lub w Pythonie odwrotność modularną liczby a modulo 26. Sprawdzasz, że dla a = 5 odwrotnością jest liczba 21, ponieważ iloczyn 5 * 21 daje 105, co przy dzieleniu przez 26 daje resztę 1. Wybierasz tekst jawny w języku polskim o długości minimum 100 znaków i normalizujesz go do wielkich liter bez znaków diakrytycznych.

Przechodzisz do serwisu dCode i konfigurujesz moduł szyfru afinicznego, wpisując parametry a = 5 oraz b = 8. Wykonujesz szyfrowanie i obserwujesz szyfrogram, zwracając uwagę na to, że litery tekstu jawnego zostały przemieszane w inny sposób niż w zwykłym szyfrze Cezara. Kopiujesz uzyskany szyfrogram i wklejasz go do formularza deszyfrowania w serwisie dCode, podając te same wartości parametrów.

Upewniasz się, że proces deszyfrowania poprawnie odtworzył tekst pierwotny przy użyciu wzoru d(y) = 21 * (y - 8) mod 26. W konsoli JSLinux tworzysz plik skryptu affine.py za pomocą edytora nano lub polecenia cat. Implementujesz w skrypcie prostą funkcję szyfrującą i deszyfrującą z obsługą wybranej pary kluczy. Uruchamiasz skrypt na swoim tekście i porównujesz wynik z wyjściem serwisu dCode.

Wykonujesz test z niedozwolonym parametrem a, na przykład a = 4 lub a = 13, obserwując kolizje i niemożność jednoznacznego odwrócenia funkcji. Wyjaśniasz w sprawozdaniu, dlaczego brak względnej pierwszości powoduje utratę jednoznaczności odwzorowania. Zestawiasz w tabeli wszystkie 12 wartości a wraz z odpowiadającymi im odwrotnościami modularnymi a^(-1) mod 26. Zapisujesz zrzuty ekranu z serwisu dCode oraz konsoli JSLinux jako dokumentację wykonanego zadania. Formułujesz podsumowanie techniczne ze wskazaniem podatności przestrzeni 312 kluczy na atak siłowy.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz w przeglądarce stronę dcode.fr/affine-cipher.
  2. Uruchom konsolę JSLinux i wpisz polecenie python3.
  3. W konsoli Pythona wyznacz dozwolone współczynniki a poleceniem: [x for x in range(26) if math.gcd(x, 26) == 1].
  4. Policz liczbę uzyskanych współczynników i wylicz przestrzeń kluczy 12 * 26 = 312.
  5. Oblicz odwrotność modularną dla a=5 za pomocą funkcji pow(5, -1, 26) w Pythonie.
  6. Przygotuj polski tekst techniczny o długości minimum 100 znaków bez spacji i znaków diakrytycznych.
  7. Wprowadź tekst do formularza szyfrowania w dCode, ustawiając parametry a=5, b=8.
  8. Pobierz szyfrogram i zweryfikuj szyfrowanie pierwszych trzech liter (np. KAT ->GIZ).
  9. W dCode przetestuj operację deszyfrowania przy tych samych kluczach.
  10. W JSLinux napisz krótki skrypt w Pythonie szyfrujący ciąg wejściowy wzorem (5*x + 8)%26.
  11. Uruchom skrypt i porównaj wygenerowany ciąg z wynikiem z serwisu dCode.
  12. Przetestuj próbę szyfrowania z parametrem a=2 lub a=13 i zbadaj powstałe kolizje liter.
  13. Wyjaśnij przyczynę kolizji w notatkach laboratoryjnych.
  14. Sporządź tabelę 12 dopuszczalnych wartości a oraz ich odwrotności modularnych modulo 26.
  15. Wykonaj zrzuty ekranu z serwisu dCode oraz konsoli JSLinux.
  16. Skompletuj materiały i opisz proces kryptoanalizy brute force przestrzeni 312 kluczy.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: lista 12 dopuszczalnych mnożników a (NWD(a,26)=1), obliczone odwrotności a⁻¹ mod 26 oraz szyfrogram dla konkretnej pary (a,b) zadanego tekstu.
  2. Dołączono 2–3 zrzuty z podpisami: szyfrowanie/deszyfrowanie w dCode oraz kontrolne obliczenie odwrotności w konsoli (Euklides / próby).
  3. Opisano w 2–3 zdaniach wybór narzędzi (dCode do weryfikacji, konsola do dowodu matematycznego) i zgodność wyników.
  4. Zapisano wnioski (3–5 zdań): warunek bijekcji, rola a⁻¹ w deszyfrowaniu, przestrzeń 312 kluczy wciąż trywialna dla brute force.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Dlaczego warunek NWD(a, 26) = 1 jest konieczny do zapewnienia bijekcji i jednoznacznego deszyfrowania.
  • W jaki sposób odwrotność modularna a^(-1) mod 26 jest wykorzystywana w algorytmie deszyfrującym.
  • Dlaczego przestrzeń 312 kluczy szyfru afinicznego wciąż stanowi znikomą barierę dla ataku siłowego na komputerze.
  • Student potrafi wyznaczyć parametry szyfru afinicznego matematycznie, skryptowo oraz w serwisie webowym.
Zadanie 3 - ilustracja
04/10
Zadanie 4. Analiza częstotliwości liter tekstu w języku polskim w Boxentriq i konsoli Linux
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + Boxentriq + Python 3
Podstawa wykładowa: Część 2 - slajdy 8, 12, 13, 14: teoria analizy częstotliwości, rozkłady liter w języku polskim i angielskim, stabilność statystyczna próbek, dwuznaki i trójznaki.

Cel

Celem ćwiczenia jest zbadanie statystycznej struktury języka polskiego i zrozumienie, dlaczego stałe rozkłady częstotliwości liter umożliwiają łamanie szyfrów monoalfabetycznych. Student przeprowadza analizę statystyczną tekstu w internetowym narzędziu Boxentriq oraz buduje potok uniksowy w JSLinux zliczający wystąpienia znaków, a następnie konfrontuje wyniki ze wzorcowym histogramem języka polskiego.

Scenariusz – opis

Do realizacji zadania wykorzystujesz serwis Boxentriq pod adresem boxentriq.com/code-breaking/text-analysis oraz konsolę JSLinux. Przygotowujesz obszerny fragment tekstu w języku polskim, na przykład artykuł naukowy lub opis techniczny liczący co najmniej 1500 znaków. W pierwszej fazie nie usuwasz polskich znaków diakrytycznych, aby zbadać ich wpływ na rozkład statystyczny. Wklejasz tekst do narzędzia Text Analysis w Boxentriq i uruchamiasz analizę. Zwracasz uwagę na wygenerowany wykres słupkowy oraz tabelę częstości procentowych poszczególnych liter.

Co ma wykonać student / grupa

Identyfikujesz najczęściej występujące litery w badanej próbce i porównujesz ich kolejność ze standardowym rozkładem polskim opisanym w wykładzie.

W kolejnym kroku przeprowadzasz normalizację tekstu, zastępując polskie litery diakrytyczne ich odpowiednikami łacińskimi. Ponownie uruchamiasz analizę w Boxentriq i odnotowujesz zmiany w proporcjach najpopularniejszych liter, takich jak A, E, O oraz I.

Przechodzisz do wirtualnej maszyny JSLinux i zapisujesz znormalizowany tekst do pliku tekst.txt za pomocą polecenia cat. Tworzysz potok uniksowy z narzędziami fold, tr, sort oraz uniq w celu policzenia liczby wystąpień każdej litery. Uruchamiasz potok poleceniem wypisującym litery posortowane malejąco według liczby ich wystąpień. Porównujesz wyjście terminala linuksowego z wykresem i tabelą wygenerowaną przez serwis Boxentriq.

Sprawdzasz także statystykę najczęstszych par liter, czyli digramów, takich jak cz, sz, ie czy en. W Boxentriq przełączasz widok na analizę n-gramów i rejestrujesz pięć najczęstszych digramów oraz trigramów.

W terminalu JSLinux piszesz jednolinijkowy skrypt w awk lub Pythonie, który wylicza procentowy udział samogłosek w badanym tekście. Zauważasz, że łączny udział samogłosek w języku polskim oscyluje wokół 40-45 procent, co stanowi kluczową cechę języka naturalnego. Wyjaśniasz, w jaki sposób kryptoanalityk wykorzystuje ten fakt do odróżnienia tekstu zaszyfrowanego podstawieniem od ciągu czysto losowego. Sporządzasz tabelę porównawczą zawierającą wzorcowe częstości liter języka polskiego oraz wyniki uzyskane z twojej próbki. Wykonujesz zrzuty ekranu wykresów z Boxentriq oraz wyników zliczania z konsoli JSLinux.

Formułujesz wnioski dotyczące wielkości badanej próbki tekstu i jej wpływu na zbieżność z rozkładem teoretycznym. Zbierasz wszystkie dane i zapisujesz je w czytelnej formie do raportu laboratoryjnego.

Przykładowe kroki do wykonania jako sugestia

  1. Wejdź na stronę serwisu Boxentriq (boxentriq.com/code-breaking/text-analysis).
  2. Uruchom maszynę wirtualną JSLinux Alpine w przeglądarce.
  3. Przygotuj reprezentatywny tekst techniczny w języku polskim o długości ponad 1500 znaków (minimum bezwzględne; ranking liter stabilizuje się dopiero powyżej około 1000 znaków - próbki krótsze niż 500 znaków mogą dać kolejność niezgodną ze wzorcem i taki rozjazd dokumentujesz jako wniosek, nie błąd).
  4. Wklej tekst do pola Text Analysis w Boxentriq i uruchom badanie.
  5. Zanotuj 5 najczęściej występujących liter oraz ich udziały procentowe.
  6. Zastąp litery ze znakami diakrytycznymi literami bazowymi według stałej reguły (stosuj ją w całym laboratorium): ą na a, ć na c, ę na e, ł na l, ń na n, ó na o, ś na s, ź i ż na z - i powtórz badanie. Porównując oba histogramy, odnotuj, jak dopisanie ą do A oraz ę do E wzmacnia pozycję samogłosek w rankingu.
  7. W JSLinux stwórz plik tekst.txt, wklejając przygotowaną treść.
  8. Wykonaj w konsoli zliczanie liter: tr -dc 'A-Za-z' < tekst.txt | fold -w1 | tr '[:lower:]' '[:upper:]' | sort | uniq -c | sort -nr | head -n 10.
  9. Porównaj wygenerowane statystyki z wykresem z Boxentriq.
  10. Zbadaj rozkład dwuznaków (digramów) w Boxentriq, odnotowując najczęstsze pary liter.
  11. W JSLinux policz łączną liczbę znaków za pomocą polecenia wc -m.
  12. Oblicz procentowy udział samogłosek (A, E, I, O, U, Y) w badanym tekście.
  13. Zestaw otrzymane wartości z tabelą wzorcową z wykładu (A, I, E, O, N, R...).
  14. Wykonaj zrzuty ekranu prezentujące histogramy i rankingi częstości w Boxentriq oraz JSLinux.
  15. Sporządź tabelę porównawczą rozkładu teoretycznego i empirycznego.
  16. Opracuj wnioski kryptoanalityczne na temat stabilności statystycznej języka naturalnego.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: histogram częstości liter PL (z Boxentriq i z konsoli sort|uniq -c), z odnotowaniem pozycji A, E, O oraz wpływu normalizacji znaków diakrytycznych.
  2. Dołączono 2–3 zrzuty z podpisami: wykres/tabela Boxentriq oraz potok linuksowy (tr, grep, sort) na tym samym korpusie.
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób przygotowania korpusu (min. 1000 znaków, normalizacja ą→a itd.).
  4. Zapisano wnioski (3–5 zdań): stabilność rozkładu w długich tekstach, rola digramów przy niejednoznaczności, zastosowanie do łamania podstawień.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Dlaczego rozkład częstości liter w języku polskim jest wysoce stabilny w długich tekstach.
  • W jaki sposób normalizacja znaków diakrytycznych wpływa na pozycję samogłosek A i E w rankingu.
  • Dlaczego znajomość częstotliwości digramów pozwala rozstrzygać wątpliwości niejednoznacznych liter.
  • Student potrafi przeprowadzić analizę statystyczną tekstu w narzędziach webowych i terminalu linuksowym.
Zadanie 4 - ilustracja
05/10
Zadanie 5. Ręczne i półautomatyczne łamanie monoalfabetycznego szyfru podstawieniowego
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + dCode + Boxentriq + Python 3
Podstawa wykładowa: Część 2 - slajdy 12, 13, 14: monoalfabetyczny szyfr podstawieniowy, przestrzeń 26! permutacji, wyciek statystyki języka, wzorce słów (np. ABAB), analiza n-gramów.

Cel

Celem zadania jest przeprowadzenie kryptoanalizy monoalfabetycznego szyfru podstawieniowego opartego na losowej permutacji całego alfabetu. Student przekonuje się w praktyce, że ogromna przestrzeń 26 silnia kluczy nie gwarantuje poufności, ponieważ statystyka języka przecieka w całości do szyfrogramu. Zadanie realizowane jest przy pomocy CyberChef oraz dedykowanego łamacza w Boxentriq lub dCode.

Scenariusz – opis

Rozpoczynasz ćwiczenie od przygotowania w języku polskim wiadomości o długości około 200-250 znaków. Otwierasz w przeglądarce serwis CyberChef oraz narzędzie Boxentriq Monoalphabetic Substitution Solver pod adresem boxentriq.com/code-breaking/cryptogram-solver. W CyberChef konfigurujesz operację losowej permutacji alfabetu lub używasz gotowej operacji zdefiniowanego podstawienia. Szyfrujesz swój tekst przygotowanym kluczem permutacyjnym, uzyskując szyfrogram o pozornie całkowicie chaotycznym układzie liter. Zapisujesz użyty klucz permutacji w celach późniejszej weryfikacji poprawności kryptoanalizy.

Co ma wykonać student / grupa

Kopiujesz uzyskany szyfrogram i wklejasz go do okna analizatora w serwisie Boxentriq lub dCode. Zanim uruchomisz automatyczne rozwiązanie, podejmujesz próbę ręcznego podstawienia najczęstszych liter. Identyfikujesz najczęstszą literę w szyfrogramie i przypisujesz jej roboczo literę A lub E zgodnie z zasadami poznanymi na wykładzie. Szukasz w szyfrogramie charakterystycznych powtórzeń literowych i wzorców wyrazowych, na przykład układów dwuliterowych lub słów z podwójnymi literami.

Zwracasz uwagę na krótkie słowa jedno- i dwuliterowe, które w języku polskim należą do bardzo ograniczonego zbioru. Krok po kroku uzupełniasz roboczą tabelę podstawień, obserwując, jak kolejne fragmenty wyrazów zaczynają nabierać sensu. W przypadku napotkania sprzeczności wycofujesz ostatnie przypisanie i testujesz alternatywną samogłoskę. Gdy odzyskasz co najmniej połowę tekstu metodą dedukcji, uruchamiasz automatyczny moduł rozwiązujący w Boxentriq.

Obserwujesz, jak algorytm heurystyczny dopasowuje pozostałe litery w oparciu o słownik i statystykę digramów. Porównujesz ostatecznie odzyskany tekst jawny z oryginałem, oceniając stopień wierności rekonstrukcji. Konfrontujesz odtworzony alfabet podstawień z zapisanym na początku tajnym kluczem permutacji. W terminalu JSLinux sprawdzasz za pomocą kalkulatora python3 rząd wielkości liczby 26 silnia (około 4 * 10^26).

Formułujesz wniosek, że mimo astronomicznej przestrzeni kluczy uniemożliwiającej brute force, szyfr został złamany w kilka minut. Opisujesz w sprawozdaniu rolę kontekstu językowego, n-gramów oraz wzorców wyrazowych w procesie łamania. Dołączasz zrzuty ekranu dokumentujące etapy ręcznego dopasowywania oraz finalne rozwiązanie. Weryfikujesz spójność zapisków i przygotowujesz podsumowanie eksperymentu.

Przykładowe kroki do wykonania jako sugestia

  1. Przygotuj polski tekst jawny o długości minimum 200 znaków (np. zarządzenie rektora).
  2. Otwórz stronę CyberChef i wygeneruj losową permutację alfabetu 26-literowego.
  3. Zaszyfruj tekst w CyberChef wygenerowaną permutacją i zachowaj klucz w notatkach.
  4. Otwórz narzędzie Boxentriq Cryptogram Solver (boxentriq.com/code-breaking/cryptogram-solver).
  5. Wklej szyfrogram do pola analizy i zbadaj histogram wystąpień liter.
  6. Wskaż najczęstszą literę szyfrogramu i postaw hipotezę o jej tożsamości (A lub E).
  7. Zidentyfikuj wzorce wyrazów (np. wyrazy 2-literowe, powtórzenia znaków).
  8. Przypisz ręcznie minimum 4 litery na podstawie analizy struktury tekstu.
  9. Zanotuj częściowo odszyfrowane fragmenty i zaobserwuj wyłaniające się rdzenie słów.
  10. Uruchom automatyczny solver w Boxentriq lub dCode Monoalphabetic Cipher. Uwaga praktyczna: solvery są trenowane głównie na tekstach angielskich, więc dla polszczyzny odzyskany tekst zwykle wymaga ręcznych poprawek (2–5 liter) - nie traktuj tego jako swojego błędu, tylko udokumentuj, które litery poprawiłeś i na jakiej podstawie (kontekst słowa, digram).
  11. Porównaj uzyskany przez narzędzie tekst z pierwotnym tekstem jawnym.
  12. Porównaj zrekonstruowany alfabet z tajnym kluczem permutacji wygenerowanym w CyberChef.
  13. W JSLinux uruchom Pythona i oblicz math.factorial(26), zapisując wynik w notatkach.
  14. Wskaż sprzeczność pomiędzy wielkością przestrzeni kluczy a faktycznym czasem kryptoanalizy.
  15. Wykonaj zrzuty ekranu z kolejnych etapów rekonstrukcji w Boxentriq.
  16. Sporządź raport dokumentujący metodykę ataku statystyczno-słownikowego.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: przechwycony szyfrogram, odzyskany tekst jawny oraz zrekonstruowany alfabet podstawienia (tabela 26 liter) wraz z logiem kolejnych podstawień.
  2. Dołączono 2–3 zrzuty z podpisami: analiza częstości, solver półautomatyczny (dCode) oraz końcowe dopasowanie słownikowe.
  3. Opisano w 2–3 zdaniach wybór narzędzi i strategię (najczęstsze litery → krótkie słowa → digramy).
  4. Zapisano wnioski (3–5 zdań): dlaczego 26! nie chroni przed statystyką, różnica brute force vs analiza, rola wzorców słów.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Dlaczego przestrzeń 26! nie zapewnia odporności na kryptoanalizę statystyczną.
  • W jaki sposób wzorce słów i ograniczenia słownikowe języka przyspieszają rekonstrukcję klucza.
  • Czym różni się bezpieczeństwo obliczeniowe wobec ataku siłowego od odporności na analizę statystyczną.
  • Student potrafi przeprowadzić analizę kryptoanalityczną prostego podstawienia monoalfabetycznego.
Zadanie 5 - ilustracja
06/10
Zadanie 6. Szyfr polialfabetyczny Vigenère – operacje na tabula recta i automatyzacja w CyberChef
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + Cryptii + Python 3
Podstawa wykładowa: Część 2 - slajdy 15, 16, 17, 18: szyfr Vigenère’a, idea polialfabetyczności, tabula recta Tritemiusza, dodawanie modulo 26, zacieranie rozkładu jednoliterowego.

Cel

Celem ćwiczenia jest poznanie mechanizmu szyfrowania polialfabetycznego na przykładzie szyfru Vigenère’a. Student uczy się ręcznego wyznaczania liter szyfrogramu przy pomocy tabula recta, bada efekt zacierania jednoliterowego histogramu częstości, a następnie weryfikuje proces szyfrowania i deszyfrowania w serwisie CyberChef oraz Cryptii z różnymi długościami haseł.

Scenariusz – opis

Zadanie rozpoczynasz od zapoznania się z konstrukcją tablicy 26 przesuniętych alfabetów zwanej tabula recta. Otwierasz w przeglądarce serwis CyberChef oraz narzędzie Cryptii pod adresem cryptii.com/pipes/vigenere-cipher. Równolegle uruchamiasz terminal JSLinux do prowadzenia testów statystycznych. Wybierasz krótką wiadomość jawną liczącą 15-20 liter, na przykład zdanie KRYPTOGRAFIA JEST NAUKA. Wybierasz pięcioliterowe słowo kluczowe, na przykład HASLO, i zapisujesz je cyklicznie powtórzone nad swoim tekstem jawnym.

Co ma wykonać student / grupa

Dla pierwszych pięciu liter wykonujesz szyfrowanie w pełni ręcznie, odczytując przecięcie wiersza klucza i kolumny tekstu jawnego. Obliczasz te same pozycje matematycznie za pomocą wzoru C_i = (P_i + K_i) mod 26, pamiętając o numerowaniu liter od 0 do 25. Zwracasz uwagę na fakt, że ta sama litera tekstu jawnego A szyfruje się do różnych liter szyfrogramu w zależności od pozycji w słowie kluczowym.

Teraz przygotowujesz dłuższy tekst jawny o długości co najmniej 300 znaków bez polskich znaków diakrytycznych. Wklejasz przygotowany tekst do serwisu CyberChef i dodajesz do Recipe operację Vigenère Encode. W polu Key podajesz wybrane hasło i generujesz szyfrogram. Kopiujesz wygenerowany szyfrogram i analizujesz jego histogram częstości za pomocą operacji Frequency Distribution w CyberChef.

Porównujesz ten histogram z histogramem uzyskanym dla szyfru Cezara w Zadaniu 1. Zauważasz wyraźne spłaszczenie słupków częstości, co dowodzi skutecznego zatarcia jednoliterowych cech języka.

Następnie w CyberChef testujesz proces deszyfrowania, stosując operację Vigenère Decode z tym samym hasłem. Weryfikujesz poprawność odzyskania pierwotnej wiadomości. W serwisie Cryptii powtarzasz szyfrowanie z bardzo krótkim kluczem dwuliterowym oraz z kluczem długim, obserwując różnice w rozkładzie znaków.

W konsoli JSLinux piszesz jednolinijkowe polecenie w Pythonie sprawdzające szyfrowanie słowa KRYPTOGRAFIA kluczem KLUCZ zgodnie z przykładem ze slajdu 17. Wszystkie wyniki, tabele ręcznych obliczeń oraz zrzuty ekranu zbierasz do dokumentacji laboratoryjnej. Opisujesz w sprawozdaniu, dlaczego prosta analiza częstotliwości liter zawodzi w zderzeniu z szyfrem Vigenère’a. Podsumowujesz ćwiczenie wnioskiem dotyczącym periodyczności jako nowo powstałej słabości systemu.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz stronę internetową Cryptii (cryptii.com/pipes/vigenere-cipher).
  2. Otwórz narzędzie CyberChef w sąsiedniej karcie przeglądarki.
  3. Przygotuj krótką frazę testową i dobierz 5-literowe słowo kluczowe (np. KLUCZ).
  4. Wykonaj ręczne szyfrowanie pierwszych 5 znaków przy użyciu tabula recta.
  5. Zweryfikuj ręczne obliczenia za pomocą wzoru arytmetyki modularnej mod 26.
  6. Wprowadź dłuższy tekst jawny (minimum 300 znaków) do CyberChef.
  7. Dodaj do Recipe operację Vigenère Encode i wpisz swoje hasło.
  8. Pobierz szyfrogram i dodaj w CyberChef operację Frequency Distribution.
  9. Zapisz otrzymany histogram i porównaj go z histogramem tekstu nieszyfrowanego.
  10. Zmień operację na Vigenère Decode i upewnij się, że odszyfrowany tekst jest poprawny.
  11. W Cryptii przetestuj szyfrowanie z kluczem o długości 2 znaków oraz 12 znaków.
  12. Porównaj stopień spłaszczenia rozkładu dla krótkiego i długiego hasła.
  13. W konsoli JSLinux uruchom Pythona i zweryfikuj przykład ze slajdu 17 (tekst KRYPTOGRAFIA..., klucz KLUCZ).
  14. Wykonaj zrzuty ekranu z CyberChef prezentujące szyfrogram i rozkład częstości.
  15. Sporządź tabelę porównawczą szyfrowania ręcznego i automatycznego dla pierwszych znaków.
  16. Sformułuj wnioski wyjaśniające eliminację jednoznacznego rozkładu liter w szyfrach polialfabetycznych.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: ręczne wyznaczenie min. 5 liter szyfrogramu via tabula recta (rozpisane wiersz+kolumna), szyfrogram CyberChef dla hasła min. 6 znaków oraz histogramy przed/po.
  2. Dołączono 2–3 zrzuty z podpisami: fragment tabula recta / obliczenia ręczne oraz szyfrowanie w CyberChef z widocznym kluczem.
  3. Opisano w 2–3 zdaniach wybór narzędzi (ręka do zrozumienia, CyberChef do automatyzacji i histogramu).
  4. Zapisano wnioski (3–5 zdań): zacieranie histogramu przez polialfabetyczność, wpływ długości klucza, periodyczność jako punkt zaczepienia Kasiskiego.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Na czym polega przewaga szyfru polialfabetycznego nad monoalfabetycznym w kontekście analizy częstotliwości.
  • Dlaczego długość słowa kluczowego bezpośrednio wpływa na stopień spłaszczenia histogramu częstości liter.
  • W jaki sposób periodyczne powtarzanie klucza staje się punktem wyjścia do zaawansowanej kryptoanalizy.
  • Student potrafi posługiwać się tabula recta oraz narzędziami automatycznymi do szyfrowania Vigenère’a.
Zadanie 6 - ilustracja
07/10
Zadanie 7. Szyfr płotowy (Rail Fence) – mechanizm zygzaka i łamanie małej liczby poziomów
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + dCode
Podstawa wykładowa: Część 2 - slajdy 5, 26, 30: szyfry przestawieniowe (transpozycyjne), szyfr płotowy (rail fence), zachowanie tożsamości liter, zmiana kolejności, mała przestrzeń kluczy.

Cel

Celem zadania jest zapoznanie się z klasycznymi technikami przestawieniowymi na przykładzie szyfru płotowego (Rail Fence). Student bada odmienność transpozycji od podstawienia, rysuje ścieżkę zygzaka dla różnej liczby poziomów (szyn), weryfikuje szyfrowanie w CyberChef oraz dCode, a także przeprowadza skuteczny atak brute force wynikający z ograniczonej liczby poziomów.

Scenariusz – opis

W ramach tego ćwiczenia badasz pierwszą z omawianych technik przestawieniowych, w której litery nie zmieniają swojej tożsamości, lecz wyłącznie pozycję. Otwierasz w przeglądarce narzędzie CyberChef oraz serwis dCode pod adresem dcode.fr/rail-fence-cipher. W konsoli JSLinux przygotowujesz terminal do zliczania liter i weryfikacji anagramów. Przygotowujesz tekst jawny w języku polskim o długości 60-80 znaków, na przykład zdanie informujące o terminie kolokwium. Na kartce papieru lub w edytorze tekstowym rozpisujesz ręcznie ścieżkę zygzaka dla 3 poziomów (szyn) płotu.

Co ma wykonać student / grupa

Wpisujesz kolejne litery tekstu ruchem ukośnym w dół i w górę, odbijając się od skrajnych poziomów płotu. Odczytujesz litery wierszami od góry do dołu, tworząc ciąg zaszyfrowany. Wklejasz oryginalny tekst do CyberChef i wyszukujesz operację Rail Fence Cipher. W parametrach operacji ustawiasz parametr Key na 3 poziomy i parametr Offset na 0. Porównujesz wygenerowany przez CyberChef szyfrogram ze swoimi ręcznymi obliczeniami, upewniając się co do poprawności metody.

W terminalu JSLinux uruchamiasz polecenie zliczające wystąpienia liter w tekście jawnym oraz w uzyskanym szyfrogramie. Potwierdzasz, że histogram jednoliterowy jest w obu przypadkach w stu procentach identyczny, co stanowi niezaprzeczalny dowód techniki transpozycyjnej. Następnie w CyberChef zmieniasz liczbę poziomów na 4 oraz na 5, obserwując zmiany w strukturze szyfrogramu.

Przechodzisz do serwisu dCode i wklejasz szyfrogram wygenerowany dla nieznanej liczby poziomów. Uruchamiasz moduł automatycznego łamania dCode, który testuje kolejne liczby poziomów od 2 do długości tekstu. Zauważasz, że ze względu na niewielką liczbę sensownych poziomów (zwykle od 2 do kilkunastu) atak siłowy jest natychmiastowy. Identyfikujesz właściwy poziom płotu i odzyskujesz czytelny tekst jawny. Analizujesz, dlaczego szyfr płotowy bez dodatkowego podstawienia nie stanowi skutecznego zabezpieczenia.

Wykonujesz zrzuty ekranu ilustrujące ręczną siatkę płotu, konfigurację w CyberChef oraz wynik łamania w dCode. Zestawiasz otrzymane rezultaty w sprawozdaniu laboratoryjnym wraz z opisem cech diagnostycznych transpozycji. Sprawdzasz kompletność materiałów dowodowych przed zakończeniem pracy nad zadaniem.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz w przeglądarce stronę CyberChef oraz dcode.fr/rail-fence-cipher.
  2. Uruchom maszynę wirtualną JSLinux Alpine.
  3. Przygotuj zdanie testowe o długości 60-80 znaków bez spacji.
  4. Rozrysuj na kartce siatkę płotu o 3 poziomach i wpisz litery ruchem zygzakowatym.
  5. Odczytaj litery poziom po poziomie i zanotuj powstały szyfrogram.
  6. Wprowadź tekst do panelu Input w CyberChef.
  7. Dodaj do Recipe operację Rail Fence Cipher z kluczem 3.
  8. Porównaj wyjście CyberChef z wynikiem uzyskanym ręcznie.
  9. W JSLinux sprawdź identyczność zbioru liter: echo 'tekst' | fold -w1 | sort | uniq -c.
  10. Wykonaj to samo sprawdzenie dla szyfrogramu i wykaż tożsamość histogramu.
  11. W CyberChef przetestuj klucze o wartości 4 i 5, notując zmiany w wyjściu.
  12. W JSLinux udowodnij najpierw, że masz do czynienia z transpozycją: policz histogram liter tekstu jawnego i szyfrogramu (echo 'TEKST' | fold -w1 | sort | uniq -c | sort -nr) i wykaż ich identyczność - dopiero ten wynik uprawnia do ataku siłowego po liczbie poziomów, a nie odwrotnie.
  13. Wklej szyfrogram o nieznanym kluczu do serwisu dCode.
  14. Uruchom opcję brute force w dCode i zlokalizuj oryginalną wiadomość.
  15. Wykonaj zrzut ekranu prezentujący analizę siłową w dCode.
  16. Sporządź tabelę zestawiającą liczbę poziomów, długość cyklu zygzaka i czytelność tekstu.
  17. Sformułuj wnioski dotyczące podatności prostych transpozycji na ataki komputerowe.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: rozrysowane ścieżki zygzaka dla 2 i 3 szyn, szyfrogramy dla obu wariantów oraz log przeglądu wszystkich dopuszczalnych poziomów ze wskazaniem trafienia.
  2. Dołączono 2–3 zrzuty z podpisami: rysunek zygzaka, szyfrowanie w narzędziu webowym oraz wynik łamania małą przestrzenią.
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób rozpoznania transpozycji (identyczny histogram liter).
  4. Zapisano wnioski (3–5 zdań): transpozycja vs podstawienie, znikoma przestrzeń poziomów, histogram jako demaskator.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Czym różni się zachowanie statystyki liter w szyfrach transpozycyjnych od szyfrów podstawieniowych.
  • Dlaczego mała liczba potencjalnych poziomów płotu czyni szyfr bezbronnym wobec prostego przeglądu.
  • W jaki sposób identyfikacja niezmienionego histogramu liter pozwala rozpoznać szyfr przestawieniowy.
  • Student potrafi ręcznie rozrysować zygzak szyfru płotowego i złamać go narzędziami sieciowymi.
Zadanie 7 - ilustracja
08/10
Zadanie 8. Pojedyncza transpozycja kolumnowa – zapis macierzowy i porządkowanie według słowa kluczowego
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + dCode + Python 3
Podstawa wykładowa: Część 2 - slajdy 26, 27, 28: transpozycja kolumnowa pojedyncza, zapis wierszami, odczyt kolumnami, klucz w postaci słowa, porządek alfabetyczny kolumn, niszczenie n-gramów.

Cel

Celem zadania jest praktyczne przećwiczenie transpozycji kolumnowej z kluczem słownym. Student uczy się wpisywania wiadomości do prostokątnej macierzy wierszami oraz jej odczytu kolumnami zgodnie z porządkiem alfabetycznym liter klucza. Ponadto student weryfikuje szyfrowanie w CyberChef oraz dCode i bada, jak transpozycja rozbija naturalne dwuznaki przy zachowaniu statystyki jednoliterowej.

Scenariusz – opis

W tym zadaniu przechodzisz do badania bardziej zaawansowanej techniki przestawieniowej, jaką jest transpozycja kolumnowa. Otwierasz w przeglądarce serwis CyberChef oraz narzędzie Columnar Transposition w serwisie dCode pod adresem dcode.fr/columnar-transposition-cipher. W konsoli JSLinux uruchamiasz środowisko Python do weryfikacji operacji macierzowych. Przygotowujesz tekst jawny w języku polskim liczący dokładnie 48 znaków, na przykład komunikat o bezpieczeństwie sieciowym. Wybierasz sześcioliterowe słowo kluczowe, na przykład ZAMEK lub KRYPTO, w którym litery po uporządkowaniu alfabetycznym określą kolejność odczytu kolumn.

Co ma wykonać student / grupa

Wyznaczasz porządek numeryczny kolumn na podstawie pozycji liter klucza w alfabecie łacińskim. Rysujesz tabelę o 6 kolumnach i 8 wierszach, a następnie wpisujesz do niej tekst jawny wiersz po wierszu od lewej do prawej. Odczytujesz zawartość tabeli kolumnami, zaczynając od kolumny oznaczonej cyfrą 1, a kończąc na kolumnie z najwyższym numerem. Zapisujesz ręcznie uzyskany szyfrogram i sprawdzasz, czy liczba liter w szyfrogramie zgadza się z tekstem jawnym.

Przechodzisz do serwisu dCode i konfigurujesz moduł transpozycji kolumnowej, wprowadzając swój tekst oraz słowo kluczowe. Porównujesz wygenerowany przez dCode szyfrogram ze swoim wynikiem ręcznym, weryfikując poprawność odczytu poszczególnych kolumn. W CyberChef sprawdzasz dostępne operacje przestawieniowe lub implementujesz odczyt kolumnowy przy użyciu prostego skryptu w JSLinux.

W terminalu JSLinux piszesz jednolinijkowy skrypt w Pythonie, który tworzy macierz z tekstu wejściowego i permutuje kolumny według podanego klucza. Uruchamiasz skrypt i porównujesz wynik ze stroną dCode. Badaj zachowanie digramów w tekście: sprawdzasz, co stało się z typowymi parami liter, takimi jak 'pr', 'st' czy 'ie'. Zauważasz, że transpozycja skutecznie rozbiła sąsiadujące litery, rozrzucając je po różnych partiach szyfrogramu.

Jednocześnie weryfikujesz za pomocą poleceń uniksowych, że ogólny histogram częstości liter pozostał nienaruszony. Testujesz operację deszyfrowania w dCode, odtwarzając oryginalny tekst z szyfrogramu przy znajomości słowa kluczowego. Wykonujesz zrzuty ekranu tabeli macierzowej, konfiguracji w dCode oraz wyjścia skryptu w JSLinux. Sporządzasz sprawozdanie z opisem matematycznym permutacji kolumnowej i analizą jej odporności. Upewniasz się, że wszystkie kroki zostały przejrzyście udokumentowane.

Przykładowe kroki do wykonania jako sugestia

  1. Wejdź na stronę dcode.fr/columnar-transposition-cipher.
  2. Uruchom konsolę JSLinux Alpine.
  3. Przygotuj polski tekst jawny o długości równej wielokrotności klucza (np. 48 znaków).
  4. Wybierz 6-literowe słowo kluczowe (np. WEKTOR) i ponumeruj jego litery alfabetycznie.
  5. Rozrysuj na kartce macierz 8x6 i wypełnij ją tekstem jawnym wierszami.
  6. Odczytaj kolumny w kolejności wyznaczonej przez alfabetyczny porządek liter klucza.
  7. Zanotuj ręcznie wyznaczony szyfrogram.
  8. Wprowadź tekst i klucz do formularza szyfrowania w dCode.
  9. Porównaj wygenerowany ciąg znaków z wynikiem ręcznym.
  10. W JSLinux stwórz prosty skrypt w Pythonie realizujący transpozycję kolumnową.
  11. Uruchom skrypt poleceniem python3 skrypt.py i potwierdź zgodność wyników.
  12. Zbadaj rozbicie naturalnych digramów w szyfrogramie w porównaniu z tekstem jawnym.
  13. W dCode przetestuj proces deszyfrowania z wykorzystaniem tego samego słowa kluczowego.
  14. Wykonaj mini-analizę siłową na papierze: dla klucza 6-literowego policz 6! = 720 możliwych permutacji kolumn i wyjaśnij, dlaczego przy tak małej przestrzeni pełny atak brute force jest wykonalny ręcznie lub skryptem, natomiast statystyka jednoliterowa nie odróżnia żadnej permutacji (histogram identyczny dla wszystkich 720 wariantów) - to jest istota słabości transpozycji.
  15. Zbadaj zachowanie metody w przypadku tekstu o długości niewypełniającej w pełni prostokąta.
  16. Wykonaj zrzuty ekranu z dCode oraz terminala JSLinux.
  17. Sformułuj wnioski dotyczące niszczenia n-gramów przy niezmienionym rozkładzie jednoliterowym.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: macierz z wpisanym tekstem wierszami, wyznaczona permutacja kolumn z porządku alfabetycznego klucza (z obsługą powtórzonych liter) oraz szyfrogram i poprawne deszyfrowanie.
  2. Dołączono 2–3 zrzuty z podpisami: macierz robocza, narzędzie webowe (szyfrowanie) oraz weryfikacja deszyfrowania w konsoli.
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób rozstrzygnięcia duplikatów liter klucza.
  4. Zapisano wnioski (3–5 zdań): niszczenie n-gramów, jednoznaczna demaskacja histogramem jednoliterowym, rola klucza w permutacji.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

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 transpozycja kolumnowa niszczy naturalne n-gramy języka naturalnego.
  • Dlaczego analiza częstotliwości jednoliterowej bez trudu demaskuje transpozycję.
  • Jak porządek alfabetyczny liter klucza determinuje permutację kolumn macierzy.
  • Student potrafi ręcznie oraz narzędziowo zrealizować szyfrowanie i deszyfrowanie transpozycją kolumnową.
Zadanie 8 - ilustracja
09/10
Zadanie 9. Szyfr digramowy Playfair – konstrukcja matrycy 5x5 i reguły szyfrowania par liter
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + dCode + Cryptii
Podstawa wykładowa: Część 2 - slajdy 22, 23, 24, 25: szyfr Playfair (od 1854), matryca 5x5, scalenie I/J, podział na digramy, litera dopełniająca X, trzy reguły szyfrowania par liter, cechy kryptoanalityczne.

Cel

Celem ćwiczenia jest poznanie pierwszego w historii praktycznego szyfru podstawienia digramowego – szyfru Playfair. Student konstruuje matrycę 5x5 na bazie słowa kluczowego, przyswaja trzy geometryczne reguły szyfrowania par liter (ten sam wiersz, ta sama kolumna, prostokąt), wykonuje ręczne szyfrowanie krótkiego tekstu, a następnie weryfikuje operację w serwisach Cryptii oraz dCode.

Scenariusz – opis

W tym ćwiczeniu poznajesz szyfr Playfair, który w odróżnieniu od prostych podstawień przetwarza tekst parami liter (digramami). Otwierasz w przeglądarce serwis Cryptii pod adresem cryptii.com/pipes/playfair-cipher oraz dCode pod adresem dcode.fr/playfair-cipher. W konsoli JSLinux uruchamiasz środowisko robocze do notowania macierzy i przetwarzania tekstu. Wybierasz słowo kluczowe bez powtarzających się liter, na przykład MONARCHY lub PROJEKT. Konstruujesz na kartce lub w edytorze matrycę o wymiarach 5 na 5, wpisując najpierw unikalne litery klucza, a następnie dopełniając ją pozostałymi literami alfabetu łacińskiego.

Co ma wykonać student / grupa

Pamiętasz o konieczności scalenia liter I oraz J w jedno pole matrycy, aby zmieścić 26 liter alfabetu w 25 komórkach. Przygotowujesz tekst jawny w języku polskim, usuwając znaki diakrytyczne i spacje. Dzielisz tekst na pary liter, zwracając uwagę na sytuację, gdy w parze pojawią się dwie jednakowe litery. Wstawiasz literę dopełniającą X pomiędzy powtórzone litery oraz na koniec tekstu, jeśli całkowita liczba znaków jest nieparzysta.

Stosujesz trzy reguły geometryczne szyfrowania Playfair dla każdej pary liter z osobna. Dla liter w tym samym wierszu przesuwasz się o jedno pole w prawo z zawijaniem wiersza. Dla liter w tej samej kolumnie przesuwasz się o jedno pole w dół z zawijaniem kolumny. Dla liter tworzących narożniki prostokąta wybierasz litery leżące w tym samym wierszu w przeciwległych rogach. Zapisujesz ręcznie wyznaczony szyfrogram dla pierwszych 6-8 par liter.

Przechodzisz do serwisu Cryptii, konfigurujesz szyfr Playfair z wybranym słowem kluczowym i weryfikujesz uzyskane digramy. Testujesz ten sam tekst w serwisie dCode, upewniając się, że obie implementacje stosują identyczne reguły dopełniania literą X. Analizujesz strukturę szyfrogramu pod kątem kryptoanalitycznym i odnotowujesz, że żaden digram nie może składać się z dwóch takich samych liter. Sprawdzasz operację deszyfrowania w Cryptii, weryfikując reguły odwrotne (przesunięcie w lewo, w górę, zamiana rogów prostokąta). Wykonujesz zrzuty ekranu przedstawiające matrycę 5x5, podział na digramy oraz okno narzędzia Cryptii.

Formułujesz podsumowanie techniczne, wyjaśniając, jak szyfrowanie par liter utrudnia prostą analizę częstości pojedynczych znaków. Sprawdzasz poprawność i kompletność wykonanej dokumentacji laboratoryjnej.

Przykładowe kroki do wykonania jako sugestia

  1. Otwórz w przeglądarce stronę cryptii.com/pipes/playfair-cipher.
  2. Otwórz stronę dcode.fr/playfair-cipher w drugiej karcie.
  3. Uruchom maszynę wirtualną JSLinux Alpine.
  4. Wybierz słowo kluczowe (np. HETMAN) i usuń powtarzające się litery.
  5. Zbuduj ręcznie matrycę 5x5, wypełniając ją najpierw kluczem, a potem resztą alfabetu ze scaleniem I/J.
  6. Przygotuj tekst jawny (np. TAJNA WIADOMOSC) i podziel go na pary liter.
  7. Podziel tekst na pary ściśle według algorytmu: (a) najpierw zamień J na I w całym tekście; (b) idź od lewej i tnij na pary - jeżeli para ma dwie jednakowe litery (np. LL), wstaw X między nie (LXL…) i tnij resztę od nowa; (c) jeżeli na końcu zostanie pojedyncza litera, dopisz X. Przykład: BALLOON zamienia się w BA LX LO ON (dublet LL rozbity iksem), a nieparzyste ABCDE w AB CD EX. Uwaga: Cryptii i dCode mogą różnić się obsługą iksa przy nieparzystym ogonie - rozbieżność implementacji odnotuj w raporcie, zamiast uznawać ją za swój błąd.
  8. Zastosuj regułę prostokąta do pierwszej pary liter i odczytaj szyfr.
  9. Zastosuj regułę wiersza i kolumny do kolejnych par wymagających tych operacji.
  10. Wprowadź tekst i klucz do modułu Playfair w Cryptii i porównaj wyniki.
  11. Przetestuj ten sam proces w serwisie dCode i zweryfikuj reguły dopełniania znakiem X.
  12. Wykonaj deszyfrowanie w Cryptii, sprawdzając odzyskanie pierwotnego tekstu z usunięciem liter X.
  13. Zbadaj cechy szczególne szyfrogramu: potwierdź brak digramów o identycznych literach (np. brak AA, BB).
  14. W JSLinux stwórz tabelę w pliku tekstowym obrazującą podział na pary przed i po szyfrowaniu.
  15. Wykonaj zrzuty ekranu z matrycą i wynikami z serwisów internetowych.
  16. Sformułuj wnioski wyjaśniające, dlaczego szyfrowanie digramów podnosi próg trudności kryptoanalizy.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: matryca 5×5 zbudowana ze słowa kluczowego (złączenie I/J, bez powtórzeń), szyfrowanie min. 3 digramów — po jednym na regułę wiersz/kolumna/prostokąt — oraz obsługa dubletu (wstawka X) i nieparzystej długości.
  2. Dołączono 2–3 zrzuty z podpisami: matryca, szyfrowanie w narzędziu oraz kontrolne deszyfrowanie zwrotne.
  3. Opisano w 2–3 zdaniach wybór narzędzi i sposób przygotowania tekstu (podział na pary, reguły).
  4. Zapisano wnioski (3–5 zdań): rozszerzenie jednostek do 676 digramów, ograniczenia (brak AA, brak J), samoodwracalność prostokąta.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

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 operowanie na digramach rozszerza przestrzeń jednostek szyfrowania z 26 do 676 par.
  • Jakie ograniczenia strukturalne posiada szyfr Playfair (np. niemożność wygenerowania digramu o tych samych literach).
  • Dlaczego reguła prostokąta jest samoodwracalna przy zamianie wierszy na kolumny.
  • Student potrafi skonstruować matrycę 5x5 Playfair i poprawnie zastosować wszystkie reguły szyfrowania i deszyfrowania.
Zadanie 9 - ilustracja
10/10
Zadanie 10. Eksploracja symulatora maszyny Enigma i weryfikacja zasady braku stałych punktów
🖥️ Wymagane środowisko:
System: Windows (bez praw administratora) + JSLinux Alpine w przeglądarce
Oprogramowanie: przeglądarka + CyberChef + Python 3 + symulator Enigmy
Podstawa wykładowa: Część 2 - slajdy 33, 34, 35: maszyny szyfrujące, Enigma, wirniki I-III, walec odwracający (reflektor), łącznica kablowa (Steckerbrett), klucz dzienny, brak stałych punktów (litera nie szyfruje się sama w sobie).

Cel

Celem zadania jest zapoznanie się z budową i działaniem elektromechanicznej maszyny szyfrującej Enigma przy użyciu symulatora internetowego. Student konfiguruje bębny szyfrujące, reflektor oraz pozycje początkowe, szyfruje depeszę wojskową, weryfikuje samoodwracalność procesu oraz bada kluczową słabość konstrukcyjną polegającą na braku punktów stałych (żadna litera nigdy nie szyfruje się sama w sobie).

Scenariusz – opis

W ostatnim zadaniu tego zestawu badasz działanie słynnej niemieckiej maszyny szyfrującej Enigma, stanowiącej szczytowe osiągnięcie techniki wirnikowej. Otwierasz w przeglądarce darmowy symulator maszyny Enigma pod adresem 101computing.net/enigma-machine-emulator lub symulator Enigmy w CyberChef. W terminalu JSLinux uruchamiasz interpreter Pythona do porównania znak po znaku tekstu jawnego i szyfrogramu. Zapoznajesz się z głównymi modułami maszyny: klawiaturą wejściową, łącznicą kablową (Steckerbrett), trzema wirnikami obrotowymi oraz bębnem odwracającym (reflektorem). Ustawiasz konfigurację bazową maszyny: wirniki w kolejności I, II, III od lewej do prawej, reflektor B oraz pozycje pierścieni Ringstellung na wartości domyślne A-A-A.

Co ma wykonać student / grupa

Ustawiasz pozycję początkową wirników (Grundstellung) na wybraną kombinację trzech liter, na przykład K-L-U. Na tym etapie pozostawiasz łącznicę kablową pustą bez żadnych połączeń wtykowych. Wpisujesz powoli na klawiaturze symulatora komunikat testowy liczący co najmniej 40 liter, obserwując zapalające się lampki na tablicy świetlnej. Zwracasz uwagę na mechanizm krokowego obracania się wirników: prawy wirnik obraca się przy każdym naciśnięciu klawisza, środkowy i lewy po osiągnięciu wycięć. Zapisujesz wygenerowany szyfrogram w notatkach laboratoryjnych.

Teraz przestawiasz wirniki symulatora z powrotem na identyczną pozycję początkową K-L-U. Wpisujesz do maszyny uzyskany przed chwilą szyfrogram i obserwujesz rozświetlające się lampki. Potwierdzasz, że maszyna natychmiast odszyfrowuje tekst, przywracając oryginalną wiadomość jawną dzięki obecności reflektora. W kolejnym kroku badasz fundamentalną wadę konstrukcyjną Enigmy, która umożliwiła jej złamanie polskim matematykom pod kierunkiem Mariana Rejewskiego.

W konsoli JSLinux piszesz jednolinijkowy skrypt w Pythonie, który porównuje tekst jawny i szyfrogram pozycja po pozycji i sprawdza, czy P[i] == C[i]. Przekonujesz się, że na żadnej pozycji litera zaszyfrowana nie jest równa literze jawnej, co wynika z zamknięcia obwodu prądu przez reflektor.

Następnie modyfikujesz konfigurację maszyny, dodając 3 pary połączeń na łącznicy kablowej Steckerbrett (na przykład A-D, C-N, X-Z). Powtarzasz szyfrowanie tego samego tekstu przy tej samej pozycji wirników i obserwujesz całkowicie odmienny szyfrogram. Wykonujesz zrzuty ekranu symulatora przedstawiające ustawienia wirników, łącznicę oraz panel lampek. Sporządzasz sprawozdanie, w którym opisujesz mechanizm działania Enigmy, rolę reflektora oraz znaczenie braku punktów stałych dla kryptoanalizy. Podsumowujesz zdobyte doświadczenie i weryfikujesz kompletność wszystkich materiałów raportu.

Przykładowe kroki do wykonania jako sugestia

  1. Wejdź na stronę symulatora Enigmy (101computing.net/enigma-machine-emulator lub CyberChef Enigma).
  2. Uruchom konsolę JSLinux Alpine.
  3. Skonfiguruj kolejność wirników na I, II, III oraz reflektor B.
  4. Ustaw pozycje pierścieni (Ringstellung) na A-A-A.
  5. Ustaw pozycję początkową bębnów (Grundstellung) na wybraną kombinację (np. K-L-U).
  6. Pozostaw łącznicę kablową (Plugboard) bez połączeń.
  7. Wprowadź tekst jawny (minimum 40 znaków) i zapisz pojawiający się szyfrogram.
  8. Zaobserwuj obrót prawego wirnika przy każdym naciśniętym znaku.
  9. Zresetuj bębny maszyny do pozycji wyjściowej K-L-U.
  10. Wprowadź wygenerowany szyfrogram i zweryfikuj poprawne odszyfrowanie depeszy.
  11. W JSLinux uruchom Pythona i porównaj ciągi znaków: all(p != c for p, c in zip( jawny, szyfrogram)).
  12. Potwierdź, że warunek p != c jest spełniony dla stu procent znaków (brak punktów stałych).
  13. Dodaj 3 połączenia na łącznicy kablowej (np. AD, CN, XZ) i powtórz szyfrowanie.
  14. Zaobserwuj, jak zmiana w łącznicy całkowicie modyfikuje wynik przy tych samych bębnach.
  15. Wykonaj zrzuty ekranu symulatora z widokiem wirników i tablicy wtykowej.
  16. Sformułuj wnioski wyjaśniające, w jaki sposób brak punktów stałych ułatwił kryptoanalizę Enigmy.

Kontrola zaliczenia (checklist):

  1. Zachowano artefakt: zapis konfiguracji Enigmy (walce, ringi, pozycje startowe, reflektor, min. 2 pary Stecker) + szyfrogram depeszy + dowód samoodwracalności (ponowne szyfrowanie = tekst jawny) + test braku punktów stałych na min. 20 literach (E(x)≠x).
  2. Dołączono 2–3 zrzuty z podpisami: panel konfiguracji symulatora, szyfrowanie oraz weryfikacja zwrotna.
  3. Opisano w 2–3 zdaniach wybór symulatora i sposób kontroli ustawień (zrzut konfiguracji + log).
  4. Zapisano wnioski (3–5 zdań): reflektor = inwolucja kosztem punktów stałych, luka dla Rejewskiego/Turinga, łącznica zwiększa klucze lecz nie usuwa wady.

Wariant offline (fallback): Brak sieci/JSLinux: praca na wektorach ze startera w lokalnym terminalu/edytorze; narzędzia webowe (CyberChef, dCode, Boxentriq, symulator Enigmy) zastąp opisem z cache, obliczeniami ręcznymi i poleceniami tr/sort/uniq; do sprawozdania dołącz pliki .txt z kopiami wyników.

Sugerowane wnioski i podsumowanie - co student ma osiągnąć

Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:

  • Jak obecność reflektora zapewnia samoodwracalność maszyny kosztem eliminacji punktów stałych.
  • Dlaczego cecha E(x) != x stanowiła krytyczną lukę wykorzystaną przez Rejewskiego i Turinga.
  • W jaki sposób łącznica kablowa radykalnie zwiększała przestrzeń kluczy, nie usuwając wad reflektora.
  • Student potrafi poprawnie skonfigurować symulator Enigmy i wykazać jego specyficzne właściwości kryptoanalityczne.
Zadanie 10 - ilustracja
Podgląd