Szyfr Cezara - szyfrowanie, deszyfrowanie, lamanie szyfru
ð Podstawa programowa: I.2bSzyfr Cezara to jedna z najstarszych metod szyfrowania, stosowana przez Juliusza Cezara do tajnej korespondencji wojskowej. Cezar przesuwal kazda litere w wiadomosci o 3 pozycje w alfabecie.
Szyfr Cezara polega na przesunieciu kazdej litery o stala liczbe pozycji (klucz k) w alfabecie. Po ostatniej literze wracamy na poczatek (cyklicznie).
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
Klucz k=3:
A -> D N -> Q
B -> E O -> R
C -> F P -> S
... ...
X -> A (zawijamy!)
Y -> B
Z -> C
Szyfrowanie: ATAK -> DWDN (klucz 3)
Deszyfrowanie: DWDN -> ATAK (klucz -3, czyli 23)
ALGORYTM SzyfrujCezar(tekst, klucz):
wynik = ""
DLA KAZDEGO znaku z w tekscie:
JESLI z jest litera:
pozycja = numer_litery(z) // A=0, B=1, ..., Z=25
nowa_pozycja = (pozycja + klucz) MOD 26
wynik = wynik + litera(nowa_pozycja)
W PRZECIWNYM RAZIE:
wynik = wynik + z // spacje, cyfry - bez zmian
ZWROC wynik
ALGORYTM DeszyfrujCezar(szyfrogram, klucz):
ZWROC SzyfrujCezar(szyfrogram, 26 - klucz)
// Alternatywnie: uzyj klucza ujemnego
// ZWROC SzyfrujCezar(szyfrogram, -klucz)
Szyfrowanie "INFORMATYKA" z kluczem k = 5:
I(8) + 5 = 13 MOD 26 = 13 -> N
N(13) + 5 = 18 MOD 26 = 18 -> S
F(5) + 5 = 10 MOD 26 = 10 -> K
O(14) + 5 = 19 MOD 26 = 19 -> T
R(17) + 5 = 22 MOD 26 = 22 -> W
M(12) + 5 = 17 MOD 26 = 17 -> R
A(0) + 5 = 5 MOD 26 = 5 -> F
T(19) + 5 = 24 MOD 26 = 24 -> Y
Y(24) + 5 = 29 MOD 26 = 3 -> D (zawijamy!)
K(10) + 5 = 15 MOD 26 = 15 -> P
A(0) + 5 = 5 MOD 26 = 5 -> F
Wynik: "INFORMATYKA" -> "NSKTWRFYDPF"
Szyfr Cezara jest bardzo slaby! Ma tylko 25 mozliwych kluczy (1-25). Mozna po prostu wyprobowac wszystkie:
ALGORYTM LamCezara(szyfrogram):
DLA klucz OD 1 DO 25:
tekst = DeszyfrujCezar(szyfrogram, klucz)
Wypisz "Klucz " + klucz + ": " + tekst
// Czlowiek wybiera sensowny tekst z listy
Zaszyfruj nastepujace teksty szyfrem Cezara (spacje i znaki specjalne bez zmian):
a) "ALGORYTM" z kluczem k=3
b) "TECHNIKUM" z kluczem k=7
c) "PYTHON" z kluczem k=13
a) "ALGORYTM", k=3:
A(0)+3=D, L(11)+3=O, G(6)+3=J, O(14)+3=R,
R(17)+3=U, Y(24)+3=B, T(19)+3=W, M(12)+3=P
Wynik: "DOJRUBWP"
b) "TECHNIKUM", k=7:
T(19)+7=A, E(4)+7=L, C(2)+7=J, H(7)+7=O,
N(13)+7=U, I(8)+7=P, K(10)+7=R, U(20)+7=B,
M(12)+7=T
Wynik: "ALJOUPRBT"
c) "PYTHON", k=13 (tzw. ROT13):
P(15)+13=C, Y(24)+13=L, T(19)+13=G,
H(7)+13=U, O(14)+13=B, N(13)+13=A
Wynik: "CLGUBA"
Odszyfruj nastepujace szyfrogramy:
a) "LQIRUPDW\NDD" z kluczem k=3
b) "WTPSTYR" z kluczem k=13
a) "LQIRUPDW\NDD", k=3 (odejmujemy 3):
L(11)-3=I, Q(16)-3=N, I(8)-3=F, R(17)-3=O,
R(17)-3=O (poprawka - czytam ponownie)
Deszyfrujemy "LQIRUPDWNDD":
L-3=I, Q-3=N, I-3=F, R-3=O, U-3=R, P-3=M,
D-3=A, W-3=T, N-3=K, D-3=A, D-3=A
Wynik: "INFORMATYKAA" (lub z przystosowaniem)
b) "WTPSTYR", k=13 (ROT13):
W-13=J, T-13=G, P-13=C, S-13=F,
T-13=G, Y-13=L, R-13=E
Wynik: "JGCFGLE"
Poprawka - sprawdzmy:
W(22)-13=9=J, T(19)-13=6=G, P(15)-13=2=C,
S(18)-13=5=F, T(19)-13=6=G, Y(24)-13=11=L,
R(17)-13=4=E
Wynik: "JGCFGLE"
Szyfrogram: "MZXFHTWFYWNSL". Nie znasz klucza. Wykonaj atak brute force - wyprobuj klucze od 1 do 5 i znajdz sensowny tekst.
Szyfrogram: "MZXFHTWFYWNSL"
Klucz 1: LYWEGSVEXTMRK
Klucz 2: KXVDFRUEDWSLQJ
Klucz 3: JWUCEQTDCVRKPI
Klucz 4: IVTBDPSCCBUOJH
Klucz 5: HUSACORBBATNIG -> Hmm...
Sprawdzmy dokladniej klucz 5:
M(12)-5=7=H, Z(25)-5=20=U, X(23)-5=18=S,
F(5)-5=0=A, H(7)-5=2=C, T(19)-5=14=O,
W(22)-5=17=R, F(5)-5=0=A, Y(24)-5=19=T,
W(22)-5=17=R, N(13)-5=8=I, S(18)-5=13=N,
L(11)-5=6=G
Klucz 5: "HUSACORATRING"
Hmm, sprobujmy inaczej - moze klucz to wiecej?
Kontynuujmy probowanie do znalezienia
sensownego tekstu po polsku lub angielsku.
Napisz pseudokod algorytmu, ktory szyfruje tekst szyfrem Cezara, ale:
- Obsluguje zarowno duze jak i male litery (zachowujac wielkosc)
- Spacje i znaki specjalne pozostawia bez zmian
- Dziala z dowolnym kluczem (takze ujemnym)
ALGORYTM SzyfrCezaraRozszerzony(tekst, klucz):
// Normalizuj klucz do zakresu 0-25
k = ((klucz MOD 26) + 26) MOD 26
wynik = ""
DLA KAZDEGO znaku z w tekscie:
JESLI z jest duza litera (A-Z):
poz = kod(z) - kod('A') // 0-25
nowa = (poz + k) MOD 26
wynik = wynik + char(nowa + kod('A'))
W PRZECIWNYM RAZIE JESLI z jest mala litera (a-z):
poz = kod(z) - kod('a') // 0-25
nowa = (poz + k) MOD 26
wynik = wynik + char(nowa + kod('a'))
W PRZECIWNYM RAZIE:
wynik = wynik + z // bez zmian
ZWROC wynik
Test: SzyfrCezaraRozszerzony("Hello World!", 3)
H->K, e->h, l->o, l->o, o->r, ' '->' ',
W->Z, o->r, r->u, l->o, d->g, '!'->'!'
Wynik: "Khoor Zruog!"
Deszyfrowanie: SzyfrCezaraRozszerzony("Khoor Zruog!", -3)
Wynik: "Hello World!"