Lekcja 1. Kryptografia i szyfrowanie — jak ukryć informację przed niepowołanymi
ŚredniPo co się tego uczymy?
Gdy wpisujesz hasło na stronie banku, dane "w locie" przez internet muszą być nieczytelne dla kogokolwiek, kto je przechwyci po drodze. Kryptografia to nauka o szyfrowaniu informacji — fundament bezpieczeństwa całego internetu, od bankowości online po zwykłe logowanie do poczty, i temat regularnie sprawdzany na maturze z informatyki.
Teoria
Szyfrowanie — proces przekształcania czytelnej informacji (tekstu jawnego) w nieczytelną postać (szyfrogram) przy użyciu określonego algorytmu i KLUCZA, tak by odczytać ją mógł tylko ktoś, kto zna sposób odwrócenia tego procesu (deszyfrowania).
Szyfr Cezara — najprostszy, historyczny przykład szyfru podstawieniowego: każdą literę tekstu jawnego zastępuje się literą przesuniętą o stałą liczbę pozycji w alfabecie (np. przesunięcie o 3: A→D, B→E, C→F). Klucz to właśnie ta liczba przesunięcia. Łatwy do złamania (tylko 25 możliwych przesunięć do sprawdzenia), ale doskonale ilustruje samą IDEĘ szyfrowania.
Szyfrowanie symetryczne — do zaszyfrowania i odszyfrowania informacji używa się TEGO SAMEGO klucza. Szybkie obliczeniowo, ale wymaga bezpiecznego przekazania klucza obu stronom PRZED rozpoczęciem komunikacji — jeśli klucz wycieknie po drodze, cała komunikacja jest zagrożona. Przykład: AES (Advanced Encryption Standard), obecny standard używany m.in. do szyfrowania dysków i plików.
Szyfrowanie asymetryczne (klucz publiczny/prywatny) — rozwiązuje problem bezpiecznej wymiany klucza: każda strona ma PARĘ kluczy — publiczny (można go swobodnie rozpowszechniać, służy do SZYFROWANIA wiadomości DO danej osoby) i prywatny (trzymany w tajemnicy, służy do ODSZYFROWANIA otrzymanych wiadomości). To, co zaszyfrowano kluczem publicznym, można odszyfrować TYLKO odpowiadającym mu kluczem prywatnym. Przykład: RSA, stosowany m.in. w HTTPS.
HTTPS i kłódka w przeglądarce — strony internetowe zabezpieczone protokołem HTTPS (zamiast zwykłego HTTP) szyfrują CAŁĄ komunikację między przeglądarką a serwerem przy pomocy połączenia technik symetrycznych i asymetrycznych (tzw. TLS/SSL) — dlatego dane logowania czy numeru karty płatniczej wysyłane przez HTTPS są bezpieczne przed podsłuchaniem "po drodze".
Funkcja skrótu (hash) — inna kategoria niż szyfrowanie: funkcja przekształcająca dane WEJŚCIOWE dowolnej długości w krótki, STAŁEJ długości "odcisk palca" (hash), z którego NIE da się odtworzyć oryginalnych danych (operacja jednokierunkowa, nieodwracalna). Używana m.in. do przechowywania haseł — serwis NIE przechowuje Twojego hasła wprost, tylko jego hash, porównywany przy logowaniu.
Podpis cyfrowy — mechanizm oparty na kryptografii asymetrycznej, potwierdzający, że dana wiadomość/dokument POCHODZI od konkretnej osoby i NIE został zmieniony po podpisaniu — odpowiednik odręcznego podpisu, ale niemożliwy do podrobienia bez znajomości klucza prywatnego.
Schemat
SZYFROWANIE SYMETRYCZNE: SZYFROWANIE ASYMETRYCZNE:
Nadawca --[ten sam klucz K]--> Odbiorca Nadawca --[klucz PUBLICZNY
| | odbiorcy]--> zaszyfrowane
szyfruje(K) odszyfruj(K) |
| | Odbiorca --[swój klucz
tekst -> SZYFROGRAM -> tekst PRYWATNY]--> odszyfrowuje
(klucz publiczny może
(oba klucze IDENTYCZNE, znać KAŻDY, prywatny
muszą być tajne) zna TYLKO odbiorca)
Przykład z życia
Gdy logujesz się do bankowości internetowej, przeglądarka najpierw używa szyfrowania ASYMETRYCZNEGO, by bezpiecznie uzgodnić z serwerem banku jednorazowy, wspólny klucz symetryczny — a dopiero POTEM cała reszta sesji (przeglądanie historii transakcji, przelewy) jest szyfrowana szybszym szyfrowaniem SYMETRYCZNYM tym uzgodnionym kluczem. To praktyczne połączenie obu metod, na którym opiera się właściwie cały bezpieczny internet.
szyfr_cezara.py
# Szyfr Cezara - najprostszy szyfr podstawieniowy
def szyfruj_cezar(tekst, przesuniecie):
wynik = ""
for znak in tekst:
if znak.isalpha():
baza = ord('A') if znak.isupper() else ord('a')
# Przesuń literę o "przesuniecie" pozycji w alfabecie (z zawijaniem % 26)
nowy_znak = chr((ord(znak) - baza + przesuniecie) % 26 + baza)
wynik += nowy_znak
else:
wynik += znak # spacje i znaki interpunkcyjne bez zmian
return wynik
def deszyfruj_cezar(tekst, przesuniecie):
# Deszyfrowanie to szyfrowanie z PRZECIWNYM przesunięciem
return szyfruj_cezar(tekst, -przesuniecie)
tekst_jawny = "ATAK O SWICIE"
klucz = 3
szyfrogram = szyfruj_cezar(tekst_jawny, klucz)
print(f"Tekst jawny: {tekst_jawny}")
print(f"Szyfrogram (przesunięcie {klucz}): {szyfrogram}")
print(f"Odszyfrowane: {deszyfruj_cezar(szyfrogram, klucz)}")
Komentarz i wyjaśnienie kodu
Zwróć uwagę na operator % (modulo), którego uczyłeś się w dziale "Python — programowanie" — dzięki niemu przesunięcie litery "Z" o 3 pozycje "zawija się" z powrotem na początek alfabetu ("C"), zamiast wyjść poza zakres liter. To klasyczne zastosowanie reszty z dzielenia w kryptografii.
Funkcja deszyfruj_cezar po prostu wywołuje szyfruj_cezar z PRZECIWNYM znakiem przesunięcia — to pokazuje, że w szyfrach symetrycznych szyfrowanie i deszyfrowanie to często ta sama operacja wykonana "w drugą stronę" tym samym kluczem.
Ćwiczenie samodzielne
Skopiuj powyższy kod do Plac zabaw poniżej lekcji i zaszyfruj własne, krótkie zdanie z różnymi wartościami przesunięcia (1, 5, 13). Sprawdź, czy odszyfrowanie zawsze przywraca oryginalny tekst.
Plac zabaw — wypróbuj online
Poniższy kod wykonuje się od razu w Twojej przeglądarce — nic nie trzeba instalować. Zmień kod i kliknij „Uruchom”.
Zadania do pracy własnej
Zaszyfruj ręcznie (na kartce, bez komputera) słowo "INFORMATYKA" szyfrem Cezara z przesunięciem o 4 pozycje, a następnie sprawdź poprawność, odszyfrowując wynik z powrotem.
Napisz w Pythonie (bazując na powyższym kodzie) funkcję
zlam_szyfr_cezara(szyfrogram), która próbuje WSZYSTKICH 26 możliwych przesunięć i wypisuje każdy wynik — pozwoli to "złamać" szyfr bez znajomości klucza, tak jak zrobiłby to atakujący. Wyjaśnij tekstowo, dlaczego szyfr Cezara jest bardzo słaby względem współczesnych standardów (np. AES).Zaimplementuj w Pythonie prosty szyfr podstawieniowy z KLUCZEM TEKSTOWYM zamiast liczbowego przesunięcia (tzw. szyfr Vigenere'a) — hasło-klucz powtarza się cyklicznie pod tekstem jawnym, a przesunięcie każdej litery zależy od odpowiadającej jej litery klucza. Porównaj tekstowo bezpieczeństwo tego szyfru względem prostego szyfru Cezara — dlaczego dłuższy, losowy klucz utrudnia złamanie szyfrogramu metodą "sprawdź wszystkie możliwości"?
Typowe błędy
Mylenie szyfrowania z funkcją skrótu (hash) — szyfrowanie jest ODWRACALNE (przy znajomości klucza), a funkcja skrótu jest CELOWO NIEODWRACALNA — używa się ich do zupełnie innych celów (szyfrowanie do ochrony treści w tranzycie, hash do bezpiecznego przechowywania haseł).
Przekonanie, że HTTP (bez "S") jest równie bezpieczny co HTTPS — dane wysyłane przez zwykłe HTTP są przesyłane W POSTACI JAWNEJ i mogą zostać podsłuchane przez kogokolwiek na tej samej sieci (np. publiczne WiFi) — zawsze sprawdzaj obecność kłódki/HTTPS przy wpisywaniu haseł.
Używanie zbyt prostego, krótkiego klucza (jak przesunięcie w szyfrze Cezara, gdzie jest tylko 25 możliwości) — nowoczesne szyfry (AES, RSA) używają kluczy o setkach bitów, praktycznie niemożliwych do "zgadnięcia" metodą siłową nawet dla najszybszych komputerów.
Nawiązanie do egzaminu zawodowego
Kryptografia to techniczna podstawa bezpieczeństwa danych, ale bezpieczeństwo to nie tylko matematyka — to też PRAWO regulujące, jak wolno przetwarzać dane innych ludzi, czym zajmiemy się w następnej lekcji tego działu.