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)

  1. def dopelnij(napis, znak, liczba_znakow):
  2. wynik = napis
  3. for i in range(len(napis), liczba_znakow):
  4. wynik += znak
  5. return wynik
  6.  
  7. def liczba_znakow_z_dopelnieniem(napis, liczba_kolumn):
  8. dlugosc = len(napis)
  9. liczba_znakow_ostatni_wiersz = dlugosc % liczba_kolumn
  10. if liczba_znakow_ostatni_wiersz != 0:
  11. dlugosc += liczba_kolumn - liczba_znakow_ostatni_wiersz
  12. return dlugosc
  13.  
  14. def zaszyfruj(napis, liczba_kolumn):
  15. wynik = ""
  16. napis = dopelnij(napis, '_', liczba_znakow_z_dopelnieniem(napis, liczba_kolumn))
  17. dlugosc = len(napis)
  18. akt_pozycja = 0
  19. for i in range(dlugosc):
  20. wynik += napis[akt_pozycja]
  21. akt_pozycja += liczba_kolumn
  22. if akt_pozycja >= dlugosc:
  23. akt_pozycja = akt_pozycja - dlugosc + 1
  24. return wynik
  25.  
  26.  
  27. szyfrogram = zaszyfruj('ALAMAKOTA', 4)
  28. szyfrogram2 = 'NAWOEIWATJEERERMJAJZOŚZSEŻĆYAKNDDMI' #klucz 7
  29. jawny = zaszyfruj(szyfrogram, len(szyfrogram)//4)
  30. print(szyfrogram)
  31. print(jawny.replace('_', ''))