Wróć do: Algorytmy
podstawowy szyfrowanieszyfr podstawieniowymatura podstawowa z informatyki

Szyfr Cezara

Szyfruje tekst przez przesunięcie każdej litery o stałą wartość w alfabecie.

01

Opis

Szyfr Cezara to jeden z najprostszych szyfrów – został rzekomo użyty przez Juliusza Cezara do zabezpieczania korespondencji wojskowej. Polega na przesunięciu każdej litery o stałą wartość, zwaną kluczem.

Cechy szyfru:

Symetryczny – do szyfrowania i deszyfrowania używamy tego samego klucza (deszyfrowanie to szyfrowanie z ujemnym kluczem).

Podstawieniowy – litery zostają zamienione na inne, nie przestawiane.

Przykłady kluczowych przypadków:

Zawijanie alfabetu – gdy przesunięcie wychodzi poza z, wracamy na początek alfabetu. Stąd operacja modulo 26.

Klucz większy od 26 – bierzemy klucz mod 26, bo przesunięcie o 27 to to samo, co o 1.

Algorytm: dla każdej litery wyliczamy jej pozycję w alfabecie (ord(litera) - ord('a')), dodajemy klucz, bierzemy modulo 26 i zamieniamy z powrotem na znak.

Bezpieczeństwo: szyfr Cezara jest trywialny do złamania – wystarczy 25 prób (lub analiza częstotliwości liter). Współcześnie stosowany tylko w celach edukacyjnych.

02

Pseudokod

funkcja szyfruj_cezara(tekst, klucz):
  wynik  ""
  // normalizujemy klucz - przesunięcie o 27 to to samo co o 1
  klucz  klucz mod 26
  dla każdej litery z w tekst:
    jeżeli z jest małą literą alfabetu:
      // przesuwamy literę z zawijaniem alfabetu
      przesunieta  (ascii(z) - ascii('a') + klucz) mod 26
      wynik  wynik + znak(przesunieta + ascii('a'))
    w przeciwnym razie:
      // znaki spoza alfabetu pozostawiamy bez zmian
      wynik  wynik + z
  zwróć wynik
03

Implementacja w Pythonie

def szyfruj_cezara(tekst, klucz):
    wynik = ""
    klucz = klucz % 26
    for z in tekst:
        if 'a' <= z <= 'z':
            przesunieta = (ord(z) - ord('a') + klucz) % 26
            wynik += chr(przesunieta + ord('a'))
        else:
            wynik += z
    return wynik

# Przykład użycia - szyfrowanie i deszyfrowanie
zaszyfrowane = szyfruj_cezara("matura", 3)
print(zaszyfrowane)
# Wynik: pdwxud

# Deszyfrowanie - wystarczy ujemny klucz
print(szyfruj_cezara(zaszyfrowane, -3))
# Wynik: matura

Złożoność obliczeniowa

CzasowaO(n)
PamięciowaO(n)

Powiązane zagadnienia