Film 1Programowanie w Pythonie. Szyfr Cezara

Film omawia mechanizm szyfru Cezara oraz możliwość wykorzystania kodów ASCII do szyfrowania wiadomości za pomocą szyfru Cezara w języku Python.

dziurka od klucza © sirius1/Shutterstock.com
klucz © VectorShow/Shutterstock.com

Film 2Programowanie w Pythonie. Szyfr Cezara w praktyce

Film prezentuje zadania ćwiczące wykorzystanie szyfru Cezara.

dziurka od klucza © sirius1/Shutterstock.com
klucz © VectorShow/Shutterstock.com

Ćwiczenie 0

a) Aby otrzymać kod ASCII danego znaku, należy wykorzystać funkcję ord(znak) – jeśli zastosuje się np. polecenie ord("a") program wyświetli liczbę 97, a jeśli poniższy skrypt – wyświetli litery i odpowiadające im kody ASCII od 97 do 103. Zmień parametry pętli, aby otrzymać cały alfabet łaciński.

for znak in "abcdefg": print(znak + ":", ord(znak))
a: 97 b: 98 c: 99 d: 100 e: 101 f: 102 g: 103 h: 104 i: 105 j: 106 k: 107 l: 108 m: 109 n: 110 o: 111 p: 112 q: 113 r: 114 s: 115 t: 116 u: 117 v: 118 w: 119 x: 120 y: 121 z: 122
Rozwiąż ćwiczenie

b) Funkcja odwrotna do ord(znak) to chr(kod). Pozwala ona otrzymać znak odpowiadający danemu kodowi ASCII, np. w wyniku zastosowania polecenia chr(97) otrzymamy literę a.

Sprawdź, co otrzymasz po uruchomieniu poniższego skryptu. Zauważ, że polecenie range(122, 115, -1) wskazuje na kolejne wartości od 122 do 116 z krokiem -1, czyli liczby 122, 121,…, 116.

for kod in range(122, 115, -1): print(chr(kod))
Rozwiąż ćwiczenie

Ćwiczenie 1Szyfrowanie znaku

Zdefiniuj funkcję szyfruj_znak(znak, klucz), której parametrami są – odpowiednio – dowolna mała litera alfabetu łacińskiego oraz liczba całkowita nieujemna mniejsza od 1000, a wynikiem jest litera zaszyfrowana danym kluczem. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji szyfruj_znak("a", 3) jest d.
  • Wynikiem funkcji szyfruj_znak("z", 7) jest g.
# zdefiniuj funkcję def szyfruj_znak(znak, klucz): pass # testy
Wynikiem funkcji szyfruj_znak("a", 26) jest znak a
testResult = szyfruj_znak("a", 26)=='a'
a
szyfruj_znak("a", 26)
Wynikiem funkcji szyfruj_znak("z", 13) jest znak m.
testResult = szyfruj_znak("z", 13)=='m'
m
szyfruj_znak("z", 13)
Wynikiem funkcji szyfruj_znak("c", 520) jest znak c.
testResult = szyfruj_znak("c", 520)=='c'
c
szyfruj_znak("c", 520)
Rozwiąż ćwiczenie

Ćwiczenie 2Szyfrowanie tekstu

Zdefiniuj funkcję szyfruj(tekst, klucz), której parametrami są – odpowiednio – ciąg małych liter alfabetu łacińskiego oraz liczba całkowita nieujemna mniejsza od 1000, a wynikiem jest tekst zaszyfrowany danym kluczem. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji szyfruj("kiedyspotkanie", 13) jest xvrqlfcbgxnavr.
  • Wynikiem funkcji szyfruj("tajne", 133) jest wdmqh.
def szyfruj_znak(znak, klucz): return chr((ord(znak) - 97 + klucz) % 26 + 97) # zdefiniuj funkcję def szyfruj(tekst, klucz): pass # testy
Wynikiem funkcji szyfruj("innabajka", 13) jest ciąg znaków vaanonwxn.
testResult = szyfruj("innabajka", 13)=="vaanonwxn"
vaanonwxn
szyfruj("innabajka", 13)
Wynikiem funkcji szyfruj("celujdobrze", 520) jest ciąg znaków celujdobrze.
testResult = szyfruj("celujdobrze", 520)=="celujdobrze"
celujdobrze
szyfruj("celujdobrze", 520)
Wynikiem funkcji szyfruj("rakinieboraki", 99) jest ciąg znaków mvfdidzwjmvfd.
testResult = szyfruj("rakinieboraki", 99)=="mvfdidzwjmvfd"
mvfdidzwjmvfd
szyfruj("rakinieboraki", 99)
Rozwiąż ćwiczenie

Ćwiczenie 3Odszyfrowywanie tekstu

Wynikiem zdefiniowanej poniżej funkcji deszyfruj(tekst, klucz) powinien być od­szyfrowany tekst z danym kluczem, np.:

  • wynikiem funkcji deszyfruj("xvrqlfcbgxnavr", 13) jest ciąg znaków kiedyspotkanie.
  • wynikiem funkcji deszyfruj("wdmqh", 133) jest ciąg znaków tajne.

Przeanalizuj podane informacje i popraw błąd w skrypcie.

def szyfruj_znak(znak, klucz): return chr((ord(znak) - 97 + klucz) % 26 + 97) def szyfruj(tekst, klucz): pom = "" for znak in tekst: pom = pom + szyfruj_znak(znak, klucz) return pom def deszyfruj(tekst, klucz): return szyfruj(tekst, 26 + klucz) print (deszyfruj("xvrqlfcbgxnavr",13)) print (deszyfruj("wdmqh", 133))
Wynikiem funkcji deszyfruj("pwfaijeyw", 126) jest ciąg znaków tajemnica.
testResult = deszyfruj("pwfaijeyw", 126)=="tajemnica"
tajemnica
deszyfruj("pwfaijeyw", 126)
Wynikiem funkcji deszyfruj("vaanonwxn", 13) jest ciąg znaków innabajka.
testResult = deszyfruj("vaanonwxn", 13)=="innabajka"
innabajka
deszyfruj("vaanonwxn", 13)
Wynikiem funkcji deszyfruj("tuvuqu", 410) jest ciąg znaków zabawa.
testResult = deszyfruj("tuvuqu", 410)=="zabawa"
zabawa
deszyfruj("tuvuqu", 410)
Rozwiąż ćwiczenie

Ćwiczenie 4Inaczej na pozycjach nieparzystych i parzystych

Zdefiniuj funkcję szyfruj2(tekst, klucz1, klucz2), której parametrami są – odpowiednio – ciąg małych liter alfabetu łacińskiego oraz dwie liczby całkowite, a wynikiem jest tekst zaszyfrowany w ten sposób, że litery na pozycjach parzystych zaszyfrowano kluczem klucz1, a na nieparzystych – kluczem klucz2. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji szyfruj2("poufnytekst", 3, 10) jest zreixbdhuvd.
  • Wynikiem funkcji szyfruj2("poczekajnamnie", 123, 5) jest uhhsjdfcstrgnx.
# zdefiniuj funkcję def szyfruj2(tekst, klucz1, klucz2): pass # testy
Wynikiem funkcji szyfruj2("innabajka", 13, 104) jest ciąg znaków iannbnjxa
testResult = szyfruj2("innabajka", 13, 104)=="iannbnjxa"
iannbnjxa
szyfruj2("innabajka", 13, 104)
Wynikiem funkcji szyfruj2("celujtam", 520, 728) jest ciąg znaków celujtam
testResult = szyfruj2("celujtam", 520, 728)=="celujtam"
celujtam
szyfruj2("celujtam", 520, 728)
Wynikiem funkcji szyfruj2("otokot", 410, 897) jest ciąg znaków bnbebn
testResult = szyfruj2("otokot", 410, 897)=="bnbebn"
bnbebn
szyfruj2("otokot", 410, 897)
Rozwiąż ćwiczenie

Ćwiczenie dodatkowe 1

Pewien tekst zaszyfrowano szyfrem Cezara z kluczem o wartości 5. W wyniku tej operacji otrzymano szyfrogram: HEQTBNJP PYTWD LTSN IBF EFOFHJ SNJ EQFUNJ FSN OJISJLT. Odszyfruj ten tekst, wiedząc, że do szyfrowania użyto alfabetu łacińskiego bez polskich znaków.

Zadanie 1Jakim kluczem zaszyfrowano?

Zdefiniuj funkcję jaki(tekst_jawny, szyfrogram), której parametrami są ciągi małych liter alfabetu łacińskiego, a wynikiem jest klucz z przedziału [0, 25], pozwalający zaszyfrować tekst jawny za pomocą metody Ce­zara, lub wartość –1, gdy szyfrogram nie mógł powstać z tekstu jawnego w wyniku szyfrowania metodą Cezara. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji jaki("niespodzianka", "pkgurqfbkcpmc") jest 2.
  • Wynikiem funkcji jaki("zmiana", "anjbxb") jest -1.
# zdefiniuj funkcję def jaki(tekst_jawny, szyfrogram): pass # testy
Wynikiem funkcji jaki("innabajka", "vaanonwxn") jest 13.
testResult = jaki("innabajka", "vaanonwxn")==13
13
jaki("innabajka", "vaanonwxn")
Wynikiem funkcji jaki("celujtam", "celujtas") jest -1.
testResult = jaki("celujtam", "celujtas")==-1
-1
jaki("celujtam", "celujtas")
Wynikiem funkcji jaki("naratunek", "ylclefypv") jest 11.
testResult = jaki("naratunek", "ylclefypv")==11
11
jaki("naratunek", "ylclefypv")
Rozwiąż ćwiczenie

Zadanie 2Szyfrowanie polskiego tekstu

Zdefiniuj funkcję szyfrujpl(tekst, klucz), której para­metrami są odpowiednio ciąg małych liter alfabetu (mogą w nim występować litery typowo polskie) oraz liczba całkowita nieujemna mniejsza od 1000, a wynikiem jest zaszyfrowany tekst z danym kluczem. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji szyfrujpl("przekaż", 7) jest yzćkóęe.
  • Wynikiem funkcji szyfrujpl("wiadomość", 3) jest źlcfrorwę.
# zdefiniuj funkcję def szyfrujpl(tekst, klucz): pass # testy
Wynikiem funkcji szyfrujpl("przyjdździś", 13) jest ciąg znaków bchgtńińhśd.
testResult = szyfrujpl("przyjdździś", 13)=="bchgtńińhśd"
bchgtńińhśd
szyfrujpl("przyjdździś", 13)
Wynikiem funkcji szyfrujpl("błąd", 520) jest ciąg znaków hsgk.
testResult = szyfrujpl("błąd", 520)=="hsgk"
hsgk
szyfrujpl("błąd", 520)
Wynikiem funkcji szyfrujpl("nagórzeróże", 99) jest ciąg znaków ócjstagtsbg.
testResult = szyfrujpl("nagórzeróże", 99)=="ócjstagtsbg"
ócjstagtsbg
szyfrujpl("nagórzeróże", 99)
Rozwiąż ćwiczenie

Pytania quizoweSzyfrowanie i deszyfrowanie tekstu

Twój wynik to: /3
  • Jak nazywa się szyfr, w którym każdą literę tekstu jawnego zastępuje się inną?
  • Ile wynosi kod ASCII litery m, jeśli kod ASCII litery k wynosi 107?
  • Napis tajemnica zaszyfrowano szyfrem Cezara i otrzymano xeniqrmge. Jakiego klucza użyto?