Liceum Klasa I 45 minut PP: I.2b | s. 342

Lekcja 18: Szyfrowanie tekstu metoda Cezara - algorytm i implementacja

Historia szyfru, szyfrowanie i deszyfrowanie, funkcje ord() i chr(), lamanie szyfru

📋 Podstawa programowa: I.2b
algorytmybezpieczenstwoimplementacjakryptografiaprzesunięcieszyfr Cezara
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Historia szyfru Cezara

Szyfr Cezara to jeden z najstarszych i najprostszych szyfrow w historii. Nazwa pochodzi od Juliusza Cezara, ktory uzywal go do ochrony tajnej korespondencji wojskowej. Cezar przesuwal kazda litere o 3 pozycje w alfabecie: A stawalo sie D, B stawalo sie E itd.

Szyfr Cezara jest przykladem szyfru podstawieniowego - kazda litera tekstu jawnego jest zastepowana inna litera wedlug ustalonej reguly.

Zasada dzialania: Kazda litere tekstu jawnego zastepujemy litera oddalona o k pozycji w alfabecie (gdzie k to klucz szyfru). Jesli przekroczymy koniec alfabetu, wracamy na jego poczatek (operacja modulo).

Algorytm szyfrowania

Dla kazdej litery tekstu jawnego:

  1. Pobierz kod ASCII litery: kod = ord(litera)
  2. Oblicz nowy kod: przesun o klucz z zawijaniem (modulo 26 dla liter)
  3. Zamien nowy kod na litere: nowa_litera = chr(nowy_kod)

Przklad z kluczem k=3:

Alfabet: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Szyfr:   D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

Tekst jawny:  A T A K O S W I C I E
Szyfrogram:   D W D N R V Z L F L H

Funkcje ord() i chr() w Pythonie

Kluczowe funkcje do pracy z szyfrem Cezara w Pythonie:

  • ord(znak) - zwraca kod ASCII znaku (np. ord('A') = 65)
  • chr(kod) - zwraca znak o podanym kodzie ASCII (np. chr(65) = 'A')
# Szyfrowanie jednej litery
def szyfruj_litere(litera, klucz):
    if litera.isupper():
        # Wielkie litery: A=65, Z=90
        kod = ord(litera) - ord('A')  # pozycja 0-25
        nowy_kod = (kod + klucz) % 26
        return chr(nowy_kod + ord('A'))
    elif litera.islower():
        # Male litery: a=97, z=122
        kod = ord(litera) - ord('a')
        nowy_kod = (kod + klucz) % 26
        return chr(nowy_kod + ord('a'))
    else:
        return litera  # spacje, cyfry itp. bez zmian

Pelna implementacja

def szyfr_cezara(tekst, klucz):
    """Szyfruje tekst szyfrem Cezara z podanym kluczem."""
    wynik = ""
    for litera in tekst:
        if litera.isalpha():
            # Ustalamy baze (A=65 lub a=97)
            baza = ord('A') if litera.isupper() else ord('a')
            # Przesuwamy z zawijaniem
            nowy_kod = (ord(litera) - baza + klucz) % 26 + baza
            wynik += chr(nowy_kod)
        else:
            wynik += litera  # nie zmieniamy znakow niebedacych literami
    return wynik

def deszyfruj_cezara(szyfrogram, klucz):
    """Deszyfruje - to szyfrowanie z kluczem ujemnym."""
    return szyfr_cezara(szyfrogram, -klucz)

# Przyklad uzycia
tekst = "Atak o swicie!"
klucz = 3

zaszyfrowany = szyfr_cezara(tekst, klucz)
print(f"Zaszyfrowany: {zaszyfrowany}")
# Zaszyfrowany: Dwdn r vzlflh!

odszyfrowany = deszyfruj_cezara(zaszyfrowany, klucz)
print(f"Odszyfrowany: {odszyfrowany}")
# Odszyfrowany: Atak o swicie!

Lamanie szyfru Cezara (brute force)

Szyfr Cezara jest bardzo latwy do zlamania, poniewaz ma tylko 25 mozliwych kluczy (1-25). Wystarczy wyprobowac kazdy klucz i sprawdzic, ktory daje sensowny tekst:

def lam_cezara(szyfrogram):
    """Probuje wszystkie 25 kluczy."""
    for klucz in range(1, 26):
        odszyfrowany = szyfr_cezara(szyfrogram, -klucz)
        print(f"Klucz {klucz:2}: {odszyfrowany}")

# Test
lam_cezara("Dwdn r vzlflh!")
Bezpieczenstwo: Szyfr Cezara NIE jest bezpiecznym szyfrem! Mozna go zlamac w kilka sekund. Wspolczesna kryptografia uzywa znacznie bardziej skomplikowanych algorytmow (AES, RSA). Szyfr Cezara jest wazny jako wprowadzenie do kryptografii i cwiczenie programistyczne.
✏️

Zadania

Latwe

Zadanie 1: Reczne szyfrowanie

Zaszyfruj recznie (na kartce) tekst "PYTHON" szyfrem Cezara z kluczem 5. Nastepnie zweryfikuj wynik w programie.

Pokaz rozwiazanie
# Reczne szyfrowanie: klucz = 5
# P(15) + 5 = 20 -> U
# Y(24) + 5 = 29 % 26 = 3 -> D
# T(19) + 5 = 24 -> Y
# H(7)  + 5 = 12 -> M
# O(14) + 5 = 19 -> T
# N(13) + 5 = 18 -> S
# Wynik: UDYMTS

# Weryfikacja w Pythonie:
print(szyfr_cezara("PYTHON", 5))  # UDYMTS
Srednie

Zadanie 2: Program szyfrujacy

Napisz kompletny program, ktory pyta uzytkownika o: tekst, klucz i operacje (szyfrowanie/deszyfrowanie), a nastepnie wyswietla wynik.

Pokaz rozwiazanie
def szyfr_cezara(tekst, klucz):
    wynik = ""
    for litera in tekst:
        if litera.isalpha():
            baza = ord('A') if litera.isupper() else ord('a')
            nowy_kod = (ord(litera) - baza + klucz) % 26 + baza
            wynik += chr(nowy_kod)
        else:
            wynik += litera
    return wynik

print("=== Szyfr Cezara ===")
tekst = input("Podaj tekst: ")
klucz = int(input("Podaj klucz (1-25): "))
operacja = input("Szyfruj (S) czy Deszyfruj (D)? ")

if operacja.upper() == "S":
    print(f"Szyfrogram: {szyfr_cezara(tekst, klucz)}")
elif operacja.upper() == "D":
    print(f"Tekst jawny: {szyfr_cezara(tekst, -klucz)}")
else:
    print("Nieznana operacja!")
Trudne

Zadanie 3: Lamanie szyfru

Odszyfruj wiadomosc: "Surjudprzdqlh wr mvhvw iudmgd!" - nie znasz klucza! Napisz program, ktory probuje wszystkie mozliwe klucze i wyswietla wyniki.

Pokaz rozwiazanie
def szyfr_cezara(tekst, klucz):
    wynik = ""
    for litera in tekst:
        if litera.isalpha():
            baza = ord('A') if litera.isupper() else ord('a')
            nowy_kod = (ord(litera) - baza + klucz) % 26 + baza
            wynik += chr(nowy_kod)
        else:
            wynik += litera
    return wynik

szyfrogram = "Surjudprzdqlh wr mvhvw iudmgd!"

print("Probuje wszystkie klucze:")
for klucz in range(1, 26):
    odszyfrowany = szyfr_cezara(szyfrogram, -klucz)
    print(f"Klucz {klucz:2}: {odszyfrowany}")

# Klucz 3: Programowanie to jest frajda!
Trudne

Zadanie 4: Szyfr Cezara z rozszerzonym alfabetem

Zmodyfikuj szyfr Cezara tak, aby szyfrowal rowniez cyfry (0-9 traktowane jako dodatkowe 10 znakow). Cyfra po przesunieciu moze stac sie inna cyfra.

Pokaz rozwiazanie
def szyfr_cezara_ext(tekst, klucz):
    wynik = ""
    for znak in tekst:
        if znak.isalpha():
            baza = ord('A') if znak.isupper() else ord('a')
            nowy_kod = (ord(znak) - baza + klucz) % 26 + baza
            wynik += chr(nowy_kod)
        elif znak.isdigit():
            # Przesuwamy cyfry modulo 10
            nowa_cyfra = (int(znak) + klucz) % 10
            wynik += str(nowa_cyfra)
        else:
            wynik += znak
    return wynik

# Test
tekst = "Haslo123"
print(szyfr_cezara_ext(tekst, 3))   # Kdvor456
print(szyfr_cezara_ext("Kdvor456", -3))  # Haslo123
🎥

Materialy wideo

Jak zakodować szyfr cezara w Python
DooMx
Szyfr Cezara - implementacja w Pythonie
Dziwne... u mnie działa - (ScratchSPWZ)
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 17: Wyszukiwanie wzorca Lekcja 19: Sortowanie przez wstawianie →