Historia szyfru, szyfrowanie i deszyfrowanie, funkcje ord() i chr(), lamanie szyfru
ð Podstawa programowa: I.2bSzyfr 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.
Dla kazdej litery tekstu jawnego:
kod = ord(litera)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
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
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!
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!")
Zaszyfruj recznie (na kartce) tekst "PYTHON" szyfrem Cezara z kluczem 5. Nastepnie zweryfikuj wynik w programie.
# 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
Napisz kompletny program, ktory pyta uzytkownika o: tekst, klucz i operacje (szyfrowanie/deszyfrowanie), a nastepnie wyswietla wynik.
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!")
Odszyfruj wiadomosc: "Surjudprzdqlh wr mvhvw iudmgd!" - nie znasz klucza! Napisz program, ktory probuje wszystkie mozliwe klucze i wyswietla wyniki.
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!
Zmodyfikuj szyfr Cezara tak, aby szyfrowal rowniez cyfry (0-9 traktowane jako dodatkowe 10 znakow). Cyfra po przesunieciu moze stac sie inna cyfra.
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