Przeczytaj
Aby zbudować klucz niezbędny do realizacji szyfrowaniaszyfrowania metodą Vigenère’a, napiszemy funkcję generującą ciąg znaków długości tekstu jawnegotekstu jawnego. Aby uzyskać niezbędną liczbę znaków, posłużymy się funkcją cycle()
z modułu itertools.
Funkcja ta działa w taki sposób, że dodaje do tworzonego klucza kolejne znaki słowa kluczowego. Jeżeli jednak ciąg znaków slowo_klucz
jest zbyt krótki (czyli po prostu tekst jawny jest dłuższy od słowa - klucza), dodawanie zaczyna się od początku, czyli od pierwszego znaku słowa - klucza.
Zwróćmy uwagę na to, że wynikowy klucz zbudowany jest tylko z wielkich liter.
Przeanalizujemy teraz szyfrowanie metodą Vigenere'a dla tekstu jawnego „ADAM” oraz klucza „ABCD”.
Dla Litery „A” oraz znaku klucza „A” zaszyfrowanym znakiem będzie „A”.
RE3GtiUjH1NNn Dla litery „D” oraz znaku klucza „B” zaszyfrowanym znakiem będzie „E”.
RgcOMXz686FLn Dla litery „A” oraz znaku klucza „C” zaszyfrowanym znakiem będzie „C”.
RK9IUGESo0m5D Dla litery „M” oraz znaku klucza „D” zaszyfrowanym znakiem będzie „P”.
ROGvvJotHM4HU
Zaszyfrowany tekst będzie brzmiał „AECP” – jak widzimy, zależy on od użytego klucza.
Wszystkie poniższe operacje zakładają, że używamy tylko wielkich liter.
Aby uzyskać zaszyfrowany znak, obliczamy kod ASCII znaku jawnego, (ord("A")
), kod ASCII znaku klucza (ord("A")
), dodajemy je do siebie, następnie sumę dzielimy modulo 26. Do tej wartości dodajemy 65 (kod ASCII znaku „A”) i otrzymujemy kod ASCII zaszyfrowanego znaku w postaci dużej litery.
Jak można zauważyć rozwiązanie to nieco różni się od opisanego w poprzedeniej części e‑materiału. Tam realizowaliśmy ten etap w taki sposób, że od kodu ASCII znaku jawnego oraz od kodu ASCII znaku klucza odejmowaliśmy 65 (czyli kod ASCII litery A) - i te dwie liczby (będące indeksami liter) były dodawane. Zauważmy jednak, że kiedy już dobrze rozumiemy zasadę działania tego algorytmu, możemy ten zapis uprościć. Odejmowanie 65 od kodów ASCII jest tak naprawdę zbędne, gdyż późniejsze dzielenie modulo 26 takiej sumy będzie identyczne. Przykładowo: jeżeli znakiem jawnym jest C, a znakiem klucza jest B, to kody ASCII wynoszą 67 i 66. Ich suma to 133, a wynik dzielenia modulo 26 to 3. Gdybyśmy od obu kodów odjęli 65, uzyskalibyśmy odpowiednio indeksy 2 i 1. Suma wyniesie 3, a więc wynik dzielenia będzie identyczny.
Aby uzyskać znak jawny, obliczamy kod ASCII znaku zaszyfrowanego (ord("A")
), kod ASCII znaku klucza (ord("A")
), odejmujemy je do siebie, dodajemy wartość 26, a następnie wynik dzielimy modulo 26. Do tej wartości dodajemy 65 (kod ASCII znaku „A”) i otrzymujemy kod ASCII jawnego znaku.
Bazując na powyższych informacjach oraz wykorzystując wcześniej napisaną funkcję tworzącą klucz, zdefiniujmy funkcję szyfrującą:
Następnie, bazując na powyższych informacjach, dodajemy do kodu funkcję odszyfrowującą:
Możemy przygotować program z graficznym interfejsemgraficznym interfejsem. Użyjemy do tego celu biblioteki PySimpleGuiPySimpleGui. Korzystając z klas i metod udostępnianych przez tę bibliotekę możemy przygotować proste okienko dialogowe. Realizujemy to w funkcji gui_szyfrowanie_vig()
.
Tworzymy okno składające się z kilku pól tekstowych (sg.Text
), pól wprowadzania danych (sg.Input
) oraz przełączników typu radio button (sg.Radio
). Okno wyświetlamy za pomocą metody sg.Window()
, a następnie odczytujemy dane z okienka za pomocą metody read()
. Zwraca ona listę wartości wprowadzonych w oknie, a także informację o tym, który przycisk został naciśnięty.
Efektem działania programu jest okno z możliwością wyboru operacji.
Biblioteka PySimpleGui została omówiona w e‑materiale Operacje wejścia i wyjścia w języku PythonOperacje wejścia i wyjścia w języku Python.
Szyfr Vigenère’a może być nie do złamania, o ile zostaną spełnione jednocześnie następujące warunki:
klucz użyty do szyfrowania wiadomości musi być dłuższy lub równy szyfrowanej wiadomości,
klucz musi być wygenerowany w sposób całkowicie losowy,
klucz nie może być użyty do zaszyfrowania więcej niż jednej wiadomości,
osoba znająca klucz nikomu go nie przekaże.
Dostępne w dystrybucji języka Python biblioteki pozwalające na realizowanie funkcji szyfrowania są opisane na stronie dokumentacji.
Wśród wielu innych bibliotek, które pozwalają na operacje kryptograficzne, możemy wyróżnić cryptographycryptography. Dysponuje ona gotowymi metodami dla różnych sposobów szyfrowania, m.in.:
RSA,
kodowanie Huffmana,
skróty wiadomości.
Słownik
(ang. Graphical User Interface); interfejs pozwalający komunikować się z programem za pomocą wyświetlanych okien
biblioteka do wyświetlania prostych okien dialogowych, niezależna od systemu operacyjnego, nie jest dostępna w standardowej instalacji języka Python; należy zainstalować ją, korzystając z mechanizmu pip
biblioteka kryptograficzna, niezależna od systemu operacyjnego, nie jest dostępna w standardowej instalacji języka Python; należy zainstalować ją, korzystając z mechanizmu pip
zaszyfrowana wiadomość
przekształcenie tekstu jawnego w sposób uniemożliwiający odczytanie oryginalnej treści bez dokonania procesu deszyfrowania, do przeprowadzenia którego niezbędna jest znajomość klucza szyfrującego
tekst przed zaszyfrowaniem lub po odszyfrowaniu; jest to zwyczajny, niezaszyfrowany tekst, który można swobodnie przeczytać
przekształcony alfabet służący do zaszyfrowywania tekstu jawnego