Szyfr przestawieniowy
Program symuluje działanie szyfru przestawieniowy
Wikipedia:
Szyfry przestawieniowe – jedna z klasycznych metod szyfrowania. Szyfry te charakteryzują się tym, że w zaszyfrowanym tekście występują wszystkie znaki z tekstu jawnego, ale w innej kolejności. Szyfry należące do tej grupy zmieniają kolejność liter w szyfrowanym tekście według określonego schematu. Najczęściej przestawienia liter dokonuje się za pomocą figury geometrycznej.
Najprostszym przykładem szyfru przestawieniowego jest pisanie wspak.
Szyfry przestawieniowe są łatwe do złamania i nie zapewniają żadnego bezpieczeństwa.
- Łamie się je metodą słów prawdopodobnych. Dopasowanie fragmentu znanego (lub odszyfrowanego) tekstu do szyfru pozwala na znalezienie zasady przestawiania.
- Innym sposobem jest wykorzystanie znajomości zasad tworzenia wiadomości - jednakowe szablony dokumentów szyfrowanych, często spotykane zwroty, nagłówki, podpisy czy stopki wiadomości.
- Wykorzystuje się też błędy i przyzwyczajenia osób posługujących się tą metodą szyfrowania.
- Metoda statystyczna jest raczej nieprzydatna, ponieważ rozkład statystyczny liter wiadomości nie zmienia się po przestawieniu liter w innej kolejności.
Źródło: Wikipedia - szyfr przestawieniowy
Przykładowa implementacja w Pythonie:
Wersja z podręcznika Migra - Teraz Bajty (klasa III SPP)
def dopelnij(napis, znak, liczba_znakow): wynik = napis for i in range(len(napis), liczba_znakow): wynik += znak return wynik def liczba_znakow_z_dopelnieniem(napis, liczba_kolumn): dlugosc = len(napis) liczba_znakow_ostatni_wiersz = dlugosc % liczba_kolumn if liczba_znakow_ostatni_wiersz != 0: dlugosc += liczba_kolumn - liczba_znakow_ostatni_wiersz return dlugosc def zaszyfruj(napis, liczba_kolumn): wynik = "" napis = dopelnij(napis, '_', liczba_znakow_z_dopelnieniem(napis, liczba_kolumn)) dlugosc = len(napis) akt_pozycja = 0 for i in range(dlugosc): wynik += napis[akt_pozycja] akt_pozycja += liczba_kolumn if akt_pozycja >= dlugosc: akt_pozycja = akt_pozycja - dlugosc + 1 return wynik szyfrogram = zaszyfruj('ALAMAKOTA', 4) szyfrogram2 = 'NAWOEIWATJEERERMJAJZOŚZSEŻĆYAKNDDMI' #klucz 7 jawny = zaszyfruj(szyfrogram, len(szyfrogram)//4) print(szyfrogram) print(jawny.replace('_', ''))