Szyfr Cezara

Szyfr Cezara to prosty szyfr podstawieniowy, który zastępuje każdą literę tekstu jawnego inną literą alfabetu. Nazwa tego szyfru pochodzi od przydomka Gajusza Juliusza Cezara (100 p.n.e. - 44 p.n.e.), który używał go podczas komunikacji ze swoimi przyjaciółmi i stronnikami.

Zastosowanie

Juliusz Cezar szyfrował korespondencję na wiele różnych sposobów, między innymi zapisując tekst od tyłu lub zapisując tekst w języku łacińskim przy użyciu greckich liter. Autorzy starożytni (m.in. rzymski historyk Gaius Suetonius Tranquillus, żyjący w pierwszym wieku naszej ery) zaświadczają stosowanie przez niego również tego prostego szyfru podstawieniowego z przesunięciem o jeden lub o trzy znaki.

Algorytm

Szyfr Cezara to jeden z najprostszych szyfrów podstawieniowych.

Każda litera tekstu jawnego jest zastępowana inną literą, która jest od niej oddalona o stałą liczbę pozycji w alfabecie (zawsze w tym samym kierunku). Jeśli algorytm wskazywałby na pozycję, która wychodzi poza ostatnią literę w alfabecie, to przechodzi się na początek alfabetu.

Można to zapisać w formie wzorów matematycznych na szyfrowanie i deszyfrowanie danej litery:
    En(x) = (x+n) mod 26
    Dn(x) = (x-n) mod 26
gdzie:
    n to wybrane przesunięcie liter, z kolei 26 to liczba liter w alfabecie łacińskim (dla innych alfabetów należy oczywiście użyć innej liczby).

Kryptoanaliza szyfru Cezara

Szyfr cezara może został łatwo złamany, za pomocą ataku siłowego. Wystarczy sprawdzić wszystkie możliwe 26 (dla alfabetu łacińskiego) przesunięć liter, aby znaleźć poszukiwany tekst jawny.

Podobnie jak każdy szyfr podstawieniowy, szyfr Cezara może zostać również złamany za pomocą ataków ze znanym szyfrogramem oraz analizy częstotliwości występowania poszczególnych liter w szyfrogramie.

Implementacja

Proste funkcje szyfrująca i deszyfrująca zaimplementowane w Pythonie:

KLUCZ = 3

def szyfruj(tekst):
  zaszyfrowany = ""
  for ch in tekst:
    if ord(ch) >= ord('a') and ord(ch) <= ord('z'):
      nowyKod = ord(ch) + KLUCZ
      if (nowyKod > ord('z')):
        nowyKod -= 26
      zaszyfrowany += chr(nowyKod)
    if ord(ch) >= ord('A') and ord(ch) <= ord('Z'):
      nowyKod = ord(ch) + KLUCZ
      if (nowyKod > ord('Z')):
        nowyKod -= 26
      zaszyfrowany += chr(nowyKod)
  return zaszyfrowany

def deszyfruj(tekst):
  odszyfrowany = ""
  for ch in tekst:
    if ord(ch) >= ord('a') and ord(ch) <= ord('z'):
      nowyKod = ord(ch) - KLUCZ
      if (nowyKod < ord('a')):
        nowyKod += 26
      odszyfrowany += chr(nowyKod)
    if ord(ch) >= ord('A') and ord(ch) <= ord('Z'):
      nowyKod = ord(ch) - KLUCZ
      if (nowyKod < ord('A')):
        nowyKod += 26
      odszyfrowany += chr(nowyKod)
  return odszyfrowany