Szyfry symetryczne w języku Python

Przykładem szyfru symetrycznego jest znany nam szyfr CezaraPvJJ5fOYkszyfr Cezara. Przeanalizujmy implementację jego szczególnego przypadku, znanego jako szyfr ROT13, w którym każdą literę przesuwamy o 13 pozycji.

Ważne!

Pamiętajmy, że w języku Python łańcuchy znaków są niezmienne – nie można ich modyfikować. Z tego względu w funkcji najpierw zamieniamy tekst wejściowy na listę, którą można modyfikować. Następnie zwracamy zmienną tekstową utworzoną z tej listy – korzystamy w tym celu z metody .join().

Implementacja będzie znajdować się w funkcji rot13, przyjmującej i zwracającej zmienną typu tekstowego.

Przyjmijmy założenie, że tekst jawny zawiera małe litery alfabetu łacińskiego.

Zapiszmy nagłówek funkcji:

Linia 1. def rot13 otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek.

Zamieńmy teraz łańcuch znaków na listę znaków, a następnie utwórzmy pętlę for, która przejdzie po wszystkich elementach utworzonej tablicy:

Linia 1. def rot13 otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. wynik znak równości list otwórz nawias okrągły tekst zamknij nawias okrągły. Linia 4. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły wynik zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Ciekawostka

To nie jedyny sposób, by wykonać zamianę łańcucha znaków na listę znaków. Wykorzystać można również metodę append().

Linia 1. def rot13 otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. wynik znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 4. for litera in tekst dwukropek. Linia 5. wynik kropka append otwórz nawias okrągły litera zamknij nawias okrągły. Linia 7. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły wynik zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 8. wynik otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości chr otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły wynik otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus ord otwórz nawias okrągły cudzysłów a cudzysłów zamknij nawias okrągły plus 13 zamknij nawias okrągły procent 26 zamknij nawias okrągły plus ord otwórz nawias okrągły cudzysłów a cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 10. wynik znak równości cudzysłów cudzysłów kropka join otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 12. print otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 14. tekst znak równości input otwórz nawias okrągły cudzysłów Podaj wiadomość do zaszyfrowana dwukropek cudzysłów zamknij nawias okrągły. Linia 16. rot13 otwórz nawias okrągły tekst zamknij nawias okrągły.

W kolejnym kroku każdy ze znaków zamienimy poprzez zwiększenie jego kodu ASCII o 13. Jeżeli wykroczymy poza zakres liter, będziemy musieli powrócić do początku alfabetu. W tym celu zastosujemy operację reszty z dzielenia. Na końcu funkcji zwrócimy zmienną tekstową utworzoną z tablicy wynik.

Linia 1. def rot13 otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. wynik znak równości list otwórz nawias okrągły tekst zamknij nawias okrągły. Linia 4. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły wynik zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 5. wynik otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości chr otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły wynik otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus ord otwórz nawias okrągły cudzysłów a cudzysłów zamknij nawias okrągły plus 13 zamknij nawias okrągły procent 26 zamknij nawias okrągły plus ord otwórz nawias okrągły cudzysłów a cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 7. wynik znak równości cudzysłów cudzysłów kropka join otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 9. print otwórz nawias okrągły wynik zamknij nawias okrągły.

Program prezentuje się następująco:

Linia 1. def rot13 otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. wynik znak równości list otwórz nawias okrągły tekst zamknij nawias okrągły. Linia 4. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły wynik zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 5. wynik otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości chr otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły ord otwórz nawias okrągły wynik otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus ord otwórz nawias okrągły cudzysłów a cudzysłów zamknij nawias okrągły plus 13 zamknij nawias okrągły procent 26 zamknij nawias okrągły plus ord otwórz nawias okrągły cudzysłów a cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 7. wynik znak równości cudzysłów cudzysłów kropka join otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 9. print otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 11. tekst znak równości input otwórz nawias okrągły cudzysłów Podaj wiadomość do zaszyfrowana dwukropek cudzysłów zamknij nawias okrągły. Linia 13. rot13 otwórz nawias okrągły tekst zamknij nawias okrągły.

Na szczególną uwagę w szyfrze ROT13 zasługuje fakt, że do odszyfrowania służy tu dokładnie ta sama funkcja, która zaszyfrowała tekst. Dzieje się tak dlatego, że w alfabecie łacińskim jest 26 znaków, zatem okresowość tego ciągu liter jest równa dwukrotności liczby 13. Przesuwając literę o 13 znaków dwa razy, otrzymujemy dokładnie tę samą literę. Zjawisko to występuje, ponieważ mamy tu do czynienia z szyfrem odwrotnościowymszyfr odwrotnościowyszyfrem odwrotnościowym, czyli takim, w którym funkcja szyfrująca jest odwrotnością samej siebie.

Szyfry asymetryczne

Działanie szyfru asymetrycznego przeanalizujmy na podstawie protokołu Diffiego‑Hellmana, który służy do tzw. wynegocjowania klucza publicznego między dwiema stronami. W przykładzie rozpatrzmy komunikację między klientem a serwerem.

  1. Z góry ustalone są dwie liczby – liczba pierwsza oraz podstawa .

  2. Klient losuje pewną liczbę całkowitą i oblicza wartość . Wartość ta przesyłana jest do serwera.

  3. Serwer analogicznie losuje liczbę , po czym oblicza wartość . Następnie przesyła tę wartość do klienta.

  4. Klient oblicza wartość , zaś serwer . Liczby te będą sobie równe.

Otrzymana wartość jest sekretnym kluczem, który może być używany do szyfrowania symetrycznego za pomocą innego algorytmu. Wartości oraz są kluczami prywatnymi. Wszystkie pozostałe wartości w tym algorytmie mogą zostać udostępnione i będą miały niemal zerowy wpływ na siłę szyfru.

Prześledźmy teraz ten proces dla przykładowych danych:

  1. Jako ustalone odgórnie wartości przyjmiemy liczbę pierwszą  oraz podstawę .

  2. Klient wylosował wartość . Obliczona wartość  wynosi więc . Przesyłana jest ona do serwera.

  3. Serwer wylosował liczbę . Obliczona wartość  wynosi więc . Przesyłana jest ona do klienta.

  4. Obie strony obliczają wartość . Dla klienta jest ona równa . Dla serwera będzie równa . Jak widać, obie otrzymane wartości są sobie równe.

Spójrzmy na implementację tego protokołu w języku Python. Będziemy kolejno zapisywać przedstawione wcześniej obliczenia:

Linia 1. import math. Linia 3. kratka elementy klucza publicznego. Linia 4. p znak równości 29. Linia 5. g znak równości 9. Linia 7. a znak równości 7 kratka klucz prywatny klienta. Linia 8. print otwórz nawias okrągły cudzysłów Klucz prywatny klienta to cudzysłów przecinek a zamknij nawias okrągły. Linia 9. A znak równości math kropka pow otwórz nawias okrągły g przecinek a zamknij nawias okrągły procent p średnik kratka element klucza publicznego klienta. Linia 10. print otwórz nawias okrągły cudzysłów A klienta to dwukropek cudzysłów przecinek A zamknij nawias okrągły. Linia 12. b znak równości 3 kratka klucz prywatny serwera. Linia 13. print otwórz nawias okrągły cudzysłów Klucz prywatny serwera to cudzysłów przecinek b zamknij nawias okrągły. Linia 14. B znak równości math kropka pow otwórz nawias okrągły g przecinek b zamknij nawias okrągły procent p średnik kratka element klucza publicznego serwera. Linia 15. print otwórz nawias okrągły cudzysłów B serwera to dwukropek cudzysłów przecinek B zamknij nawias okrągły. Linia 17. s1 znak równości math kropka pow otwórz nawias okrągły B przecinek a zamknij nawias okrągły procent p średnik kratka klucz publiczny dla klienta. Linia 18. print otwórz nawias okrągły cudzysłów Klucz publiczny dla klienta to dwukropek cudzysłów przecinek s1 zamknij nawias okrągły. Linia 20. s2 znak równości math kropka pow otwórz nawias okrągły A przecinek b zamknij nawias okrągły procent p średnik kratka klucz publiczny dla serwera. Linia 21. print otwórz nawias okrągły cudzysłów Klucz publiczny na serwerze to dwukropek cudzysłów przecinek s2 zamknij nawias okrągły.

Szyfrowanie podczas przesyłania

Obecnie, korzystając z internetu, przesyłamy wiele informacji. Szczególnie więc zależy nam na tym, aby dane były bezpieczne. Takie zabezpieczenie udaje się osiągnąć poprzez szyfrowanie danych podczas ich przesyłania. Najczęściej stosuje się w tym celu protokół TLSprotokół TLSprotokół TLS, który może też służyć do zabezpieczenia takich protokołów jak FTP czy POP3. Służą one do wymiany plików i obsługi poczty e‑mail. Sam protokół TLS to zbiór zasad opisujących bezpieczną komunikację – zawiera on instrukcje dotyczące zarówno szyfrów symetrycznych, jak i asymetrycznych.

Słownik

klucz prywatny
klucz prywatny

w szyfrze asymetrycznym sekretny klucz dostępny tylko i wyłącznie dla odbiorcy zaszyfrowanych wiadomości

klucz publiczny
klucz publiczny

w szyfrze asymetrycznym klucz, który może być powszechnie znany, bez wpływu na siłę szyfrowania

protokół TLS
protokół TLS

protokół odpowiedzialny za zabezpieczanie informacji transportowanych w sieci; oparty na szyfrach asymetrycznych

szyfr odwrotnościowy
szyfr odwrotnościowy

(ang. reciprocal cipher); szyfr, w którym funkcja szyfrująca, wywołana na zaszyfrowanym tekście, zwróci tekst oryginalny