Przykładem szyfru symetrycznego jest znany nam szyfr CezaraPvJJ5fOYkszyfr Cezara. Przeanalizujmy teraz implementację jego szczególnego przypadku, znanego jako szyfr ROT13, w którym każdą literę przesuwamy o pozycji.
Ważne!
Pamiętajmy, że w języku Java obiekty typu String są niezmienne – nie można ich modyfikować. Z tego względu w naszej funkcji musimy najpierw zamienić tekst wejściowy na tablicę znaków, którą możemy modyfikować. Następnie zwracamy zmienną typu String utworzoną z tej tablicy – korzystamy w tym celu z przydatnej metody statycznej String.valueOf.
Implementacja będzie znajdować się w funkcji rot13(String) przyjmującej i zwracającej zmienną typu tekstowego.
Przyjmijmy założenie, że tekst jawny zawiera małe litery alfabetu łacińskiego.
Zapiszmy funkcję:
Linia 1. prawy ukośnik prawy ukośnik Funkcja do szyfrownia tekstu szyfrem rot13.
Linia 2. public static String rot13 otwórz nawias okrągły String value zamknij nawias okrągły.
Linia 3. otwórz nawias klamrowy.
Linia 5. zamknij nawias klamrowy.
Zamieńmy teraz naszą zmienną value na tablicę zmiennych typu char, a następnie utwórzmy pętlę for, która przejdzie po wszystkich elementach utworzonej tablicy:
Linia 1. prawy ukośnik prawy ukośnik Funkcja do szyfrownia tekstu szyfrem rot13.
Linia 2. public static String rot13 otwórz nawias okrągły String value zamknij nawias okrągły.
Linia 3. otwórz nawias klamrowy.
Linia 4. char otwórz nawias kwadratowy zamknij nawias kwadratowy result znak równości value kropka toCharArray otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 5. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny result kropka length średnik i plus plus zamknij nawias okrągły.
Linia 6. otwórz nawias klamrowy.
Linia 8. zamknij nawias klamrowy.
Linia 9. zamknij nawias klamrowy.
Teraz każdy ze znaków przekształćmy 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 należy zastosować operację reszty z dzielenia. Na końcu naszej funkcji wystarczy zwrócić zmienną typu String utworzoną z tablicy result.
Linia 1. prawy ukośnik prawy ukośnik Funkcja do szyfrownia tekstu szyfrem rot13.
Linia 2. public static String rot13 otwórz nawias okrągły String value zamknij nawias okrągły.
Linia 3. otwórz nawias klamrowy.
Linia 4. char otwórz nawias kwadratowy zamknij nawias kwadratowy result znak równości value kropka toCharArray otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 5. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny result kropka length średnik i plus plus zamknij nawias okrągły.
Linia 6. otwórz nawias klamrowy.
Linia 7. prawy ukośnik prawy ukośnik zamień wszystkie litery w tekście na te przesunięte o 13 jednostek.
Linia 8. result otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły result otwórz nawias kwadratowy i zamknij nawias kwadratowy minus apostrof a apostrof plus 13 zamknij nawias okrągły procent 26 zamknij nawias okrągły plus apostrof a apostrof zamknij nawias okrągły średnik.
Linia 9. zamknij nawias klamrowy.
Linia 10. return String kropka valueOf otwórz nawias okrągły result zamknij nawias okrągły średnik.
Linia 11. zamknij nawias klamrowy.
A oto kod demonstrujący działanie programu:
Linia 1. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły.
Linia 2. otwórz nawias klamrowy.
Linia 3. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wiadomosc do zaszyfrowania cudzysłów zamknij nawias okrągły średnik.
Linia 4. Scanner sc znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 5. String text znak równości sc kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 7. text znak równości rot13 otwórz nawias okrągły text zamknij nawias okrągły średnik.
Linia 8. System kropka out kropka println otwórz nawias okrągły cudzysłów Po zaszyfrowaniu ten tekst to lewy ukośnik n cudzysłów plus text zamknij nawias okrągły średnik.
Linia 10. text znak równości rot13 otwórz nawias okrągły text zamknij nawias okrągły średnik.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Po odszyfrowaniu ten tekst to lewy ukośnik n cudzysłów plus text zamknij nawias okrągły średnik.
Linia 12. zamknij nawias klamrowy.
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 naszym przykładzie rozpatrzmy komunikację między klientem a serwerem.
Z góry ustalone są dwie liczby – liczba pierwsza oraz podstawa
Klient losuje pewną liczbę całkowitą i oblicza wartość . Wartość ta przesyłana jest do serwera.
Serwer analogicznie losuje liczbę , po czym oblicza wartość . Następnie przesyła tę wartość do klienta.
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:
Jako ustalone odgórnie wartości przyjmiemy liczbę pierwszą oraz podstawę
Klient wylosował wartość . Obliczona wartość wynosi więc . Przesyłana jest ona do serwera.
Serwer wylosował liczbę . Obliczona wartość wynosi więc . Przesyłana jest ona do klienta.
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 prostą implementację tego protokołu w języku Java. Będziemy kolejno zapisywać przedstawione wcześniej obliczenia:
Linia 1. public class Main.
Linia 2. otwórz nawias klamrowy.
Linia 4. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły.
Linia 5. otwórz nawias klamrowy.
Linia 6. prawy ukośnik prawy ukośnik elementy klucza publicznego.
Linia 7. long p znak równości 29 średnik.
Linia 8. long g znak równości 9 średnik.
Linia 10. long a znak równości 7 średnik prawy ukośnik prawy ukośnik klucz prywatny klienta.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Klucz prywatny klienta to cudzysłów plus a zamknij nawias okrągły średnik.
Linia 12. long A znak równości otwórz nawias okrągły long zamknij nawias okrągły Math kropka pow otwórz nawias okrągły g przecinek a zamknij nawias okrągły procent p średnik prawy ukośnik prawy ukośnik element klucza publicznego klienta.
Linia 13. System kropka out kropka println otwórz nawias okrągły cudzysłów A klienta to dwukropek cudzysłów plus A zamknij nawias okrągły średnik.
Linia 15. long b znak równości 3 średnik prawy ukośnik prawy ukośnik klucz prywatny serwera.
Linia 16. System kropka out kropka println otwórz nawias okrągły cudzysłów Klucz prywatny serwera to cudzysłów plus b zamknij nawias okrągły średnik.
Linia 17. long B znak równości otwórz nawias okrągły long zamknij nawias okrągły Math kropka pow otwórz nawias okrągły g przecinek b zamknij nawias okrągły procent p średnik prawy ukośnik prawy ukośnik element klucza publicznego serwera.
Linia 18. System kropka out kropka println otwórz nawias okrągły cudzysłów B serwera to dwukropek cudzysłów plus B zamknij nawias okrągły średnik.
Linia 20. long s1 znak równości otwórz nawias okrągły long zamknij nawias okrągły Math kropka pow otwórz nawias okrągły B przecinek a zamknij nawias okrągły procent p średnik prawy ukośnik prawy ukośnik klucz publiczny dla klienta.
Linia 21. System kropka out kropka println otwórz nawias okrągły cudzysłów Klucz publiczny dla klienta to dwukropek cudzysłów plus s1 zamknij nawias okrągły średnik.
Linia 23. long s2 znak równości otwórz nawias okrągły long zamknij nawias okrągły Math kropka pow otwórz nawias okrągły A przecinek b zamknij nawias okrągły procent p średnik prawy ukośnik prawy ukośnik klucz publiczny dla serwera.
Linia 24. System kropka out kropka println otwórz nawias okrągły cudzysłów Klucz publiczny na serwerze to dwukropek cudzysłów plus s2 zamknij nawias okrągły średnik.
Linia 25. zamknij nawias klamrowy.
Linia 26. zamknij nawias klamrowy.
Dla zainteresowanych
Warto zauważyć, że w naszym kodzie do przechowywania zmiennych całkowitych użyliśmy typu long. Wynika to z faktu, że nawet stosunkowo małe liczby – takie jak 6 i 23 – wymagają od tego algorytmu obliczania bardzo dużych wartości, które zwyczajnie nie mogą być zapisane w zmiennej typu int.
Szyfrowanie podczas przesyłania
Obecnie, korzystając z internetu, przesyłamy wiele informacji. Szczególnie więc zależy nam na tym, aby nasze 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