Kurs maturalny z języka angielskiego!
kurs-maturalny-jezyk-angielski

PROGRAMOWANIE I ALGORYTMY

Zajęcia maturalne z informatyki
Olimpiada Informatyczna Juniorów
    Prowadzący: Marcin Kasprowicz
  • właściciel serwisu algorytm.edu.pl
  • wrzesień 2024 — start zajęć
  • czytaj więcej

Szyfr Cezara w Pythonie


powrót

Szyfr Cezara jest szyfrem podstawieniowym, co oznacza, że każda litera tekstu jawnego (tekstu szyfrowanego) jest zastępowana inną. W przypadku omawianego szyfru każda litera przesuwana jest w alfabecie o ustaloną stałą wartość klucza, stąd szyfr ten jest szyfrem przesuwnym. Szyfrogram (zaszyfrowana wiadomość) można odszyfrować tym samym kluczem, tylko z przeciwną wartością i dlatego szyfr Cezara jest szyfrem symetrycznym (ten sam klucz służy do szyfrowania i deszyfrowania).

Przykład

Weźmy ciąg kilku małych liter:$$abcxyz$$ oraz klucz = 2. Każdą z liter zastępujemy literą znajdującą się o dwie pozycje dalej w alfabecie: $$a → c$$$$b → d$$$$c → e$$$$x → a$$$$y → a$$$$z → b$$W sytuacji, gdy wyjdziemy poza alfabet, to wznawiamy odliczanie liter idąc na jego początek.

Strategia algorytmu i założenia

Załóżmy, że szyfrować będziemy ciąg małych liter języka łacińskiego oraz klucz zawiera się w przedziale [-25..25].

Każdy znak ma przypisany kod ASCII oraz kolejne litery przyjmują kolejne ich wartości:$$a → 97$$$$b → 98$$$$c → 99$$$$d → 100$$$$itd.,$$i ten fakt wykorzystamy w szyfrowaniu/deszyfrowaniu danych.

Przeanalizujmy szyfrowanie litery dla pewnego klucza z zakresu [-25..25].

  • Jeśli kod ASCII tej litery powiększony o wartość klucza mieści się w zakresie alfabetu , czyli nie wyjdziemy poza alfabet z prawej lub lewej strony, to zaszyfrowaną literą jest litera, której kod ASCII jest równy klucz + ASCII szyfrowanego znaku (*),
  • jeśli wyjdziemy poza alfabet z prawej strony (**), dotyczy klucza o wartości dodatniej, to musimy cofnąć się o 26 znaków, aby wskoczyć na właściwą literę (26 to liczba liter w alfabecie), patrz rysunek poniżej,
  • jeśli wyjdziemy poza alfabet z lewej strony (***), dotyczy klucza o wartości ujemnej, to musimy zwiększyć wartość ASCII danego znaku o 26, aby wskoczyć na właściwą literę.
szyfr cezara w pythonie

W implementacji w języku Python użyliśmy dwóch użytecznych funkcji: ord(znak), która zwraca kod ASCII podanego znaku jako argument oraz chr(ASCII), która zwraca znak o danym kocie ASCII.

#*****************www.algorytm.edu.pl****************
def szyfruj(napis, klucz): # napis — zmienna przechowująca tekst do zaszyfrowania

    szyfrogram = "" # zmienna przechowująca zaszyfrowany napis
    for i in napis: # przegląd kolejnych liter tekstu jawnego
        litera = klucz + ord(i) # (*) w postaci kodu ASCII
        if litera > ord('z'): # (**) jeśli wyjdziemy poza alfabet z prawej strony (klucz o wartości dodatniej)
            litera -= 26
        elif litera < ord('a'):  #  (***) jeśli wyjdziemy poza alfabet z lewej strony (klucz o wartości ujemnej)
            litera += 26

        szyfrogram += chr(litera) # dokładamy kolejne litery do wyniku, konwertując ASCII na znak

    return szyfrogram

# część główna programu

napis = 'abcxyz'
klucz = 2

# szyfrowanie
szyfrogram = szyfruj(napis, klucz) # cdezab
print(szyfrogram)
# deszyfrowanie
napis = szyfruj(szyfrogram, -klucz)
print(napis) # abcxyz