Przykład 1

Aby zbudować klucz niezbędny do realizacji szyfrowaniaszyfrowanieszyfrowania metodą Vigenère’a, napiszemy funkcję generującą ciąg znaków długości tekstu jawnegotekst jawnytekstu 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.

Linia 1. def tworzenie podkreślnik klucza otwórz nawias okrągły tekst podkreślnik jawny dwukropek str przecinek slowo podkreślnik klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. from itertools import cycle. Linia 3. klucz znak równości cudzysłów cudzysłów. Linia 4. pary znak równości zip otwórz nawias okrągły tekst podkreślnik jawny przecinek cycle otwórz nawias okrągły slowo podkreślnik klucz zamknij nawias okrągły zamknij nawias okrągły. Linia 5. for para in pary dwukropek. Linia 6. klucz plus znak równości para otwórz nawias kwadratowy 1 zamknij nawias kwadratowy kropka upper otwórz nawias okrągły zamknij nawias okrągły. Linia 7. return klucz. Linia 9. kratka przykład wykonania. Linia 10. print otwórz nawias okrągły tworzenie podkreślnik klucza otwórz nawias okrągły cudzysłów PythonToJęzykProgramowania cudzysłów przecinek cudzysłów Linux cudzysłów zamknij nawias okrągły zamknij nawias okrągły.

Zwróćmy uwagę na to, że wynikowy klucz zbudowany jest tylko z wielkich liter.

Linia 1. LINUXLINUXLINUXLINUXLINUXL.

Przeanalizujemy teraz szyfrowanie metodą Vigenere'a dla tekstu jawnego „ADAM” oraz klucza „ABCD”.

RXXvXKME2jy3B
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
  • Dla Litery „A” oraz znaku klucza „A” zaszyfrowanym znakiem będzie „A”.

    RE3GtiUjH1NNn
    Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

  • Dla litery „D” oraz znaku klucza „B” zaszyfrowanym znakiem będzie „E”.

    RgcOMXz686FLn
    Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

  • Dla litery „A” oraz znaku klucza „C” zaszyfrowanym znakiem będzie „C”.

    RK9IUGESo0m5D
    Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

  • Dla litery „M” oraz znaku klucza „D” zaszyfrowanym znakiem będzie „P”.

    ROGvvJotHM4HU
    Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Zaszyfrowany tekst będzie brzmiał „AECP” – jak widzimy, zależy on od użytego klucza.

Ważne!

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.

Linia 1. zaszyfrowany znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły plus ord otwórz nawias okrągły klucz zamknij nawias okrągły zamknij nawias okrągły procent 26 zamknij nawias okrągły.

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.

Linia 1. jawny znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły minus ord otwórz nawias okrągły klucz zamknij nawias okrągły plus 26 zamknij nawias okrągły procent 26 zamknij nawias okrągły.
Przykład 2

Bazując na powyższych informacjach oraz wykorzystując wcześniej napisaną funkcję tworzącą klucz, zdefiniujmy funkcję szyfrującą:

Linia 1. def tworzenie podkreślnik klucza otwórz nawias okrągły tekst podkreślnik jawny dwukropek str przecinek slowo podkreślnik klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. from itertools import cycle. Linia 3. klucz znak równości cudzysłów cudzysłów. Linia 4. pary znak równości zip otwórz nawias okrągły tekst podkreślnik jawny przecinek cycle otwórz nawias okrągły slowo podkreślnik klucz zamknij nawias okrągły zamknij nawias okrągły. Linia 5. for para in pary dwukropek. Linia 6. klucz plus znak równości para otwórz nawias kwadratowy 1 zamknij nawias kwadratowy kropka upper otwórz nawias okrągły zamknij nawias okrągły. Linia 7. return klucz. Linia 9. def szyfruj podkreślnik vig otwórz nawias okrągły napis dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 10. szyfrogram znak równości cudzysłów cudzysłów. Linia 11. for poz przecinek litera in enumerate otwórz nawias okrągły napis kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 12. x znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły plus ord otwórz nawias okrągły klucz otwórz nawias kwadratowy poz zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias okrągły procent 26 zamknij nawias okrągły. Linia 13. szyfrogram plus znak równości chr otwórz nawias okrągły x zamknij nawias okrągły. Linia 14. return szyfrogram. Linia 16. kratka przykład wykonania szyfrowania. Linia 17. jawny znak równości cudzysłów TEKSTDOZASZYFROWANIA cudzysłów. Linia 18. sl podkreślnik klucz znak równości cudzysłów tajemnyklucz cudzysłów. Linia 19. k znak równości tworzenie podkreślnik klucza otwórz nawias okrągły jawny przecinek sl podkreślnik klucz zamknij nawias okrągły. Linia 20. print otwórz nawias okrągły k zamknij nawias okrągły. Linia 21. kratka TAJEMNYKLUCZTAJEMNYK. Linia 23. szyfr znak równości szyfruj podkreślnik vig otwórz nawias okrągły jawny przecinek k zamknij nawias okrągły. Linia 24. print otwórz nawias okrągły szyfr zamknij nawias okrągły. Linia 25. kratka METWFQMJLMBXYRXAMAGK.

Następnie, bazując na powyższych informacjach, dodajemy do kodu funkcję odszyfrowującą:

Linia 1. def tworzenie podkreślnik klucza otwórz nawias okrągły tekst podkreślnik jawny dwukropek str przecinek slowo podkreślnik klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. from itertools import cycle. Linia 3. klucz znak równości cudzysłów cudzysłów. Linia 4. pary znak równości zip otwórz nawias okrągły tekst podkreślnik jawny przecinek cycle otwórz nawias okrągły slowo podkreślnik klucz zamknij nawias okrągły zamknij nawias okrągły. Linia 5. for para in pary dwukropek. Linia 6. klucz plus znak równości para otwórz nawias kwadratowy 1 zamknij nawias kwadratowy kropka upper otwórz nawias okrągły zamknij nawias okrągły. Linia 7. return klucz. Linia 9. def szyfruj podkreślnik vig otwórz nawias okrągły napis dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 10. szyfrogram znak równości cudzysłów cudzysłów. Linia 11. for poz przecinek litera in enumerate otwórz nawias okrągły napis kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 12. x znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły plus ord otwórz nawias okrągły klucz otwórz nawias kwadratowy poz zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias okrągły procent 26 zamknij nawias okrągły. Linia 13. szyfrogram plus znak równości chr otwórz nawias okrągły x zamknij nawias okrągły. Linia 14. return szyfrogram. Linia 16. def odszyfruj podkreślnik vig otwórz nawias okrągły szyfr dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 17. tekst podkreślnik jawny znak równości cudzysłów cudzysłów. Linia 18. for poz przecinek litera in enumerate otwórz nawias okrągły szyfr kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 19. x znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły minus ord otwórz nawias okrągły klucz otwórz nawias kwadratowy poz zamknij nawias kwadratowy zamknij nawias okrągły plus 26 zamknij nawias okrągły procent 26 zamknij nawias okrągły. Linia 20. tekst podkreślnik jawny plus znak równości chr otwórz nawias okrągły x zamknij nawias okrągły. Linia 21. return tekst podkreślnik jawny. Linia 23. kratka przykład wykonania odszyfrowania. Linia 24. jawny znak równości cudzysłów TEKSTDOZASZYFROWANIA cudzysłów. Linia 25. sl podkreślnik klucz znak równości cudzysłów tajemnyklucz cudzysłów. Linia 26. k znak równości tworzenie podkreślnik klucza otwórz nawias okrągły jawny przecinek sl podkreślnik klucz zamknij nawias okrągły. Linia 27. print otwórz nawias okrągły k zamknij nawias okrągły. Linia 28. kratka TAJEMNYKLUCZTAJEMNYK. Linia 30. szyfr znak równości szyfruj podkreślnik vig otwórz nawias okrągły jawny przecinek k zamknij nawias okrągły. Linia 31. print otwórz nawias okrągły szyfr zamknij nawias okrągły. Linia 32. kratka METWFQMJLMBXYRXAMAGK. Linia 34. odszyfrowany znak równości odszyfruj podkreślnik vig otwórz nawias okrągły szyfr przecinek k zamknij nawias okrągły. Linia 35. print otwórz nawias okrągły odszyfrowany zamknij nawias okrągły. Linia 36. kratka TEKSTDOZASZYFROWANIA.
Przykład 3

Możemy przygotować program z graficznym interfejsemgraficzny interfejsgraficznym interfejsem. Użyjemy do tego celu biblioteki PySimpleGuiPySimpleGuiPySimpleGui. 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.

Linia 1. def tworzenie podkreślnik klucza otwórz nawias okrągły tekst podkreślnik jawny dwukropek str przecinek slowo podkreślnik klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. from itertools import cycle. Linia 3. klucz znak równości cudzysłów cudzysłów. Linia 4. pary znak równości zip otwórz nawias okrągły tekst podkreślnik jawny przecinek cycle otwórz nawias okrągły slowo podkreślnik klucz zamknij nawias okrągły zamknij nawias okrągły. Linia 5. for para in pary dwukropek. Linia 6. klucz plus znak równości para otwórz nawias kwadratowy 1 zamknij nawias kwadratowy kropka upper otwórz nawias okrągły zamknij nawias okrągły. Linia 7. return klucz. Linia 9. def szyfruj podkreślnik vig otwórz nawias okrągły napis dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 10. szyfrogram znak równości cudzysłów cudzysłów. Linia 11. for poz przecinek litera in enumerate otwórz nawias okrągły napis kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 12. x znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły plus ord otwórz nawias okrągły klucz otwórz nawias kwadratowy poz zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias okrągły procent 26 zamknij nawias okrągły. Linia 13. szyfrogram plus znak równości chr otwórz nawias okrągły x zamknij nawias okrągły. Linia 14. return szyfrogram. Linia 16. def odszyfruj podkreślnik vig otwórz nawias okrągły szyfr dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 17. tekst podkreślnik jawny znak równości cudzysłów cudzysłów. Linia 18. for poz przecinek litera in enumerate otwórz nawias okrągły szyfr kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 19. x znak równości 65 plus otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły litera zamknij nawias okrągły minus ord otwórz nawias okrągły klucz otwórz nawias kwadratowy poz zamknij nawias kwadratowy zamknij nawias okrągły plus 26 zamknij nawias okrągły procent 26 zamknij nawias okrągły. Linia 20. tekst podkreślnik jawny plus znak równości chr otwórz nawias okrągły x zamknij nawias okrągły. Linia 21. return tekst podkreślnik jawny. Linia 23. def gui podkreślnik szyfrowanie podkreślnik vig otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 24. import PySimpleGUI as sg. Linia 25. uklad znak równości otwórz nawias kwadratowy otwórz nawias kwadratowy sg kropka Text otwórz nawias okrągły cudzysłów Podaj tekst jawny lub szyfrogram otwórz nawias okrągły max kropka 35 znaków zamknij nawias okrągły cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 26. otwórz nawias kwadratowy sg kropka Input otwórz nawias okrągły key znak równości cudzysłów dane cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 27. otwórz nawias kwadratowy sg kropka Text otwórz nawias okrągły cudzysłów Podaj klucz otwórz nawias okrągły max kropka 35 znaków zamknij nawias okrągły cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 28. otwórz nawias kwadratowy sg kropka Input otwórz nawias okrągły key znak równości cudzysłów klucz cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 29. otwórz nawias kwadratowy sg kropka Radio otwórz nawias okrągły cudzysłów Szyfruj cudzysłów przecinek 1 przecinek key znak równości cudzysłów s cudzysłów przecinek default znak równości True zamknij nawias okrągły przecinek. Linia 30. sg kropka Radio otwórz nawias okrągły cudzysłów Odszyfruj cudzysłów przecinek 1 przecinek key znak równości cudzysłów o cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 31. otwórz nawias kwadratowy sg kropka Text otwórz nawias okrągły cudzysłów cudzysłów asterysk 40 przecinek size znak równości otwórz nawias okrągły 40 przecinek 1 zamknij nawias okrągły przecinek auto podkreślnik size podkreślnik text znak równości True przecinek key znak równości cudzysłów minus OUT minus cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 32. otwórz nawias kwadratowy sg kropka Button otwórz nawias okrągły apostrof Wykonaj apostrof zamknij nawias okrągły przecinek sg kropka Exit otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy zamknij nawias kwadratowy. Linia 33. okno znak równości sg kropka Window otwórz nawias okrągły cudzysłów Szyfr Vigenere`a cudzysłów przecinek uklad zamknij nawias okrągły. Linia 35. while True dwukropek. Linia 36. event przecinek values znak równości okno kropka read otwórz nawias okrągły zamknij nawias okrągły. Linia 37. klucz podkreślnik txt znak równości values otwórz nawias kwadratowy cudzysłów klucz cudzysłów zamknij nawias kwadratowy. Linia 38. tekst znak równości values otwórz nawias kwadratowy cudzysłów dane cudzysłów zamknij nawias kwadratowy. Linia 39. klucz znak równości tworzenie podkreślnik klucza otwórz nawias okrągły tekst przecinek klucz podkreślnik txt zamknij nawias okrągły. Linia 41. if event znak równości znak równości apostrof Exit apostrof or event is None dwukropek. Linia 42. break. Linia 43. if event znak równości znak równości apostrof Wykonaj apostrof dwukropek. Linia 44. if values otwórz nawias kwadratowy apostrof s apostrof zamknij nawias kwadratowy dwukropek. Linia 45. wynik znak równości szyfruj podkreślnik vig otwórz nawias okrągły values otwórz nawias kwadratowy cudzysłów dane cudzysłów zamknij nawias kwadratowy przecinek klucz zamknij nawias okrągły. Linia 46. okno otwórz nawias kwadratowy cudzysłów minus OUT minus cudzysłów zamknij nawias kwadratowy kropka update otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 47. if values otwórz nawias kwadratowy apostrof o apostrof zamknij nawias kwadratowy dwukropek. Linia 48. wynik znak równości odszyfruj podkreślnik vig otwórz nawias okrągły values otwórz nawias kwadratowy cudzysłów dane cudzysłów zamknij nawias kwadratowy przecinek klucz zamknij nawias okrągły. Linia 49. okno otwórz nawias kwadratowy cudzysłów minus OUT minus cudzysłów zamknij nawias kwadratowy kropka update otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 50. okno kropka close otwórz nawias okrągły zamknij nawias okrągły.

Efektem działania programu jest okno z możliwością wyboru operacji.

RfwfN9zd3mSiF
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
ReG4aUH6lYLME
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Ważne!

Biblioteka PySimpleGui została omówiona w e‑materiale Operacje wejścia i wyjścia w języku PythonPFPlZbMaYOperacje wejścia i wyjścia w języku Python.

Dla zainteresowanych

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ć cryptographycryptographycryptography. Dysponuje ona gotowymi metodami dla różnych sposobów szyfrowania, m.in.:

  • RSA,

  • kodowanie Huffmana,

  • skróty wiadomości.

Słownik

graficzny interfejs
graficzny interfejs

(ang. Graphical User Interface); interfejs pozwalający komunikować się z programem za pomocą wyświetlanych okien

PySimpleGUI
PySimpleGUI

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

cryptography
cryptography

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

szyfrogram
szyfrogram

zaszyfrowana wiadomość

szyfrowanie
szyfrowanie

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 jawny
tekst jawny

tekst przed zaszyfrowaniem lub po odszyfrowaniu; jest to zwyczajny, niezaszyfrowany tekst, który można swobodnie przeczytać

alfabet szyfrowy
alfabet szyfrowy

przekształcony alfabet służący do zaszyfrowywania tekstu jawnego