Kryptografia asymetryczna
W tej lekcji przyjrzymy się kryptografii asymetrycznej, która stanowi podstawę wielu bezpiecznych interakcji sieciowych w dzisiejszych czasach.
Do końca lekcji omówimy:
- Czym jest kryptografia asymetryczna
- Zastosowania kryptografii asymetrycznej, w tym wymianę kluczy i podpisy cyfrowe
- Bezpieczeństwo kryptografii asymetrycznej w ogólności
- Dalsze szczegóły dotyczące algorytmów RSA, DSA i krzywych eliptycznych oraz ich bezpieczeństwa
- Kilka przykładów kodu w Pythonie pokazujących, jak algorytmy działają w praktyce
- Zagrożenia dla tych algorytmów ze strony zarówno komputerów klasycznych, jak i kwantowych
Wprowadzenie do kryptografii asymetrycznej
Jak dowiedzieliśmy się w poprzedniej lekcji, kryptografia symetryczna jest bardzo szybka i efektywna w ochronie informacji, ale ma kilka ograniczeń:
- W miarę wzrostu liczby stron pragnących wymieniać się bezpiecznymi informacjami, liczba wymaganych kluczy rośnie kombinatorycznie. Nie zapewnia ona mechanizmu bezpiecznej dystrybucji tych kluczy między nadawcami a odbiorcami.
- Brak jest zapewnienia niezaprzeczalności. Każda strona może deszyfrować lub szyfrować wiadomości, bez możliwości zagwarantowania, że wiadomość została odebrana lub skąd pochodzi.
Rozwiązanie obu tych problemów zapewnia kryptografia asymetryczna (AKC), znana również jako kryptografia klucza publicznego (PKC), która stanowi w związku z tym fundament współczesnego bezpieczeństwa cyfrowego.
Kryptografia asymetryczna (AKC) polega na wykorzystaniu pary kluczy – jednego publicznego, jednego prywatnego. Klucze publiczny i prywatny są powiązane kryptograficznie i zazwyczaj generowane w tym samym czasie jako para kluczy przy użyciu specjalistycznego algorytmu matematycznego. Klucz publiczny, jak sugeruje jego nazwa, jest przeznaczony do swobodnej dystrybucji, natomiast klucz prywatny jest trzymany w tajemnicy przez stronę generującą parę kluczy. Bezpieczeństwo komunikacji wykorzystującej pary kluczy asymetrycznych jest zapewnione tak długo, jak długo klucz prywatny pozostaje poufny.

Rysunek 1. Szyfrowanie kluczem asymetrycznym
AKC oferuje kilka użytecznych funkcji, takich jak:
- Szyfrowanie i deszyfrowanie w celu zapewnienia poufności komunikacji.
- Podpisy cyfrowe w celu zapewnienia autentyczności, integralności oraz niezaprzeczalności.
- Bezpieczna wymiana kluczy w celu umożliwienia późniejszego wykorzystania kryptosystemów symetrycznych.
We współczesnych zastosowaniach AKC jest używana przede wszystkim do podpisów cyfrowych oraz bezpiecznej wymiany kluczy. W tej lekcji przedstawimy te dwie kluczowe funkcje, a następnie omówimy kilka wariantów protokołów kryptograficznych dla tych funkcji.
Wymiana kluczy z kryptografią asymetryczną
Jednym z fundamentalnych problemów w kryptografii jest bezpieczna wymiana kluczy. Na przykład, jeśli dwie strony chcą używać szyfrowania symetrycznego, obie potrzebują tego samego klucza do szyfrowania i deszyfrowania wiadomości. Ale jak bezpiecznie wymienić ten klucz? Kryptografia asymetryczna rozwiązuje ten problem poprzez interaktywne i nieinteraktywne mechanizmy wymiany kluczy.
Interaktywna wymiana kluczy
Interaktywny protokół wymiany kluczy odnosi się do metody, w której dwie strony współpracują, aby utworzyć wspólny sekretny klucz za pośrednictwem niebezpiecznego kanału komunikacyjnego. Ten wspólny sekretny klucz może być następnie używany do zadań symetrycznego szyfrowania i deszyfrowania.
Najbardziej znanym wśród takich protokołów jest algorytm Diffiego-Hellmana (DH), który został opracowany specjalnie w celu ułatwienia wymiany kluczy. W tym protokole każda strona generuje parę kluczy (publiczny i prywatny) oraz rozsyła swój klucz publiczny. Następnie każda strona używa swojego klucza prywatnego oraz klucza publicznego drugiej strony, aby wygenerować wspólny sekretny klucz. DH wykorzystuje zasady arytmetyki modularnej, aby zapewnić, że obie strony otrzymują ten sam wspólny sekret, mimo że każda ze stron ma dostęp tylko do klucza publicznego drugiej strony.
Współczesne kryptosystemy oparte na kryptografii krzywych eliptycznych (ECC) rozszerzają tę koncepcję o wymianę kluczy Diffiego-Hellmana na krzywych eliptycznych (ECDH). ECDH działa podobnie do DH, ale wykorzystuje właściwości krzywych eliptycznych, co skutkuje bardziej bezpiecznym i wydajnym systemem.

Rysunek 2. Protokół wymiany kluczy
Nieinteraktywna wymiana kluczy
W przeciwieństwie do protokołów wymiany kluczy takich jak DH i ECDH, które są interaktywne i wymagają wymiany komunikatów w celu ustalenia klucza symetrycznego, AKC zapewnia również nieinteraktywne sposoby ustanawiania wspólnego sekretnego klucza. W takich schematach jedna strona generuje parę kluczy (publiczny i prywatny) i udostępnia klucz publiczny drugiej stronie. Ta druga strona generuje następnie losowy klucz symetryczny, szyfruje go za pomocą otrzymanego klucza publicznego i odsyła z powrotem do pierwszej strony. Pierwsza strona używa swojego klucza prywatnego do odszyfrowania otrzymanej wiadomości, uzyskując tym samym wspólny klucz symetryczny. Schemat ten jest nieinteraktywny w tym sensie, że klucz symetryczny jest ustalany przez jedną stronę i po prostu bezpiecznie przekazywany drugiej stronie w zaszyfrowanej formie.
Istotnym zagadnieniem w nieinteraktywnej wymianie kluczy jest różnica długości w bitach pomiędzy kluczem symetrycznym, który strony chcą wymienić, a zalecanymi rozmiarami wiadomości w AKC. Zazwyczaj współczesne klucze symetryczne mają długość 128-256 bitów, podczas gdy asymetryczne kryptosystemy takie jak RSA pracują z wiadomościami o długości około 1024-4096 bitów. Dlatego przy użyciu AKC do transmisji klucza symetrycznego, dla bezpieczeństwa musi on mimo to zostać zakodowany w dłuższą wiadomość 1024-4096 bitów. Można to osiągnąć za pomocą dwóch podejść:
-
Wymiana kluczy oparta na dopełnianiu (padding): W tym podejściu krótszy klucz symetryczny (128-256 bitów) jest generowany jako pierwszy, a następnie stosowany jest uzgodniony odwracalny schemat dopełniania, taki jak OAEP, aby osadzić go w dłuższej wiadomości (1024-4096 bitów). Ta dłuższa wiadomość jest szyfrowana za pomocą AKC i rozsyłana jako szyfrogram. Odbiorca najpierw odszyfrowuje szyfrogram, a następnie usuwa dopełnienie, aby wyodrębnić krótszy klucz symetryczny.
-
Mechanizmy enkapsulacji kluczy (KEM): W wymianie kluczy opartej na KEM najpierw generowana jest losowa, długa (1024-4096 bitów) wiadomość w postaci jawnej, z której można wyodrębnić krótszy (128-256 bitów) klucz symetryczny, używając uzgodnionej funkcji derywacji klucza (KDF). Dłuższy tekst jawny jest szyfrowany za pomocą AKC i rozsyłany do odbiorcy jako szyfrogram. Odbiorca dekoduje szyfrogram przy użyciu swojego klucza prywatnego, a następnie używa KDF do wyodrębnienia krótszego (128-256 bitów) klucza symetrycznego. Popularne kryptosystemy takie jak RSA, dzięki swojej zdolności do bezpośredniego szyfrowania danych, mogą być wykorzystywane do implementacji KEM.

Rysunek 3. Mechanizm enkapsulacji kluczy
Podpisy cyfrowe z kryptografią asymetryczną
Podpisy cyfrowe to kolejne potężne zastosowanie kryptografii asymetrycznej. Zapewniają uwierzytelnianie, integralność i niezaprzeczalność, co wynika z faktu, że w ramach AKC podmioty posiadają unikalne klucze prywatne. Podstawowa idea leżąca u podstaw protokołów podpisów polega na tym, że nadawcy bezpiecznych wiadomości dodatkowo podpisują cyfrowo wiadomości przy użyciu swojego unikalnego klucza prywatnego. Odbiorca następnie weryfikuje podpis cyfrowy przy użyciu klucza publicznego nadawcy. W ramach AKC podpisy cyfrowe mogą być implementowane przy użyciu algorytmów zaprojektowanych specjalnie w tym celu lub poprzez wykorzystanie ogólnych kryptosystemów.

Rysunek 4. Podpisy cyfrowe z kryptografią asymetryczną
Dedykowane algorytmy podpisów cyfrowych
Obecnie amerykańskim standardem Federal Information Processing Standard (FIPS) dla podpisów cyfrowych jest dedykowany schemat po prostu zatytułowany Digital Signature Algorithm (DSA). Nieco podobnie do protokołu Diffiego-Hellmana, DSA wykorzystuje algebraiczne właściwości potęgowania modularnego oraz odwrotności multiplikatywnych do generowania i weryfikacji podpisu.
Algorytm podpisu cyfrowego na krzywych eliptycznych (ECDSA) jest wariantem DSA opartym na ECC, zapewniającym tę samą funkcjonalność, ale przy znacznie krótszych kluczach. Skutkuje to poprawą wydajności, co czyni go popularnym wyborem dla systemów z ograniczeniami zasobów.
Zarówno DSA, jak i ECDSA zostaną zilustrowane bardziej szczegółowo w dalszej części.
Schematy podpisów cyfrowych wykorzystujące ogólne kryptosystemy
Oprócz dedykowanych algorytmów, podpisy cyfrowe można również generować przy użyciu ogólnych kryptosystemów asymetrycznych, takich jak RSA.
RSA, który zostanie szczegółowo omówiony w dalszej części, również wykorzystuje modularne odwrotności multiplikatywne oraz potęgowanie modularne jako podstawowe operacje, ale łączy je w innej kolejności niż DSA. W RSA podpisujący zazwyczaj tworzy skrót wiadomości, a następnie szyfruje ten skrót swoim kluczem prywatnym, tworząc podpis cyfrowy. Każda strona może następnie zweryfikować ten podpis, odszyfrowując go kluczem publicznym podpisującego i porównując go ze skrótem wiadomości.
Zastosowania kryptografii klucza asymetrycznego
Kryptografia klucza asymetrycznego jest wszechobecna w nowoczesnych zastosowaniach technologii cyfrowej. Podstawowe funkcjonalności AKC opisane powyżej stanowią elementy składowe wielu protokołów aplikacyjnych wyższego poziomu, w tym:
-
Komunikacja internetowa: Bezpieczna komunikacja przez internet, taka jak HTTPS, w dużej mierze opiera się na kryptografii klucza asymetrycznego. Transport Layer Security (TLS) oraz jego poprzednik, Secure Sockets Layer (SSL), wykorzystują kryptografię klucza asymetrycznego w początkowym procesie uzgadniania (handshake) w celu ustanowienia klucza symetrycznego, który jest następnie używany przez resztę sesji komunikacyjnej.
-
Uwierzytelnianie: Kryptografia klucza asymetrycznego jest używana do tworzenia podpisów cyfrowych, umożliwiając podmiotowi uwierzytelnienie dokumentu cyfrowego lub wiadomości jako pochodzących od konkretnego nadawcy. Jest to wykorzystywane w wielu scenariuszach, od weryfikacji aktualizacji oprogramowania po prawnie wiążące umowy cyfrowe.
-
Szyfrowanie poczty e-mail: Protokoły szyfrowania poczty e-mail, takie jak PGP (Pretty Good Privacy) oraz jego alternatywa open-source GPG (GNU Privacy Guard), wykorzystują kryptografię klucza asymetrycznego, aby zapewnić, że tylko zamierzony odbiorca może odczytać treść wiadomości.
-
Secure shell (SSH): SSH to protokół do bezpiecznego zdalnego logowania i innych bezpiecznych usług sieciowych w niezabezpieczonej sieci. Wykorzystuje on kryptografię klucza asymetrycznego do uwierzytelniania serwera wobec klienta oraz, opcjonalnie, klienta wobec serwera.
-
VPN (wirtualna sieć prywatna): Szyfrowanie kluczem asymetrycznym jest używane do ustanawiania bezpiecznych połączeń w VPN, zapewniając bezpieczną komunikację w sieciach publicznych.
-
Blockchain i kryptowaluty: Technologie blockchain, w tym Bitcoin i Ethereum, wykorzystują kryptografię klucza asymetrycznego. Na przykład własność Bitcoina jest ustalana za pomocą podpisów cyfrowych opartych na kryptografii klucza asymetrycznego.
-
Urzędy certyfikacji: Kryptografia klucza asymetrycznego jest używana przez urzędy certyfikacji (CA) do wydawania i podpisywania certyfikatów cyfrowych, które są używane w komunikacji TLS, podpisywaniu kodu, szyfrowaniu poczty e-mail i nie tylko. Certyfikat cyfrowy wiąże klucz publiczny z konkretnym podmiotem (na przykład osobą lub serwerem).

Rysunek 5. Wydawanie i podpisywanie certyfikatów cyfrowych z wykorzystaniem kryptografii klucza asymetrycznego
Bezpieczeństwo kryptografii klucza asymetrycznego
Kilka pojęć kryptograficznych współgra ze sobą, aby umożliwić bezpieczną kryptografię klucza asymetrycznego, w tym:
Tajność klucza prywatnego: Najbardziej podstawowym wymaganiem bezpieczeństwa AKC jest zachowanie tajności klucza prywatnego. Jednak ponieważ klucz prywatny musi być matematycznie powiązany z kluczem publicznym, tajność klucza prywatnego wymaga również, aby wyprowadzenie klucza prywatnego ze znajomości klucza publicznego było obliczeniowo niewykonalne. Schematy generowania kluczy w AKC opierają się na obliczeniowo trudnych problemach matematycznych, aby spełnić ten wymóg.
Funkcjonalność zapadki (trapdoor) W AKC operacje szyfrowania i deszyfrowania obejmują różne, uzupełniające się klucze z pojedynczej pary kluczy. Szyfrogram wygenerowany przez szyfrowanie z użyciem jednego z kluczy (na przykład klucza publicznego) musi być niezrozumiały dla osób trzecich, a jednocześnie łatwy do odszyfrowania przez posiadacza klucza uzupełniającego (w tym przypadku klucza prywatnego). Innymi słowy, szyfrowanie powinno przypominać jednokierunkową funkcję z zapadką, tak aby osoby trzecie nie mogły odwrócić operacji i odzyskać tekstu jawnego, ale klucz prywatny zapewnia tajną zapadkę, która umożliwia łatwe odwrócenie. Popularne algorytmy AKC wykorzystują potęgowanie modularne do ustanowienia zachowania jednokierunkowej funkcji z zapadką.
Losowość: Proces generowania kluczy powinien również wykorzystywać losowość, aby zapewnić, że klucze są nieprzewidywalne, ponieważ każdy wzorzec lub przewidywalność w generowaniu kluczy mogłyby zostać wykorzystane przez atakującego. Losowość jest również używana do dopełniania (paddingu) podczas szyfrowania w celu generowania semantycznie bezpiecznych szyfrogramów oraz w ramach schematów podpisów cyfrowych do tworzenia unikalnych podpisów, nawet gdy ta sama wiadomość jest podpisywana wielokrotnie. Z tego powodu stosowanie silnych generatorów liczb losowych stanowi istotną część AKC.
Duży rozmiar klucza: Podobnie jak w przypadku SKC, duże rozmiary kluczy zapewniają ochronę przed atakami typu brute force. Jednakże, ponieważ duże rozmiary kluczy również zwiększają koszt obliczeniowy procesu szyfrowania i deszyfrowania, optymalne rozwiązanie musi równoważyć względy bezpieczeństwa i wydajności. Poniższa tabela przedstawia typowe rozmiary kluczy dla różnych protokołów i zastosowań kryptografii klucza asymetrycznego:
| Protokół | Typowe rozmiary klucza (w bitach) | Zastosowanie |
|---|---|---|
| RSA | 1024 (wycofany), 2048, 3072, 4096 | Szyfrowanie, podpisy cyfrowe |
| DSA | 1024 (wycofany), 2048, 3072 | Podpisy cyfrowe |
| DH | 2048, 3072, 4096 | Wymiana kluczy |
| ECDH | 224, 256, 384, 521 | Wymiana kluczy |
| ECDSA | 224, 256, 384, 521 | Podpisy cyfrowe |
Infrastruktura klucza publicznego: W AKC klucze prywatne muszą być utrzymywane w tajemnicy przez właścicieli, podczas gdy klucze publiczne są udostępniane. Konieczny jest bezpieczny mechanizm zarządzania tymi kluczami publicznymi i ich dystrybucji pomiędzy użytkownikami. Infrastruktura klucza publicznego (PKI) zapewnia sposób na to za pomocą certyfikatów cyfrowych. Certyfikat cyfrowy stanowi dowód tożsamości właściciela klucza publicznego i jest wydawany przez zaufany urząd, taki jak urząd certyfikacji (który jest częścią PKI). Stąd PKI odgrywa nieodłączną rolę w bezpieczeństwie nowoczesnych aplikacji wykorzystujących AKC, umożliwiając zarządzanie kluczami na dużą skalę (poprzez tworzenie, zarządzanie, dystrybucję i unieważnianie certyfikatów cyfrowych).
Zagrożenia bezpieczeństwa dla kryptografii klucza asymetrycznego
Jak pokazano w powyższej tabeli, nowoczesne algorytmy klucza asymetrycznego, takie jak RSA, zazwyczaj stosują znacznie większe rozmiary kluczy niż powszechnie używane odpowiedniki klucza symetrycznego, takie jak AES-128. Nawet protokoły oparte na ECC (ECDH i ECDSA), które mają mniejsze rozmiary kluczy, stosują minimum co najmniej 224 bitów dla kluczy. To z kolei oznacza, że atak typu brute force polegający na wyczerpującym przeszukaniu przestrzeni kluczy prywatnych w celu zidentyfikowania właściwego klucza jest obliczeniowo nieosiągalny w dającej się przewidzieć przyszłości. Pozostaje to prawdą nawet gdyby do tego zadania wykorzystano komputery kwantowe. Dlatego ataki na AKC zwykle koncentrują się na wykorzystywaniu innych potencjalnych słabości konkretnych kryptosystemów. Niektóre dobrze udokumentowane tryby ataków celują w:
-
Słabości algorytmiczne poprzez wykorzystanie wyrafinowanych środków matematycznych i obliczeniowych do podważenia założeń dotyczących trudności, na których oparto algorytmy klucza asymetrycznego. Na przykład bezpieczeństwo RSA opiera się na trudności faktoryzacji dużych liczb pierwszych, a ostatnie postępy obliczeniowe umożliwiły pomyślną faktoryzację 829-bitowych kluczy RSA. Dlatego 1024-bitowe RSA jest obecnie wycofywane. Jak zostanie omówione w dalszej części, główne zagrożenie, jakie komputery kwantowe stanowią dla AKC, również mieści się w tej kategorii.
-
Niedoskonała losowość, która może prowadzić do słabości procesu generowania kluczy. Na przykład, jeśli generator liczb losowych używany do tworzenia kluczy jest wadliwy i generuje klucze, które nie są naprawdę losowe, atakujący może być w stanie przewidzieć klucze.
-
Błędy implementacji, takie jak błędy w implementacji algorytmów kryptograficznych, które nieumyślnie ujawniają informacje o kluczach. Na przykład nieprawidłowe dopełnienie (padding) może potencjalnie ujawniać szczegóły dotyczące kluczy.
-
Kanały boczne, które odnoszą się do wycieku informacji z systemu fizycznego wykonującego kryptografię. Takie wycieki mogą mieć postać informacji o czasie, zużyciu energii, a nawet dźwięku, które można wykorzystać w tak zwanym ataku kanałem bocznym. Na przykład analiza czasu potrzebnego na wykonanie operacji kryptograficznych może ujawnić liczbę jedynek w kluczu binarnym. Ten pozornie niewinny wyciek znacząco zawęża przestrzeń przeszukiwania, ujawniając potencjalne rozwiązania problemów, które początkowo wydawały się nie do pokonania.
-
Wymiana kluczy poprzez przechwytywanie kluczy podczas ich wymiany, na przykład w ramach ataku man-in-the-middle (MITM). Protokół DH jest podatny na ataki MITM, jeśli nie zostaną uwzględnione dodatkowe kroki uwierzytelniania.
-
Przechowywanie kluczy poprzez próby kradzieży kluczy ze słabo zabezpieczonego miejsca przechowywania. Obejmuje to ataki fizyczne, takie jak manipulacja lub kradzież urządzeń pamięci masowej.
Zabezpieczanie kryptosystemów klucza asymetrycznego przed różnorodnością możliwych ataków jest zatem znaczącym zadaniem obejmującym rozważania matematyczne, sprzętowe, programowe, logistyczne i prawne.
RSA
Algorytm RSA (Rivest-Shamir-Adleman) jest jednym z pierwszych kryptosystemów klucza publicznego i jest szeroko używany do bezpiecznej transmisji danych. Jest to wszechstronny kryptosystem, ponieważ zapewnia niezbędne operacje umożliwiające szyfrowanie, deszyfrowanie, podpisy cyfrowe oraz wymianę kluczy w ramach wspólnego szkieletu.
W tej sekcji zilustrujemy kryptografię klucza asymetrycznego (AKC) przy użyciu RSA na prostych przykładach.
Użyjemy standardowego scenariusza z dwiema stronami, Alicją i Bobem, którzy chcą komunikować się bezpiecznie za pomocą AKC.
Algorytm RSA
Podstawowy algorytm RSA obejmuje cztery operacje: generowanie kluczy, dystrybucję kluczy, szyfrowanie i deszyfrowanie:
-
Generowanie kluczy:
Klucze publiczny i prywatny są generowane na podstawie zasad matematycznych dotyczących liczb pierwszych, gdzie ich obliczanie jest łatwe, ale operacja odwrotna jest trudna.
Będziemy się do nich odnosić następująco:
- Klucz publiczny:
- Klucz prywatny:
Zauważ, że jest wspólny zarówno dla klucza publicznego, jak i prywatnego, i jest znany jako moduł. Będziemy musieli użyć go później.
Szczegóły matematyczne
- Wybierz dwie różne liczby pierwsze, i .
- wybrane losowo (ze względów bezpieczeństwa).
- Powinny być zbliżone wielkością, ale różnić się długością o kilka cyfr, aby utrudnić faktoryzację.
- Liczby pierwsze można skutecznie wybierać przy użyciu