Podstawa wykładowa: Część 2 - slajdy 26, 27, 31, 42: szyfry przestawieniowe, podwójna transpozycja kolumnowa, rozbijanie n-gramów, zachowanie rozkładu
jednoliterowego, wzrost trudności kryptoanalizy w stosunku do pojedynczej transpozycji.
Cel
Celem zadania jest zbadanie mechanizmu oraz właściwości bezpieczeństwa podwójnej transpozycji kolumnowej. Student implementuje w Pythonie algorytm podwójnego szyfrowania
przestawieniowego z dwoma niezależnymi słowami kluczowymi, bada zachowanie statystyk jednoliterowych oraz stopień destrukcji naturalnych digramów języka polskiego, a także weryfikuje
operację w serwisie CyberChef i dCode.
Scenariusz – opis
W tym zadaniu badasz technikę podwójnego przestawienia, która przez dziesięciolecia uchodziła za najsilniejszy szyfr polowy stosowany w łączności wojskowej. Uruchamiasz
przeglądarkę internetową, otwierasz serwis CyberChef, dCode Double Columnar Transposition oraz terminal JSLinux. Wybierasz polski tekst techniczny liczący dokładnie 64 lub 80 znaków, tak
aby dał się podzielić na równe prostokąty macierzowe. Wybierasz dwa różne słowa kluczowe o różnych długościach, na przykład klucz K1 o długości 5 liter (np. WIATR) oraz klucz K2 o
długości 7 liter (np. SAMOLOT). W konsoli JSLinux tworzysz plik double_transposition.py w języku Python.
Co ma wykonać student / grupa
Implementujesz funkcję pojedynczej transpozycji kolumnowej przyjmującą tekst jawny oraz słowo kluczowe wyznaczające kolejność odczytu kolumn.
Następnie tworzysz funkcję podwójnej transpozycji, która przepuszcza wynik pierwszego przestawienia przez drugi prostokąt z drugim kluczem. Szyfrujesz swój tekst testowy i
wypisujesz na ekranie: tekst pierwotny, szyfrogram pośredni po pierwszej transpozycji oraz szyfrogram końcowy po drugiej transpozycji. Przechodzisz do serwisu
CyberChef i budujesz recepturę Recipe składającą się z dwóch kolejnych operacji
przestawieniowych lub weryfikujesz wynik w serwisie dCode. Upewniasz się, że wynik działania
twojego skryptu jest w pełni zgodny ze standardowymi implementacjami.
W kolejnym kroku przeprowadzasz badanie kryptoanalityczne: zliczasz wystąpienia liter w tekście jawnym oraz w szyfrogramie podwójnym. Potwierdzasz, że histogram
jednoliterowy jest całkowicie identyczny we wszystkich trzech stadiach, co jest nieodłączną cechą szyfrów przestawieniowych.
Następnie w skrypcie implementujesz moduł zliczający wystąpienia sąsiednich par liter (digramów) w tekście jawnym, szyfrogramie pojedynczym oraz podwójnym. Analizujesz, ile
naturalnych polskich digramów (np. st, pr, po, na, ie) przetrwało po pierwszej transpozycji, a ile po drugiej. Odnotowujesz, że pojedyncza transpozycja pozostawia całe pionowe segmenty
kolumn nienaruszone, co pozwala kryptoanalitykowi sklejać sąsiednie kolumny. Druga transpozycja z kluczem o innej długości całkowicie rozbija te segmenty, niszcząc niemal sto procent
powiązań digramowych.
Implementujesz w skrypcie procedurę deszyfrującą, pamiętając o konieczności odwrócenia operacji w ściśle odwrotnej kolejności (najpierw K2, potem K1). Weryfikujesz poprawne
odzyskanie tekstu wyjściowego z szyfrogramu końcowego. Wykonujesz zrzuty ekranu kodu w
JSLinux, tabel macierzowych obu etapów oraz wyników analizy digramów. Sporządzasz
tabelę porównującą zachowanie n-gramów dla tekstu jawnego, pojedynczej transpozycji oraz podwójnej transpozycji. Formułujesz podsumowanie techniczne wyjaśniające, dlaczego złożenie
dwóch permutacji tworzy jakościowo nową barierę analityczną.
Przykładowe kroki do wykonania jako sugestia
- Otwórz w przeglądarce serwis CyberChef oraz stronę
dcode.fr/double-columnar-transposition.
- Uruchom maszynę wirtualną JSLinux Alpine.
- Przygotuj polski tekst techniczny o długości będącej wielokrotnością kluczy (
np. 70 znaków).
-
Dobierz dwa różne klucze słowne o długościach względnie pierwszych (
np.
K1 o długości 5, K2 o długości
7).
- W JSLinux stwórz plik
double_transposition.py.
- Zaimplementuj funkcję transpozycji kolumnowej z porządkowaniem alfabetycznym liter klucza.
-
Zaimplementuj szyfrowanie dwuetapowe:
C_final =
transponuj(transponuj(M, K1), K2).
- Wypisz wyniki pośrednie i wynik końcowy w terminalu.
- Zweryfikuj poprawność szyfrogramu w narzędziu dCode.
-
Napisz funkcję analizującą n
-gramy i policz liczbę typowych polskich digramów w M,
C1 i C_final.
- Zbadaj zachowanie histogramu jednoliterowego i potwierdź jego stałość.
-
Zaimplementuj funkcję deszyfrującą z odwróconą kolejnością kluczy (najpierw
K2, potem
K1).
- Przetestuj odwrócenie procesu i potwierdź odzyskanie tekstu pierwotnego.
- Wykonaj zrzuty ekranu kodu źródłowego oraz tabeli zachowania digramów z konsoli.
- Sporządź tabelę zestawiającą liczbę przetrwałych digramów po 1 i po 2 rundach przestawienia.
-
Zalążek ataku (obowiązkowy): na szyfrogramie po 1 rundzie (
C1) pokaż ręczne sklejenie dwóch kolumn po wspólnym
pionowym digramie (np. odnajdź kolumnę kończącą się na S i kolumnę zaczynającą się od T i złóż je w
ST) i wyjaśnij na zmierzonych liczbach, dlaczego po 2 rundach ta metoda sklejania zawodzi - to jest właściwy wniosek
kryptoanalityczny zadania, nie samo szyfrowanie.
- Sformułuj wnioski kryptoanalityczne na temat odporności podwójnej transpozycji na ataki anagramowania.
Kontrola zaliczenia (checklist):
- Uruchomiono skrypt i zachowano log: szyfrogram podwójnej transpozycji dla 2 słów kluczowych, pomiar zniszczenia digramów (statystyka przed/po) oraz poprawne deszyfrowanie przy odwróconej kolejności kluczy.
- Dołączono kod (własne min. 25 linii): funkcje szyfruj/deszyfruj z permutacją kolumn, licznik zachowania digramów.
- Przeprowadzono test pozytywny (poprawna kolejność odwrotna działa) i negatywny (zła kolejność lub zły klucz — czytelny śmieć + wykazane zniszczenie kontynuacji pionowych).
- Opisano w 3–5 zdaniach: eliminacja segmentów pionowych, rozbicie digramów vs sklejanie kolumn, zasada odwracania operacji.
Wariant offline (fallback): Brak sieci/bibliotek: praca w pełni offline na wektorach ze startera w lokalnym Pythonie 3; brak modułów statystycznych zastąp własną implementacją (collections, math); CyberChef/JSLinux zastąp lokalnym uruchomieniem skryptu i wklejonym logiem konsoli.
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 podwójna transpozycja eliminuje ciągłość segmentów pionowych charakterystyczną dla pojedynczego przestawienia.
- Dlaczego rozbicie digramów uniemożliwia proste techniki sklejania kolumn oparte na prawdopodobieństwie przejść literowych.
- W jaki sposób zasada odwracania kolejności operacji determinuje poprawność algorytmu deszyfrującego.
- Student potrafi zaimplementować podwójną transpozycję w Pythonie i ilościowo zmierzyć stopień destrukcji n-gramów.