Jak działa szyfrowanie? Co sprawia że połączenie ze stroną jest bezpieczne?

Autor: Martin Szelcel 10 min. czytania Jak działa szyfrowanie? Co sprawia że połączenie ze stroną jest bezpieczne?

Gdy wchodzimy na jakaś stronę na pasku adresu po lewej stronie możemy zauważyć kłódkę. Co ona oznacza? Po kliknięciu na nią przeglądarka poinformuje nas, że połączenie ze stroną jest bezpieczne. Ale skąd mamy pewność, że przykładowo wpisane na stronie hasło nie trafi w niepowołane ręce, przecież ta informacja musi powędrować nawet tysiące kilometrów przechodząc po drodze przez wiele routerów, serwerów, switchy i innych urządzeń sieciowych. Jak to się dzieje, że nikt nie może odczytać wiadomości przesyłanej przez nasz komputer do serwera? Skąd mamy pewność, że połączenie jest bezpieczne? W tym poście postaram się to wyjaśnić.

Jak działa i po co stosuje się szyfrowanie?

Zacznijmy od tego jak działa szyfrowanie. Możemy je podzielić na symetryczne i asymetryczne. Na czym polegają ich różnice dowiesz się poniżej. Aby było łatwiej nam wszystko zrozumieć wykorzystam przykładowych bohaterów.

Nasi bohaterowie to dwójka przyjaciół - Alicja i Bob, którzy chcą komunikować się ze sobą przesyłając do siebie liściki. Szybko jednak dowiadują się, że ktoś po drodze czyta ich wiadomości, jest to Ewa. Przyjaciele szukają więc sposobu aby zaszyfrować wiadomość tak, aby tylko oni mogli ją odczytać.

Ewa potrafi przechwycić wiadomość przez co otrzymuje dostęp do jej treści.

Algorytm symetryczny

W końcu wpadają na pomysł aby wykorzystać prosty algorytm symetryczny.

Algorytm symetryczny to taki algorytm, w którym zarówno do zaszyfrowania wiadomości jak i jej odszyfrowania wykorzystuje się ten sam klucz lub gdy z jednego klucza (np. szyfrującego) da się łatwo utworzyć drugi klucz (np. odszyfrowujący).

Jeden z najprostszych algorytmów symetrycznych polega na przesunięciu każdej litery wiadomości np. o 5 liter w prawo w alfabecie. Sprawi to, że wiadomości staną się nieczytelne dla osób nieposiadających odpowiedniego klucza. Oczywiście taki klucz dość szybko może zostać złamany dlatego komputery wykorzystują znacznie bardziej złożone klucze.

Przykład klucza symetrycznego polegającego na przesunięciu liter w alfabecie.

Gdy bohaterowie jednak chcą wykorzystać wymyślony algorytm symetryczny w swoich wiadomościach pojawia się dość spory problem. W jaki sposób Alicja ma przekazać klucz Bobowi w taki sposób, aby nie dowiedziała się o nim Ewa? Najłatwiejszym rozwiązaniem było by, aby nasi bohaterowie się spotkali i wtedy przekazali sobie klucz. Niestety takie rozwiązanie tego problemu musimy odrzucić. Chcemy dowiedzieć się w jaki sposób to komputery zabezpieczają wiadomości między sobą, a przecież one nie mogą się ze sobą spotkać, aby dokonać wymiany klucza. Dlatego również bohaterowie mogą jedynie komunikować się poprzez liściki. Aby znaleźć rozwiązanie dla tego problemu musimy poznać czym jest algorytm asymetryczny.

Algorytm asymetryczny

W kryptografii asymetrycznej wykorzystujemy parę kluczy. Jeden z nich - klucz publiczny, pozwala jedynie na zaszyfrowanie wiadomości. Drugi klucz - prywatny, potrafi tą wiadomość odszyfrować. Nie ma możliwości również wyznaczenia drugiego klucza posiadając tylko jeden z nich.

Klucze te możemy sobie wyobrazić jako kłódkę i przypisany do niej klucz. Kłódkę możemy rozdawać każdemu kto będzie chciał nam coś przekazać, po jej zamknięciu nikt nie ma dostępu do zawartości, chyba że posiada do niej klucz. Klucz prywatny powinien być odpowiednio zabezpieczony, aby nie wpadł w niepowołane ręce, kłódka (klucz publiczny) zaś może być rozdawana każdemu bez żadnego ryzyka.

Klucz publiczny możemy sobie wyobrazić jako kłódkę, którą otworzyć może tylko klucz prywatny.

To w jaki sposób tworzone są klucze asymetryczne jest dość skomplikowane, ponieważ proces ten opiera się na operacjach matematycznych, a dokładniej mówiąc na funkcjach jednokierunkowych. Jeżeli nie interesuje cię w jaki sposób takie klucze są tworzone, możesz pominąć kolejny punkt.

Tworzenie kluczy asymetrycznych od strony matematyki

Funkcja jednokierunkowa to taka, która jest łatwa do obliczenia w jedną stronę, ale trudna do odwrócenia. Przykładem funkcji jednokierunkowej jest mnożenie i jego odwrotność, czyli faktoryzacja.

Wybierzmy sobie dwie liczby pierwsze, niech będzie to 479 i 653. Pomnożenie ich ze sobą jest stosunkowo łatwe, potrafi to zrobić każdy prosty kalkulator. Iloczyn tych liczb wynosi 312 787. Dzięki temu, że liczba ta powstała poprzez pomnożenie ze sobą dwóch liczb pierwszych posiada ona trzy dzielniki (liczbę 1 oraz dwie wybrane przez nas liczby pierwsze).

Próba odwrócenia tego działania jest już trudniejsza, ponieważ musimy sprawdzać po kolei czy liczba ta dzieli się przez kolejne liczby pierwsze, aż w końcu trafimy na jeden z dzielników tej liczby.

Działanie to będzie podstawą naszego szyfru, oczywiście liczby wykorzystywane do tworzenia prawdziwych szyfrów przez komputery są dużo dużo większe.

Aby teraz utworzyć z tych liczb klucze musimy wykonać jeszcze kilka działań, ja dla ułatwienia skorzystam z jeszcze prostszych liczb.

Wybieramy dwie liczby pierwsze
p = 11
q = 7

Mnożymy je ze sobą
n = p * q = 77

Następnie obliczamy wartość funkcji Eulera dla tych liczb. W ten sposób otrzymamy liczbę mniejszą od liczby n (77), która nie posiada z nią dzielnika innego niż 1
φ(n) = (p - 1)(q - 1)
φ(77) = 10 * 6 = 60

Teraz kolejnym trudnym działaniem jest odnalezienie dwóch liczb, które pomnożone ze sobą, a następnie podzielone przez 60 (wartość φ(77)) dadzą resztę równą 1
ed mod φ(77) = 1
ed mod 60 = 1
e = 37
d = 13
e * d = 481
481 mod 60 = 1
Czyli te liczby to 37 i 13

Dokonaliśmy wymaganych obliczeń i teraz możemy utworzyć klucze.
Kluczem publicznym jest para liczb (n, e) czyli w naszym przypadku (77, 37).
Klucz prywatny to para liczb (n, d), czyli (77, 13)

Po utworzeniu kluczy wypadałoby sprawdzić, czy faktycznie one działają, spróbujmy więc zaszyfrować, a następnie odszyfrować jakaś liczbę.

Przyjmijmy że liczba, którą chcemy zaszyfrować to 7
m = 7

Aby zaszyfrować liczbę, wykorzystamy klucz publiczny
(n = 77, e = 37)

Działanie które musimy wykonać wygląda następująco
c = mᵉ mod n = 7³⁷ mod 77 = 28
Czyli po zaszyfrowaniu nasza liczba wynosi 28

Teraz spróbujmy ją odszyfrować za pomocą klucz prywatnego
(n = 77, d = 13)

Działanie odszyfrowujące wygląda tak
m = cᵈ mod n = 28¹³ mod 77 = 7

Otrzymaliśmy taką samą liczbę, która wybraliśmy na początku, więc wygląda na to że nasze klucze działają.

Pewnie się zastanawiasz, jak użyć tych kluczy aby zaszyfrować wiadomość, skoro ten algorytm szyfruje tylko liczby. Komputery nie odróżniają tekstu od liczb, dla nich wszystko to tylko binarne dane. Dlatego nie ma żadnego problemu aby zaszyfrować tekst, czy nawet zdjęcie.

Wymiana kluczy

Teraz, gdy już mamy utworzony nasz klucz prywatny oraz publiczny możemy rozwiązać naszą zagadkę. Aby podzielić się kluczem wystarczy, że Alicja prześle swój klucz publiczny do Boba. Nie szkodzi, że klucz ten wpadnie również w ręce Ewy, ponieważ pozwala on jedynie na zaszyfrowanie wiadomości a nie jej odszyfrowanie.

Alicja przesyła swój klucz publiczny do Boba.

Następnie Bob wymyśla klucz symetryczny, oczywiście komputery wykorzystują bardzo skomplikowane klucze aby ich odszyfrowanie zajęło bardzo dużo czasu. Kolejnym krokiem jest zaszyfrowanie go za pomocą klucza publicznego otrzymanego od Alicji i wysłanie wiadomości. Jeżeli klucze są wystarczająco silne odszyfrowanie tych wiadomości bez klucza prywatnego jest praktycznie niemożliwe.

Bob tworzy klucz symetryczny, a następnie szyfruje go za pomocą klucza publicznego, który otrzymał od Alicji.
Następnie przesyła zaszyfrowaną wiadomość.

Gdy zaszyfrowana wiadomość dotrze do Alicji, ta może ją odszyfrować za pomocą swojego klucza prywatnego (zauważ, że klucz prywatny nigdy nie opuszcza Alicji). Otrzymuje w ten sposób klucz symetryczny, który może być wykorzystywany do dalszej komunikacji. W ten sposób Alicja i Bob bezpiecznie wymienili ze sobą klucze.

Alicja odszyfrowuje klucz symetryczny za pomocą swojego klucza prywatnego.

Ewa mimo tego że przechwyciła zarówno klucz publiczny, jak i zaszyfrowaną wiadomość zawierającą klucz symetryczny, nie jest w stanie go odszyfrować i tym samym odczytać kolejnych przesyłanych wiadomości.

© xkcd.com

W jaki sposób komputer nawiązuje bezpieczne połącznie z serwerem?

Podczas pierwszego połączenia z serwerem, czyli po wejściu na daną stronę nasz komputer (klient) chcę nawiązać bezpieczne połącznie z serwerem. W jaki sposób to robi? Mechanizm ten nazywa się TLS handshake (zwany również jako SSL handshake, TLS jest nowszym, bezpieczniejszym rozwinięciem standardu SSL). Najczęściej proces ten wygląda następująco:

  1. Klient (czyli nasz komputer), przesyła wiadomość powitalną do serwera. Zawiera ona wersję TLS i rodzaje szyfrowań jakie obsługuje klient. Dodatkowo zamieszcza w nim ciąg losowych bajtów nazwany "client random".
  2. Serwer w odpowiedzi przesyła wiadomość zawierającą jego certyfikat SSL posiadający klucz publiczny serwera (czym jest dokładnie ten certyfikat dowiemy się później) i wybraną metodę szyfrowania. Serwer również zamieszcza w wiadomości losowy ciąg bajtów - "server random".
  3. Klient sprawdza zgodność otrzymanego certyfikatu. Następnie wysyła jeszcze jeden ciąg losowych bajtów tym razem szyfrując go za pomocą klucza publicznego serwera, który otrzymał wraz z certyfikatem SSL. Ten ciąg to "premaster secret".
  4. Serwer odszyfrowuje otrzymaną wiadomość. Następnie zarówno serwer jak i klient tworzą z otrzymanych trzech losowych ciągów bajtów klucze symetryczne, są to tak zwane klucze sesji (session keys).
  5. Ponownie zarówno klient jak i serwer za pomocą utworzonego klucza sesji wysyłają do siebie wiadomość o gotowości, sprawdzając poprawność utworzonych kluczy.
  6. Gdy wszystko się zgadza, oznacza to że bezpieczne połączenie zostało nawiązane i dalsza komunikacja odbywa się za pomocą kluczy sesji.

Po takim procesie mamy pewność, że wiadomości przesyłane pomiędzy naszym komputerem a serwerem są bezpieczne. Skąd komputer jednak ma pewność, że serwer z którym chcę się skomunikować (np. serwer banku) jest tym za kogo się podaje? Właśnie w tym celu wymyślono certyfikaty SSL.

Czym jest certyfikat SSL? Co zawiera? Jak klient potwierdza jego autentyczność?

Certyfikat SSL jest pewnego rodzaju zbiorem informacji o serwerze. Możesz go zobaczyć naciskając wcześniej wspomnianą kłódkę na pasku adresu, a następnie naciskając w pole certyfikat. Oto informacje jakie się w nim znajdują (oraz jakie dane to są w przypadku serwera na którym przeglądasz tego bloga):

  • Nazwa domeny dla której certyfikat został wystawiony (blog.martinszelcel.pl)
  • Datę wystawienia certyfikatu i jego wygaśnięcia (08.06.2021 - 06.09.2021)
  • Kto jest wystawcą tego certyfikatu (R3 Let's Encrypt)
  • Klucz publiczny serwera
  • Typ algorytmu szyfrującego (sha256RSA)
  • Numer seryjny certyfikatu (04fd669045cf268f4ecf6b6e2ef823853f00)
  • Odcisk palca serwera (021c90382b72c5ea9307ee916a98a1ea1beda812)

Do czego służy ten certyfikat?

Certyfikat SSL pozwala na nawiązanie bezpiecznego połącznia z serwerem, wykorzystując zawarty w nim klucz publiczny serwera. Pozwala również na potwierdzenie autentyczności serwera, czyli pozwala klientowi na sprawdzenie czy serwer z którym się komunikuje faktycznie jest właścicielem danej domeny, co zapobiega atakom polegającym na podszywaniu się pod inną stronę. Adres serwera który wykorzystuje taki certyfikat rozpoczyna się od "https://" zamiast zwykłego "http://", aby pokazać zarówno przeglądarce jak i użytkownikowi, że połącznie jest bezpieczne.

W jaki sposób klient weryfikuje certyfikat?

Przeglądarka po otrzymaniu od serwera certyfikatu sprawdza kto jest jego wystawcą. Certyfikat taki powinien być wystawiony przez jeden z urzędów certyfikacji (certificate authority), który jest zaufany przez przeglądarkę. Przeglądarka przechowuje listę takich urzędów, oraz ich klucze publiczne, dzięki którym potrafi sprawdzić czy ten certyfikat został faktycznie wydany przez dany urząd i nie został podrobiony. Jest to potwierdzenie, że nikt nie podszywa się pod daną stronę internetową.

Czy kłódka na pasku adresu zawsze oznacza że jesteśmy bezpieczni?

Wiele osób błędnie uważa, że gdy strona posiada kłódkę na pasku adresu to automatycznie możemy ją uznać za godną zaufania, bezpieczną i że śmiało możemy podać jej wszystkie dane. Wynika to z błędnie przekazywanych informacji na temat jak działa to zabezpieczenie np. w kampaniach reklamowych na temat bezpieczeństwa w sieci.

Pamiętajmy, że kłódka oznacza jedynie, że informacje które przesyłamy na serwer nie wpadną po drodze w niepowołane ręce (ale docelowy serwer może je bez problemu odczytać), oraz że serwer z którym komunikuje się przeglądarka jest właścicielem danej domeny i nikt się pod niego nie podszywa. Nie zapewnia ona jednak że strona na której się znajdujesz nie chce wykraść twojego loginu i hasła do banku czy ulubionego portalu społecznościowego.

Dlatego przed wpisaniem hasła na stronie, oprócz upewnienia się, że strona jest zabezpieczona, musimy również sprawdzić czy adres tej strony należy do usługi do której chcemy się zalogować. Pamiętaj, że jest ogromna różnica pomiędzy domeną facebook.com, faceboook.com, czy facebook.com.myrandomwebsite.com. Wpisanie swoich danych na takiej stronie, niezależnie od tego jak dobre są zabezpieczania, sprawi że dane te trafią w ręce niepowołanej osoby i będzie ona mogła włamać się na twoje konto. Dlatego sprawdzenie adresu przed logowaniem jest niezwykle ważne, w szczególności gdy wchodzisz w link wysłany do ciebie przez inną osobę.

Zakończenie

Mam nadzieje, że teraz już wiesz jak komputery szyfrują swoje wiadomości, wymieniają się kluczami oraz nawiązują ze sobą połącznia. Mechanizmy te sprawiają, że dane przesyłane przez internet są zaszyfrowane i to właśnie dzięki nim mamy możliwość korzystania z wielu usług, takich jak internetowe konta bankowe, w bezpieczny sposób.

Jeżeli jakaś część tego postu okazała się dla ciebie niezrozumiała, albo masz jakieś sugestie jaki podobny temat poruszyć w kolejnym poście, koniecznie zostaw komentarz pod tym postem.


Icons made by monkik from www.flaticon.com Icons made by Pixel perfect from www.flaticon.com