WPROWADZENIE

Szyfr Cezara to jedna z najprostszych i najstarszych znanych technik szyfrowania. Przypisuje się go Juliuszowi Cezarowi, który używał go do komunikacji ze swoimi generałami. Szyfr Cezara jest szyfrem podstawieniowym, co oznacza, że każda litera tekstu jawnego jest zastępowana inną literą, przesuniętą o stałą liczbę pozycji w alfabecie.

Aby zaszyfrować wiadomość za pomocą szyfru Cezara, wybieramy klucz – liczbę całkowitą, która określa przesunięcie liter w alfabecie. Na przykład, dla klucza równego 3, litera 'A’ zostanie zastąpiona literą 'D’, 'B’ zostanie zastąpiona 'E’, i tak dalej. Litery na końcu alfabetu zawijają się z powrotem na początek, więc 'X’ stanie się 'A’, 'Y’ stanie się 'B’, a 'Z’ stanie się 'C’.

Odszyfrowanie wiadomości polega na przesunięciu liter o klucz w przeciwnym kierunku.

Poniżej znajduje się kod w języku Python, który pozwala na zaszyfrowanie i odszyfrowanie wiadomości za pomocą szyfru Cezara, a także na przeprowadzenie prostej analizy częstości liter w celu złamania szyfru.

Szyfr Cezara jest bardzo łatwy do złamania. Jednym ze sposobów jest wypróbowanie wszystkich 25 możliwych kluczy (od 1 do 25). Inna metoda to analiza częstości liter. W każdym języku niektóre litery występują częściej niż inne. Na przykład, w języku polskim najczęściej występującymi literami są 'a’, 'i’, 'o’, 'e’, 'z’. Porównując częstość występowania liter w zaszyfrowanym tekście z typową częstością liter w języku polskim, możemy odgadnąć klucz i odszyfrować wiadomość. Powyższy kod pokazuje, jak przeprowadzić taką analizę. Należy pamiętać, że ta metoda jest skuteczna dla dłużych tekstów.


KOD W JĘZYKU PYTHON

import string

def szyfruj(tekst, klucz):
  wynik = ''
  for litera in tekst:
    if litera in string.ascii_lowercase:
      start = string.ascii_lowercase.index(litera)
      przesuniety_indeks = (start + klucz) % 26
      wynik += string.ascii_lowercase[przesuniety_indeks]
    elif litera in string.ascii_uppercase:
      start = string.ascii_uppercase.index(litera)
      przesuniety_indeks = (start + klucz) % 26
      wynik += string.ascii_uppercase[przesuniety_indeks]
    else:
      wynik += litera
  return wynik

def odszyfruj(tekst, klucz):
  return szyfruj(tekst, -klucz)

def analiza_czestosci(tekst):
  czestosci = {}
  for litera in tekst.lower():
    if litera in string.ascii_lowercase:
      czestosci[litera] = czestosci.get(litera, 0) + 1

  posortowane_litery = sorted(czestosci, key=czestosci.get, reverse=True)
  return posortowane_litery

tekst_jawny = "To jest tajna wiadomosc."
klucz = 3

tekst_zaszyfrowany = szyfruj(tekst_jawny, klucz)
print(f"Tekst jawny: {tekst_jawny}")
print(f"Tekst zaszyfrowany: {tekst_zaszyfrowany}")

tekst_odszyfrowany = odszyfruj(tekst_zaszyfrowany, klucz)
print(f"Tekst odszyfrowany: {tekst_odszyfrowany}")

print("\nAnaliza częstości liter w zaszyfrowanym tekście:")
czestosc_liter = analiza_czestosci(tekst_zaszyfrowany)
print(czestosc_liter)
najczestsze_litery_polski = "a i o e z n r w d l u m t y c k p b g j s" 

print("\nPorównanie z najczęstszymi literami w języku polskim:")
print(najczestsze_litery_polski)

⬆️⬆️⬆️ Zobacz w Google Colaboratory


JAK DZIAŁA PROGRAM?

Program po kolei:

  1. Importuje niezbędne moduły: Program rozpoczyna się od importu modułu string, który zawiera funkcje i stałe do pracy z tekstem.
  2. Definiuje funkcję szyfrującą: Funkcja szyfruj przyjmuje tekst i klucz jako argumenty. Następnie iteruje przez każdą literę w tekście i, jeśli jest to litera alfabetu, przesuwa ją o określoną liczbę pozycji (klucz) w alfabecie. Litery spoza alfabetu (np. spacje, znaki interpunkcyjne) pozostają bez zmian. Wynikiem funkcji jest zaszyfrowany tekst.
  3. Definiuje funkcję deszyfrującą: Funkcja odszyfruj również przyjmuje tekst i klucz. Wykorzystuje funkcję szyfrującą z ujemną wartością klucza, aby odwrócić proces szyfrowania i odzyskać oryginalny tekst.
  4. Definiuje funkcję analizującą częstotliwość liter: Funkcja analiza_czestosci przyjmuje tekst i zlicza wystąpienia każdej litery alfabetu. Następnie sortuje litery według częstotliwości występowania, od najczęściej do najrzadziej występujących. Wynikiem funkcji jest lista liter posortowanych według częstotliwości.
  5. Definiuje tekst jawny i klucz: Program definiuje przykładowy tekst jawny i klucz, które będą używane do demonstracji szyfrowania i deszyfrowania.
  6. Szyfruje tekst jawny: Program wywołuje funkcję szyfruj z tekstem jawnym i kluczem, aby zaszyfrować tekst.
  7. Wyświetla tekst jawny i zaszyfrowany: Program wyświetla zarówno oryginalny tekst jawny, jak i jego zaszyfrowaną wersję.
  8. Deszyfruje tekst: Program wywołuje funkcję odszyfruj z zaszyfrowanym tekstem i kluczem, aby go odszyfrować.
  9. Wyświetla tekst odszyfrowany: Program wyświetla odszyfrowany tekst, który powinien być identyczny z oryginalnym tekstem jawnym.
  10. Analizuje częstotliwość liter w zaszyfrowanym tekście: Program wywołuje funkcję analiza_czestosci z zaszyfrowanym tekstem, aby określić częstotliwość występowania poszczególnych liter.
  11. Wyświetla wyniki analizy częstotliwości: Program wyświetla listę liter posortowanych według częstotliwości występowania w zaszyfrowanym tekście.
  12. Porównuje z częstotliwością liter w języku polskim: Program wyświetla listę najczęstszych liter w języku polskim, co pozwala na porównanie z wynikami analizy częstotliwości zaszyfrowanego tekstu i ewentualne wyciągnięcie wniosków na temat klucza użytego do szyfrowania.