Moim rodzicom, Anne Cerclet i Henry’emu Wongowi,
którzy pielęgnowali we mnie ciekawość.

Mojej żonie, Felicii Lupu,
która wspierała mnie przez całą tę podróż

Dane oryginału

Real-World Cryptography

David Wong

@ 2021 by Manning Publications Co. All rights reserved.

© LICENSEE 2023. Authorized translation of the English edition © 2021 Manning Publications. This translation is published and sold by permission of Manning Publications, the owner of all rights to publish and sell the same.

Przekład Wojciech Fenrich na zlecenie WITKOM Witold Sikorski

Projekt okładki INT-MEDIA Dawid Mazur

Wydawca Wioleta Szczygielska-Dybciak, Dorota Siudowska-Mieszkowska

Koordynator ds. redakcj Renata Ziółkowska

Redaktor Diana Halida

Korekta Bożena Sigismund, Janusz Sigismund

Koordynator produkcji Anna Bączkowska

Skład wersji elektronicznej na zlecenie Wydawnictwo Naukowe PWN S.A.:
Michał Latusek

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw, jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim lub osobiście znanym. Ale nie publikuj jej w Internecie. Jeśli cytujesz jej fragmenty, nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo

Więcej na www.legalnakultura.pl

Polska Izba Książki

Copyright © for the Polish edition by Wydawnictwo Naukowe PWN SA

Warszawa 2023

ISBN 978-83-01-22928-3

eBook został przygotowany na podstawie wydania papierowego z 2023r. (Wydanie I)

Warszawa 2023

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl, reklama@pwn.pl

www.pwn.pl

Fragment

przedmowa

podziękowania

o książce

o autorze

Część I. Prymitywy. Składniki kryptografii

1. Wprowadzenie

1.1. W kryptografii chodzi o zabezpieczenie protokołów

1.2. Kryptografia symetryczna. Czym jest szyfrowanie symetryczne?

1.3. Zasada Kerckhoffsa: tylko klucz pozostaje tajny

1.4. Kryptografia asymetryczna. Dwa klucze są lepsze niż jeden

1.4.1. O wymienianiu się kluczami albo jak uzyskać dostęp do wspólnego sekretu

1.4.2. Szyfrowanie asymetryczne, nie mylić z symetrycznym

1.4.3. Podpisy cyfrowe, zupełnie jak te tradycyjne

1.5. Kryptografia: klasyfikacje i abstrakcje

1.6. Kryptografia teoretyczna a prawdziwy świat kryptografii

1.7. Od teorii do praktyki. Każdy może pójść własną ścieżką

1.8. Słowo ostrzeżenia

2. Funkcje skrótu (funkcje haszujące)

2.1. Czym jest funkcja skrótu?

2.2. Właściwości zabezpieczeń funkcji skrótu

2.3. Uwarunkowania zabezpieczeń dla funkcji skrótu

2.4. Funkcje skrótu w praktyce

2.4.1. Zobowiązania

2.4.2. Integralność zasobów podrzędnych

2.4.3. BitTorrent

2.4.4. Tor

2.5. Znormalizowane funkcje skrótu

2.5.1. Funkcja haszująca SHA-2

2.5.2. Funkcja haszująca SHA-3

2.5.3. SHAKE i cSHAKE. Dwie funkcje o rozszerzalnym wyjściu (XOF)

2.5.4. Jak uniknąć wieloznacznego haszowania za pomocą TupleHash

2.6. Haszowanie haseł

3. Kody uwierzytelniania wiadomości

3.1. Ciasteczka bezstanowe – motywujący przykład dla MAC

3.2. Kod z przykładem

3.3. Właściwości zabezpieczeń MAC

3.3.1. Fałszerstwo znacznika uwierzytelniania

3.3.2. Długość znacznika uwierzytelniania

3.3.3. Ataki powtórzeniowe

3.3.4. Weryfikacja znaczników uwierzytelniania w stałym czasie

3.4. MAC w prawdziwym świecie

3.4.1. Uwierzytelnianie wiadomości

3.4.2. Wyprowadzanie kluczy

3.4.3. Integralność ciasteczek

3.4.4. Tablice mieszające

3.5. Kody uwierzytelniania wiadomości w praktyce

3.5.1. HMAC, czyli MAC oparty na haszu

3.5.2. KMAC, czyli MAC oparty na cSHAKE

3.6. SHA-2 i ataki przedłużenia długości

4. Szyfrowanie uwierzytelnione

4.1. Czym jest szyfr?

4.2. Szyfr blokowy AES

4.2.1. Jaki poziom bezpieczeństwa zapewnia AES?

4.2.2. Interfejs AES

4.2.3. Wewnętrzna konstrukcja AES

4.3. Zaszyfrowany pingwin i tryb CBC

4.4. Na brak uwierzytelnienia – AES-CBC-HMAC

4.5. Konstrukcje typu „wszystko w jednym”. Szyfrowanie uwierzytelnione

4.5.1. Czym jest szyfrowanie uwierzytelnione z powiązanymi danymi (AEAD)?

4.5.2. Algorytm AEAD o nazwie AES-GCM

4.5.3. ChaCha20-Poly1305

4.6. Inne rodzaje szyfrowania symetrycznego

4.6.1. Opakowywanie klucza

4.6.2. Szyfrowanie uwierzytelnione odporne na niepoprawne użycie nonce

4.6.3. Szyfrowanie dysku

4.6.4. Szyfrowanie baz danych

5. Wymiany klucza

5.1. Czym są wymiany klucza?

5.2. Wymiana klucza Diffiego-Hellmana (DH)

5.2.1. Teoria grup

5.2.2. Problem logarytmu dyskretnego. Fundament algorytmu Diffiego-Hellmana

5.2.3. Normy algorytmu Diffiego-Hellmana

5.3. Wymiana kluczy przy użyciu protokołu Diffiego-Hellmana w przestrzeni krzywych eliptycznych

5.3.1. Czym jest krzywa eliptyczna?

5.3.2. Jak działa algorytm Diffiego-Hellmana oparty na krzywych eliptycznych?

5.3.3. Normy dla algorytmu Diffiego-Hellmana w przestrzeni krzywych eliptycznych

5.4. Atak przeciwko małym podgrupom i inne czynniki związane z bezpieczeństwem

6. Szyfrowanie asymetryczne i szyfrowanie hybrydowe

6.1. Czym jest szyfrowanie asymetryczne?

6.2. Szyfrowanie asymetryczne i szyfrowanie hybrydowe w praktyce

6.2.1. Wymiany klucza i kapsułkowanie klucza

6.2.2. Szyfrowanie hybrydowe

6.3. Szyfrowanie asymetryczne przy użyciu RSA: złe i mniej złe

6.3.1. Podręcznikowe RSA

6.3.2. Dlaczego nie należy używać RSA PKCS#1 v1.5

6.3.3. Szyfrowanie asymetryczne przy użyciu RSA-OAEP

6.4. Szyfrowanie hybrydowe przy użyciu ECIES

7. Podpisy i dowody z wiedzą zerową

7.1. Czym jest podpis?

7.1.1. Jak w praktyce weryfikować podpisy

7.1.2. Najważniejszy przypadek użycia podpisów, czyli uwierzytelnione wymiany klucza

7.1.3. Rzeczywisty przypadek użycia. Infrastruktura klucza publicznego

7.2. Dowody z wiedzą zerową (ZKP). Pochodzenie podpisów

7.2.1. Protokół identyfikacji Schnorra. Interaktywny dowód z wiedzą zerową

7.2.2. Podpisy jako nieinteraktywne dowody z wiedzą zerową

7.3. Algorytmy podpisów, z których powinniśmy korzystać (lub nie)

7.3.1. RSA PKCS#1 v1.5, czyli zła norma

7.3.2. RSA-PSS. Lepsza norma

7.3.3. Algorytm podpisu elektronicznego oparty na krzywych eliptycznych

7.3.4. Algorytm podpisu cyfrowego oparty na krzywej Edwardsa

7.4. Subtelności schematów podpisów

7.4.1. Ataki podstawieniowe na podpisy

7.4.2. Deformowalność podpisu

8. Losowość i sekrety

8.1. Czym jest losowość?

8.2. Powolna losowość? Skorzystajmy z generatora liczb pseudolosowych (PRNG)

8.3. Uzyskiwanie losowości w praktyce

8.4. Generowanie losowości i czynniki związane z bezpieczeństwem

8.5. Publiczna losowość

8.6. Wyprowadzanie kluczy za pomocą HKDF

8.7. Zarządzanie kluczami i sekretami

8.8. Decentralizacja zaufania za pomocą kryptografii progowej

Część II. Protokoły, czyli przepisy na kryptografię

9. Bezpieczny transport

9.1. Bezpieczne protokoły transportowe: SSL i TLS

9.1.1. Od SSL do TLS

9.1.2. TLS w praktyce

9.2. Jak działa protokół TLS?

9.2.1. Handshake TLS

9.2.2. Jak TLS 1.3 szyfruje dane aplikacji

9.3. Aktualny stan szyfrowania w sieci web

9.4. Inne bezpieczne protokoły transportowe

9.5. Framework protokołu Noise. Współczesna alternatywa dla TLS

9.5.1. Wiele odcieni fazy handshake

9.5.2. Handshake przy użyciu Noise

10. Szyfrowanie od  końca do końca

10.1. Dlaczego szyfrowanie od końca do końca?

10.2. Niemożliwe do odnalezienia źródło zaufania

10.3. Porażka szyfrowanych e-maili

10.3.1. PGP czy GPG? I jak to w ogóle działa?

10.3.2. Skalowanie zaufania pomiędzy użytkownikami za pomocą sieci zaufania

10.3.3. Odkrywanie kluczy to prawdziwy problem

10.3.4. Jeśli nie PGP, to co?

10.4. Bezpieczne przesyłanie wiadomości. Nowoczesne spojrzenie na szyfrowanie od końca do końca w aplikacji Signal

10.4.1. Bardziej przyjazny dla użytkownika niż WOT. Ufaj, ale weryfikuj

10.4.2. X3DH. Handshake protokołu Signal

10.4.3. Podwójna Zapadka. Protokół post-handshake Signala

10.5. Stan szyfrowania od końca do końca

11. Uwierzytelnianie użytkownika

11.1. Uwierzytelnianie – kilka słów podsumowania

11.2. Uwierzytelnianie użytkownika, czyli jak pozbyć się haseł

11.2.1. Jedno hasło, by rządzić wszystkimi. Pojedyncze logowanie (SSO) i menedżery haseł

11.2.2. Nie chcecie widzieć haseł? Użyjcie asymetrycznej wymiany kluczy uwierzytelnianej hasłem

11.2.3. Hasła jednorazowe to tak naprawdę nie hasła. Bezhasłowość przy użyciu kluczy symetrycznych

11.2.4. Jak zastąpić hasła kluczami asymetrycznymi

11.3. Uwierzytelnianie wspomagane przez użytkownika – parowanie urządzeń wykorzystujące wsparcie człowieka

11.3.1. Klucze wstępnie współdzielone

11.3.2. Symetryczne uwierzytelnianie hasłem wymiany klucza przy użyciu CPace

11.3.3. Czy naszą wymianę klucza zaatakował pośrednik? Po prostu sprawdźmy krótki ciąg uwierzytelniony (SAS)

Podsumowanie

12. Krypto jak w słowie „kryptowaluta”?

12.1. Wprowadzenie do algorytmów konsensusu tolerancyjnych na bizantyjskie błędy

12.1.1. Problem odporności. Protokoły rozproszone przychodzą na ratunek

12.1.2. Problem zaufania? Decentralizacja przychodzi z pomocą

12.1.3. Problem skali. Sieci bezpozwoleniowe i odporne na cenzurę

12.2. Jak działa bitcoin?

12.2.1. W jaki sposób bitcoin obsługuje salda użytkownika i transakcje

12.2.2. Wydobywanie bitcoinów w cyfrowej złotej erze

12.2.3. Jasny fork! Rozwiązywanie konfliktów wydobywczych

12.2.4. Redukcja rozmiaru bloku za pomocą drzew Merkle

12.3. Wycieczka po świecie kryptowalut

12.3.1. Zmienna wartość

12.3.2. Latencja

12.3.3. Rozmiar łańcucha bloków

12.3.4. Poufność

12.3.5. Wydajność energetyczna

12.4. DiemBFT. Tolerancyjny na bizantyjskie błędy protokół konsensusu

12.4.1. Bezpieczeństwo i żywotność. Dwie własności protokołu konsensusu BFT

12.3.2. Runda w protokole DiemBFT

12.4.3. Ile nieuczciwości może tolerować protokół?

12.4.4. Zasady głosowania DiemBFT

12.4.5. Kiedy transakcje uważa się za sfinalizowane?

12.4.6. Intuicje stojące za bezpieczeństwem DiemBFT

13. Kryptografia sprzętowa

13.1. Model napastnika we współczesnej kryptografii

13.2. Niezaufane środowiska. Sprzęcie, ratuj!

13.2.1. Kryptografia białej skrzynki – zły pomysł

13.2.2. Siedzą w naszych portfelach. Inteligentne karty i bezpieczne elementy

13.2.3. Banki je uwielbiają. Sprzętowe moduły bezpieczeństwa

13.2.4. Moduły zaufanej platformy (TPM). Przydatna normalizacja elementów bezpiecznych

13.2.5. Poufne obliczenia z zaufanym środowiskiem wykonawczym

13.3. Które rozwiązanie będzie dobre dla mnie?

13.4. Kryptografia odporna na wycieki, czyli jak złagodzić ataki kanałem bocznym w oprogramowaniu

13.4.1. Programowanie stałoczasowe

13.4.2. Nie korzystaj z sekretu! Maskowanie

13.4.3. A co z atakami usterek?

Podsumowanie

14. Kryptografia postkwantowa

14.1. Czym są komputery kwantowe i dlaczego straszą kryptografów?

14.1.1. Mechanika kwantowa – studium rzeczy małych

14.1.2. Od narodzin komputerów kwantowych po supremację kwantową

14.1.3. Wpływ algorytmów Grovera i Shora na kryptografię

14.1.4. Kryptografia postkwantowa, czyli jak się bronić przed komputerami kwantowymi

14.2. Podpisy oparte na haszach. Nie potrzeba niczego poza funkcją skrótu

14.2.1. Podpisy jednorazowe (OTS) z podpisami Lamporta

14.2.2. Mniejsze klucze i jednorazowe podpisy Winternitza

14.2.3. Podpisy wielorazowe z XMSS oraz SPHINCS+

14.3. Krótsze klucze i podpisy dzięki kryptografii opartej na kratach

14.3.1. Czym jest krata?

14.3.2. Uczenie się z błędami podstawą kryptografii?

14.3.3. Kyber, czyli wymiana klucza oparta na kracie

14.3.4. Dilithium – schemat podpisu oparty na kracie

14.4. Czy powinniśmy zacząć panikować?

Podsumowanie

15. Czy to już wszystko? Kryptografia następnej generacji

15.1. Im więcej, tym lepiej. Bezpieczne obliczenia wielostronne

15.1.1. Przecięcie zbiorów prywatnych (PSI)

15.1.2. MPC ogólnego przeznaczenia

15.1.3. Stan MPC

15.2. W pełni homomorficzne szyfrowania i obietnica zaszyfrowanej chmury

15.2.1. Przykład szyfrowania homomorficznego z szyfrowaniem RSA

15.2.2. Różne typy szyfrowania homomorficznego

15.2.3. Bootstrapping, klucz do w pełni homomorficznego szyfrowania

15.2.4. Schemat FHE oparty na problemie uczenia się z błędami

15.2.5. Gdzie się z tego korzysta?

15.3. Dowody z wiedzą zerową ogólnego przeznaczenia

15.3.1. Jak działają schematy zk-SNARK

15.3.2. Zobowiązania homomorficzne – ukrywamy części dowodu

15.3.3. Parowania bilinearne – ulepszamy nasze zobowiązania homomorficzne

15.3.4. Skąd się bierze zwięzłość?

15.3.5. Od programów do wielomianów

15.3.6. Programy są dla komputerów; nam potrzebne są układy arytmetyczne

15.3.7. Układy arytmetyczne R1CS

15.3.8. Od R1CS do wielomianu

15.3.9. Trzeba dwojga, aby określić wartość wielomianu ukrytego w wykładniku

Podsumowanie

16. Kiedy i gdzie kryptografia zawodzi

16.1. Szukanie właściwego prymitywu kryptograficznego lub protokołu to nudna praca

16.2. W jaki sposób korzystam z prymitywu kryptograficznego lub protokołu? Uprzejme normy i formalna weryfikacja

16.3. Gdzie są dobre biblioteki?

16.4. Niewłaściwe wykorzystanie kryptografii. Programiści to wrogowie

16.5. Robicie to źle. Użyteczne zabezpieczenia

16.6. Kryptografia nie jest wyspą

16.7. Nasze obowiązki jako praktyków kryptografii. Dlaczego nie powinniśmy wdrażać własnej kryptografii

Podsumowanie

Dodatek. Odpowiedzi  do ćwiczeń

Rozdział 2

Rozdział 3

Rozdział 6

Rozdział 7

Rozdział 8

Rozdział 9

Rozdział 10

Rozdział 11

Przypisy

Pozostałe rozdziały dostępne w pełnej wersji e-booka.

przedmowa

Chwyciwszy tę książkę, możecie zadać pytanie, po co komu kolejna pozycja na temat kryptografii. Czy w ogóle warto poświęcić czas na jej przeczytanie? Aby udzielić odpowiedzi na te pytania, trzeba zrozumieć, kiedy to wszystko się zaczęło.

Książka, która pisała się latami

W dzisiejszych czasach, chcąc dowiedzieć się czegokolwiek o czymkolwiek, googlujemy to, bingujemy albo baidujemy – wiadomo, o co chodzi. Mimo to w wypadku kryptografii, w zależności od tego, czego szukamy, zasoby mogą być jednak nader skąpe. Jest to problem, na który natrafiłem dawno temu i który od tamtej pory był dla mnie stałym źródłem frustracji.

Gdy byłem jeszcze studentem, musiałem zaimplementować na zajęcia atak oparty na różnicowej analizie mocy. W owym czasie stanowił on przełom w kryptoanalizie i był pierwszym opublikowanym atakiem kanałem bocznym. Atak wykorzystujący różnicową analizę mocy to coś magicznego: mierząc pobór mocy urządzenia w momencie, gdy coś szyfruje lub odszyfrowuje, można poznać jego sekrety. Zdałem sobie sprawę, że znakomite artykuły mogłyby być nośnikiem wielkich idei, nie przykładają jednak dużej wagi do klarowności i zrozumiałości. Pamiętam, jak biłem głową w ścianę, próbując zrozumieć, co autor próbował powiedzieć. Co gorsza, nie mogłem znaleźć w Internecie dobrych źródeł, które objaśniałyby ten artykuł. Walnąłem więc głową w ścianę jeszcze kilka razy i w końcu udało mi się go zrozumieć. A potem pomyślałem, że może mógłbym pomóc innym, takim jak ja osobom, które będą zmuszone do przejścia tej drogi przez mękę.

Zmotywowany narysowałem kilka diagramów, dodałem animacje i nagrałem to, jak je omawiam. To było moje pierwsze wideo na YouTube poświęcone kryptografii: https://www.youtube.com/watch?v=gbqNCgVcXsM.

Wiele lat po zamieszczeniu tego filmu nadal otrzymuję podziękowania od przypadkowych osób z Internetu. Nie dalej jak wczoraj, gdy pisałem tę przedmowę, ktoś napisał: „Dziękuję, naprawdę świetne wyjaśnienie, które zapewne zaoszczędziło mi wielu godzin prób zrozumienia tego artykułu”.

Cóż za nagroda! Te maleńkie kroczki, które pozwoliły mi podjąć ryzyko przejścia na edukacyjną drugą stronę, wystarczyły, bym zapragnął robić więcej. Zacząłem nagrywać kolejne podobne filmy, a następnie zabrałem się do pisania bloga na temat kryptografii. Możecie go znaleźć pod adresem https://cryptologie.net.

Nim zacząłem prace nad tą książką, zgromadziłem prawie 500 artykułów wyjaśniających wiele pojęć wykraczających poza to wprowadzenie. To wszystko były tylko ćwiczenia. Całe lata przed tym, jak wydawnictwo Manning Publications zwróciło się do mnie z propozycją napisania książki, w tyle mojej głowy powoli dojrzewał już taki pomysł.

PROGRAM ZAJĘĆ DLA KRYPTOGRAFÓW Z PRAWDZIWEGO ŚWIATA

Uzyskałem tytuł licencjata z matematyki teoretycznej i nie wiedziałem, co mnie dalej czeka. Całe życie programowałem i chciałem powiązać te dwie rzeczy. W naturalny sposób zaciekawiła mnie kryptografia, która wydała się łączyć to, co w obu tych światach jest najlepsze. Zacząłem więc czytać różne książki, które wpadły mi w ręce. Szybko odkryłem swoje życiowe powołanie.

Niektóre rzeczy były jednak denerwujące: w szczególności długie wprowadzenia rozpoczynające się od rysu historycznego. Tak jak zawsze interesowały mnie jedynie technikalia. Przysiągłem sobie, że jeśli kiedykolwiek napiszę książkę o kryptografii, nie znajdzie się w niej ani jeden wiersz tekstu poświęcony szyfrom Vigenère’a, szyfrom Cezara i innym artefaktom historii. I tak, po uzyskaniu tytułu magistra kryptografii na Uniwersytecie w Bordeaux, myślałem, że jestem gotowy na zmierzenie się z prawdziwym światem. Okazało się jednak, że niewiele wiedziałem o życiu…

Sądziłem, że mój tytuł zawodowy wystarczy, ale moje wykształcenie miało luki dotyczące wielu stosowanych w prawdziwym świecie protokołów, które miałem zaatakować. Spędziłem wiele czasu, ucząc się matematycznych podstaw krzywych eliptycznych, ale nie wiedziałem, w jaki sposób korzystały z nich algorytmy kryptograficzne. Poznałem, czym jest rejestr przesuwający z liniowym sprzężeniem zwrotnym (LFSR), algorytmy ElGamala oraz DES, a także szereg prymitywów kryptograficznych, których miałem już nigdy potem nie ujrzeć na oczy.

Kiedy zacząłem pracować w branży w firmie Matasano, która następnie przekształciła się w NCC Group, moim pierwszym zadaniem był audyt OpenSSL, najbardziej popularnej implementacji SSS/TLS – kodu, który zaszyfrował praktycznie cały Internet. Ależ mi to przeorało łepetynę! Pamiętam, że codziennie wracałem z pracy z silnym bólem głowy. Biblioteka masakra! Protokół katastrofa! Wtedy jeszcze nie wiedziałem, że kilka lat później zostanę współautorem TLS 1.3, najnowszej wersji tego protokołu.

W tym momencie myślałem już jednak: „To tego powinienem był uczyć się w szkole. Wiedza, którą zdobywam teraz, byłaby przydatna, by przygotować mnie na starcie z prawdziwym światem! W końcu uprawiałem teraz zawód specjalisty do spraw bezpieczeństwa kryptograficznego! Dokonywałem inspekcji prawdziwych zastosowań kryptografii! Robiłem to, co niejeden chciałby robić po zdobyciu dyplomu z tej dziedziny. Implementowałem, weryfikowałem i wykorzystywałem kryptograficzne algorytmy, a także doradzałem w kwestii tego, z których z nich korzystać. Oto powód, dla którego jestem pierwszym czytelnikiem książki, którą piszę. To coś, co napisałbym samemu sobie z przeszłości, by przygotować się na spotkanie z rzeczywistością.

POTRZEBA NOWEJ KSIĄŻKI?

Gdy prowadziłem jedną z dorocznych kryptograficznych sesji warsztatowych na bardzo znanej konferencji Black Hat poświęconej bezpieczeństwu, podszedł do mnie jeden z uczestników i zapytał, czy mógłbym polecić jakąś dobrą książkę lub kurs internetowy poświęcony kryptografii. Pamiętam, że doradziłem mu lekturę książki Boneha i Shoupa oraz wzięcie udziału w kursie Kryptografia I prowadzonym przez Boneha na platformie Coursera. (Podtrzymuję zresztą te rekomendacje na końcu niniejszej książki).

Student odpowiedział mi: „Ach, już ich próbowałem! Są zbyt teoretyczne!”. Ta odpowiedź nie dawała mi spokoju. W pierwszym odruchu nie chciałem się zgodzić, ale powoli zdawałem sobie sprawę z tego, że miał rację. Większość źródeł jest pełna matematyki, a większość programistów mających styczność z kryptografią nie chce mieć z nią do czynienia. Co zostaje dla nich?

Pozostałymi dwoma zasobami, które do pewnego stopnia cieszyły się uznaniem, były w owym czasie książki Applied Cryptography (Kryptografia stosowana) i Cryptography Engineering (Inżynieria kryptograficzna), obie autorstwa Bruce’a Schneiera. Książki te zaczynały już jednak trącić myszką. W Applied Cryptography cztery rozdziały poświęcone były szyfrom blokowym, a cały jeden rozdział traktował o trybach pracy szyfrów, ale nie było żadnego, który traktowałby o szyfrowaniu uwierzytelnionym. Nieco nowsza Cryptography Engineering w przypisie zawierała pojedynczą wzmiankę poświęconą kryptografii krzywych eliptycznych. Z drugiej strony wiele moich filmów wideo i notek na blogu stawało się dobrymi, podstawowymi materiałami źródłowymi dla niektórych pojęć kryptograficznych. Wiedziałem, że mógłbym zrobić coś wyjątkowego. Stopniowo wielu moich studentów zaczynało interesować się kryptowalutami, zadając coraz więcej i więcej pytań na ten temat. W tym samym czasie zacząłem audytować coraz więcej aplikacji związanych z kryptowalutami. Nieco później przeniosłem się do Facebooka, aby pokierować kwestiami bezpieczeństwa kryptowaluty Libra (znanej obecnie jako Diem). W owym czasie kryptowaluty były jednym z najciekawszych obszarów, w jakich można było pracować, bowiem spotykało się tu ze sobą mnóstwo niezwykle interesujących prymitywów kryptograficznych, które jak do tej pory jedynie w bardzo niewielkim stopniu znajdowały zastosowanie w prawdziwym świecie, a niekiedy nie znajdowały go wcale (dowody z wiedzą zerową, agregacja podpisów, kryptosystem progowy, bezpieczne obliczenia wielostronne, protokoły konsensusu, akumulatory kryptograficzne, weryfikowalne funkcje losowe, weryfikowalne funkcje opóźniające… – lista ta ciągnie się dalej). A mimo to żadna z książek poświęconych kryptografii nie zawierała rozdziału dotyczącego kryptowalut. Moje położenie było więc wyjątkowe.

Wiedziałem, że mógłbym napisać coś, co tłumaczyłoby studentom, programistom, konsultantom, inżynierom bezpieczeństwa i innym, o co chodzi we współczesnej kryptografii stosowanej. Miała to być książka zawierająca niewiele wzorów, za to pełna diagramów. Miała to być książka zdawkowo traktująca kwestie historyczne, za to pełna współczesnych opowieści o kryptograficznych porażkach, które widziałem na własne oczy. Miała to być książka, w której niewiele miejsca poświęcone będzie starszym algorytmom, za to pełna kryptograficznych kwestii, o których stosowaniu na dużą skalą mogę osobiście zaświadczyć: TLS, framework Noise służący do tworzenia protokołów, protokół Signal, kryptowaluty, HSM, kryptosystem progowy i tak dalej. Miała to być książka tylko w niewielkim stopniu poświęcona kryptografii teoretycznej, ale za to pełna zagadnień, które mogłyby okazać się istotne: wymiana kluczy uwierzytelnianych hasłem, dowodów z wiedzą zerową, kryptografii postkwantowej i tak dalej.

Gdy wydawnictwo Manning Publications zwróciło się do mnie w 2018 roku z pytaniem, czy nie chciałbym napisać książki o kryptografii, znałem już odpowiedź. Wiedziałem też, co chcę napisać. Czekałem jedynie na kogoś, kto dałby mi okazję i wymówkę, bym mógł poświęcić swój czas na napisanie książki, która chodziła mi po głowie. Tak się składa, że Manning wydaje serię „real-world”, stąd naturalna wydała mi się sugestia, by moja książka ją poszerzyła. Pozycja ta stanowi rezultat ponad dwóch lat ciężkiej pracy i mnóstwa miłości. Mam nadzieję, że się wam spodoba.

podziękowania

Dziękuję Marinie Michael za jej bezustanną pomoc i wnikliwość – bez niej tej książki prawdopodobnie nie udałoby się ukończyć. Dziękuję Francesowi Buranowi, Samowi Zaydelowi, Michaelowi Rosenbergowi, Pascalowi Knechtowi, Sethowi Davidowi Schoenowi, Eyalowi Ronenowi, Saralynn Chick, Bobowi Seacordowi, Eloiowi Manuelowi, Robowi Woodowi, Hunterowi Monkowi, Jean-Christophe’owi Forestowi, Liviu Barcie, Mattii Reggianiemu, Olivierowi Guerrze, Andreyowi Labunovowi, Carlowi Littkemu, Yanowi Ivnitskiy’emu, Kellerowi Fuchsowi, Romanowi Zabickiemu, M.K. Saravananowi, Sarah Zennou, Danielowi Bourdrezowi, Jasonowi Nollowi, Iliasowi Cherkaoui’emu, Felipemu de Limie, Raulowi Silesowi, Matteo Bocchiemu, Johnowi Woodsowi, Kostasowi Chalkiasowi, Yolanowi Romaillerowi, Gerardowi di Giacomowi, Gregory’emu Nazariowi, Robowi Stubbsowi, Jánowi Jančárowi, Gabe’owi Pike’owi, Kiranowi Tummali, Stephenowi Singamowi, Jeremy’emu O’Donoghue’owi, Jeremy’emu Boone’owi, Thomasowi Duboucherowi, Charlesowi Guillemetowi, Ryanowi Sleeviemu, Lionelowi Rivièremu, Benjaminowi Larsenowi, Gabrielowi Gionowi, Daanowi Sprenkelsowi, Andreasowi Krogenowi, Vadimowi Lyubashevsky’emu, Samuelowi Nevesowi, Stevenowi (Dongzemu) Yuowi, Tony’emu Patti, Grahamowi Steelowi oraz wszystkim komentującym w serwisie liveBook za mnóstwo rozmów i poprawek, a także za wsparcie techniczne i redakcyjne.

Dziękuję też wszystkim recenzentom: Adhirowi Ramjiawanowi, Alowi Pezewskiemu, Alowi Rahimiemu, Alessandrowi Campeisowi, Bobby’emu Linowi, Chadowi Davisowi, Davidowi T. Kernsowi, Domingowi Salazarowi, Eddy’emu Vluggenowi, Gáborowi Lászlówi Hajbie, Geertowi van Laethemowi, Grzegorzowi Bernasiowi, Haraldowi Kuhnowi, Hugonowi Duranie, Janowi Pieterowi Herweijerowi, Jeffowi Smithowi, Jimowi Karabatsosowi, Joelowi Kotarskiemu, Johnowi Paraskevopoulosowi, Mattowi van Winklemu, Michalowi Rutce, Paulowi Grebencowi, Richardowi Lebelowi, Ruslanowi Shevchence, Sanjeevowi Jaiswalowi, Shawnowi P. Bolanowi, Thomasowi Doylendowi i Williamowi Rudenmalmowi. Wasze sugestie pomogły uczynić tę książkę lepszą.

o książce

Minęły już ponad dwa lata, odkąd zacząłem pisać tę książkę. Początkowo chciałem, aby stanowiła ona wprowadzenie do wszystkich wartych poznania kwestii związanych z tym rodzajem kryptografii, który wykorzystywany jest w prawdziwym świecie. Jest to jednak zadanie niemożliwe do wykonania. Żadnej dziedziny nie da się podsumować w jednej książce. Z tego powodu musiałem zachować równowagę między tym, jak wiele szczegółów chciałem przedstawić czytelnikom i jak szeroki obszar chciałem objąć. Mam nadzieję, że pod tym względem okażemy się zgodni. Jeśli szukacie praktycznej książki, która nauczy was kryptografii implementowanej i wykorzystywanej przez przedsiębiorstwa i produkty, i jeśli jesteście ciekawi, jak kryptografia w prawdziwym świecie działa pod powierzchnią, ale nie szukacie podręcznika zawierającego wszystkie szczegóły implementacji – ta książka jest dla was.

KTO POWINIEN PRZECZYTAĆ TĘ KSIĄŻKĘ

Oto lista typów osób, które moim zdaniem skorzystałyby na lekturze tej książki (proszę jednak, byście nikomu nie dawali się szufladkować).

Studenci

Jeśli studiujecie informatykę, bezpieczeństwo lub kryptografię i chcecie nauczyć się czegoś o zagadnieniach kryptograficznych w kształcie, w jakim są wykorzystywane w prawdziwym świecie (np. ponieważ celujecie w pracę w tej branży lub chcecie w ramach pracy naukowej zajmować się zagadnieniami stosowanymi), wtedy w mojej ocenie jest to podręcznik dla was. Dlaczego? Ponieważ, jak wspomniałem w przedmowie, dawno temu byłem takim studentem i napisałem taką książkę, jaką chciałbym mieć wtedy pod ręką.

Osoby zawodowo zajmujące się kwestiami bezpieczeństwa

Gdy nauczałem kryptografii stosowanej, większą część mojej grupy studenckiej stanowiły osoby zajmujące się testami penetracyjnymi, konsultanci, inżynierowie i architekci zajmujący się kwestiami bezpieczeństwa, a także osoby piastujące inne, związane z nimi stanowiska. Z tego powodu materiał ten został udoskonalony za sprawą wielu pytań, jakie otrzymałem, próbując wyjaśnić skomplikowane zagadnienia kryptograficzne osobom niebędącym kryptografami. Jako że sam jestem osobą zawodowo zajmującą się bezpieczeństwem, książkę tę ukształtowały również kryptografia uprawiana przeze mnie w ramach audytów prowadzonych dla wielkich przedsiębiorstw oraz błędy, które przy okazji poznałem.

Twórcy oprogramowania bezpośrednio lub pośrednio wykorzystujący kryptografię

Książce tej kształt nadały również liczne rozmowy, jakie odbyłem z klientami i współpracownikami, którzy w większości nie zajmowali się zawodowo ani kwestiami bezpieczeństwa, ani kryptografią. Dziś coraz trudniej jest tworzyć kod, nie dotykając zupełnie zagadnień kryptograficznych. Z tego względu pewna doza zrozumienia tego, z czego się korzysta, jest konieczna. Książka ta umożliwia takie zrozumienie, wykorzystując przykłady kodu w różnych językach programowania, a tym, których temat zaciekawi, zaoferuje jeszcze więcej.

Kryptografowie ciekawi innych obszarów

Książka ta stanowi wprowadzenie do kryptografii stosowanej, która przydaje się osobom takim jak ja. Pamiętajcie, że napisałem ją przede wszystkim dla siebie. Jeśli udało mi się dobrze wykonać robotę, kryptograf teoretyk powinien móc szybko zrozumieć, jak wygląda świat kryptografii stosowanej; inny, pracujący nad szyfrowaniem symetrycznym, dzięki lekturze odpowiedniego rozdziału powinien umieć prędko podłapać zagadnienia związane z wymianą kluczy zabezpieczaną hasłem; z kolei trzeci, pracujący z protokołami, powinien umieć szybko i gruntownie zrozumieć kryptografię kwantową – i tak dalej.

Osoby kierujące pracami inżynierskimi oraz menedżerowie produktu, którzy chcą zrozumieć więcej

Ta książka próbuje również odpowiedzieć na pytania, które uważam za bardziej zorientowane na produkt: jakie są kompromisy i ograniczenia różnych podejść? W jakie ryzyko się pakujecie? Czy ta ścieżka pomoże wam postąpić zgodnie z regułami? Czy musicie zrobić to i to, aby pracować z rządem?

Żądne wiedzy osoby, które chcą zrozumieć, o co chodzi w prawdziwym świecie kryptografii

Nie musicie należeć do żadnego z typów, które wymieniłem, aby przeczytać tę książkę. Wystarczy, że jesteście ciekawi kryptografii stosowanej w prawdziwym świecie. Pamiętajcie, że nie uczę historii kryptografii i nie uczę podstaw informatyki, więc powinniście przynajmniej słyszeć już coś o kryptografii, nim zabierzecie się do lektury książki takiej jak ta.

Zakładana wiedza – dłuższa wersja

Czego będzie nam trzeba, by wycisnąć z tej książki tyle, ile się da? Powinniśmy wiedzieć, że ta książka zakłada, że dysponujemy podstawowym rozumieniem tego, jak działa nasz laptop oraz Internet i że przynajmniej słyszeliśmy coś o szyfrowaniu. Książka ta traktuje o kryptografii w prawdziwym świecie i ciężko będzie umieścić rzeczy w kontekście, jeśli nie korzystamy swobodnie z komputera i nigdy wcześniej nie słyszeliśmy słowa „szyfrowanie”.

Zakładając, że co nieco wiemy o tym, w co się pakujemy, bardzo pomogłoby, gdybyśmy wiedzieli, czym są bity i bajty, i gdybyśmy widzieli kiedyś operacje bitowe takie jak XOR, przesunięcie w lewo czy inne, a może nawet z nich korzystali. Jeśli tak nie jest, czy powinniśmy dać sobie spokój z tą książką? Nie, ale możliwe, że tu i tam trzeba będzie zatrzymać się na kilka minut i trochę pogooglować przed powrotem do lektury.

Tak naprawdę bez względu na to, jak wysokie są nasze kwalifikacje, w trakcie lektury od czasu do czasu trzeba będzie się zatrzymać i poszukać dodatkowych informacji w Internecie – czy to dlatego, że zapomniałem zdefiniować jakieś słowo przed jego użyciem (wstyd!), czy też dlatego, że mylnie założyłem, że już je znacie. Tak czy inaczej, nie powinien to być duży kłopot, ponieważ tak dobrze, jak tylko potrafię, staram się wyjaśniać różne wprowadzane przeze mnie pojęcia, tak jak tłumaczyłbym je pięcioletniemu dziecku.

I wreszcie – gdy używam słowa kryptografia, nasze mózgi prawdopodobnie myślą o matematyce. Dodatkowo, jeśli na tę myśl nasze twarze wykrzywiają się w grymasie, powinno nas ucieszyć, że nie musimy się tym zanadto przejmować. W tej książce chodzi o wyrobienie w sobie przenikliwości pozwalającej na intuicyjne zrozumienie tego, jak to wszystko działa, stąd na ile tylko jest to możliwe, stara się ona unikać matematycznych szczegółów.

Oczywiście skłamałbym, gdybym powiedział, że w powstanie tej książki matematyka nie miała żadnego wkładu. Nie da się uczyć o kryptografii bez matematyki. Moje stanowisko jest takie: dobra znajomość matematyki będzie pomocna, ale jej brak nie powinien przeszkadzać w lekturze większej części tej książki. Niektóre fragmenty mogą wydać się nieprzyjazne bez pogłębionej znajomości matematyki; chodzi konkretnie o ostatnie rozdziały (14 i 15) poświęcone kryptografii kwantowej i kryptografii następnej generacji. Nie ma jednak rzeczy niemożliwych i zawsze można przejść przez te rozdziały dzięki sile woli, googlując informacje o mnożeniu macierzy oraz innych zagadnieniach, których można nie znać. Jeśli zdecydujecie się je pominąć, upewnijcie się, że nie pominiecie rozdziału 16, ponieważ jest on wisienką na torcie.

JAK UPORZĄDKOWANA JEST TA KSIĄŻKA: MAPA DROGOWA

Książka ta jest podzielona na dwie części. Pierwsza z nich powinna zostać przeczytana od początku do końca. Obejmuje ona większość składników kryptografii: rzeczy, których koniec końców będziemy używać jak klocków Lego, by zbudować bardziej złożone systemy i protokoły.

■ Rozdział 1 stanowi wprowadzenie do prawdziwego świata kryptografii i daje nam pojęcie, czego będziemy się uczyć.

■ Rozdział 2 omawia funkcje skrótu, fundamentalny dla kryptografii algorytm wykorzystywany do tworzenia unikatowych identyfikatorów na podstawie ciągu bajtów.

■ Rozdział 3 omawia uwierzytelnianie danych i to, w jaki sposób możemy upewnić się, że nikt nie zmodyfikował naszych wiadomości.

■ Rozdział 4 omawia szyfrowanie pozwalające dwojgu uczestników ukryć swoją łączność przed obserwatorami.

■ Rozdział 5 stanowi wprowadzenie do wymiany kluczy pozwalającej na wynegocjowanie z kimś wspólnego sekretu w interaktywny sposób.

■ Rozdział 6 opisuje szyfrowanie asymetryczne, pozwalające wielu osobom na zaszyfrowanie wiadomości kierowanej do jednej osoby.

■ Rozdział 7 poświęcony jest podpisom – kryptograficznym odpowiednikom tradycyjnych podpisów wykorzystujących papier i pióro.

■ Rozdział 8 omawia kwestię losowości, a także sposoby na zarządzanie naszymi sekretami.

Druga część tej książki poświęcona jest systemom zbudowanym z poniższych składników.

■ Rozdział 9 uczy, w jaki sposób szyfrowanie i uwierzytelnianie wykorzystywane są do zabezpieczania połączeń pomiędzy maszynami (za sprawą protokołu SSL/TLS).

■ Rozdział 10 opisuje szyfrowanie od końca do końca (ang. end-to-end encryption), w którym tak naprawdę chodzi o to, w jaki sposób ludzie tacy jak my mogą sobie wzajemnie zaufać.

■ Rozdział 11 pokazuje, w jaki sposób maszyny uwierzytelniają ludzi i w jaki sposób ludzie mogą pomóc maszynom w ich wzajemnej synchronizacji.

■ Rozdział 12 wprowadza w powstający świat kryptowalut.

■ Rozdział 13 rzuca światło na kryptografię sprzętową, czyli urządzenia, które można wykorzystać w celu ochrony kluczy przed ekstrakcją.

Są również dwa rozdziały dodatkowe: rozdział 14, poświęcony kryptografii postkwantowej oraz rozdział 15, dotyczący kryptografii następnej generacji. Te dwa obszary zaczynają torować sobie drogę do produktów i firm, czy to dlatego, że stają się coraz istotniejsze, czy dlatego, że stają się coraz praktyczniejsze i wydajniejsze. Choć nie będę was osądzać, jeśli pominiecie te dwa rozdziały, musicie przeczytać rozdział 16 (ostatnie słowa), nim odłożycie tę książkę na półkę. Rozdział 16 podsumowuje różne wyzwania i różne lekcje, o których każda osoba zajmująca się kryptografią od strony praktycznej (czyli również my, gdy skończymy już tę książkę), musi stale pamiętać. Jak ujął to wujek Ben znany z przygód Spider-Mana: „Z wielką mocą wiąże się wielka odpowiedzialność”.

Kilka słów o kodzie

Książka ta zawiera wiele przykładów kodu źródłowego zarówno w postaci ponumerowanych listingów, jak i znajdujących się w jednym wierszu ze zwykłym tekstem. W obu wypadkach kod źródłowy jest sformatowany krojem o stałej szerokości, takim jak ten, aby odróżnić go od zwykłego tekstu. Czasami kod jest również pogrubiony, aby wyróżnić ten, który zmienił się w stosunku do poprzednich kroków w rozdziale, np. gdy nowa funkcja zostaje dodana do istniejącej linii kodu. W wielu wypadkach oryginalny kod źródłowy został przeformatowany; dodaliśmy podziały na wiersze i przerobiliśmy wcięcia, aby dostosować je do miejsca dostępnego na stronie książki. W rzadkich wypadkach nawet to nie wystarczyło i na listingach pojawiły się znaczniki kontynuacji wiersza (i_004). Dodatkowo, gdy kod źródłowy jest opisany w tekście, zamieszczone w nim komentarze często były usuwane z listingów. Adnotacje do kodu towarzyszą wielu listingom i wyróżniają ważne zagadnienia.

o autorze

DAVID WONG pracuje na stanowisku starszego inżyniera do spraw kryptografii w O(1) Labs, gdzie zajmuje się kryptowalutą Mina. Wcześniej pracował w Novi (Facebook) nad kryptowalutą Diem (formalnie znaną jako Libra), a jeszcze wcześniej jako konsultant do spraw bezpieczeństwa w Cryptography Services (NCC Group). David jest również autorem książki Real-World Cryptography.

W trakcie swojej kariery, David brał udział w kilku finansowanych ze środków publicznych audytach oprogramowania open source, na przykład OpenSSL i Let’s Encrypt. Występował na różnych konferencjach, włączając w to Black Hat i DEF CON, a także prowadził mający wiele edycji kurs kryptografii w ramach konferencji Black Hat. Brał udział w pracach na normami takimi jak TLS 1.3 oraz Noise Protocol Framework. Udało mu się znaleźć luki w wielu systemach, włączając w to CVE-2016-3959 w bibliotece standardowej Golang, CVE-2018-12404, CVE-2018-19608, CVE-2018-16868, CVE-2018-16869 oraz CVE-2018-16870 w różnych bibliotekach TLS.

Jest autorem m.in. protokołu Disco (www.discocrypto.com i www.embeddeddisco.com) oraz Decentralized Application Security Project przeznaczonego dla inteligentnych kontraktów (www.dasp.co). Jego badania obejmują ataki typu cache na RSA (http://cat.eyalro.net/), protokół oparty na QUIC (https://eprint.iacr.org/2019/028), ataki czasowe na ECDSA (https://eprint.iacr.org/2015/839) czy backdoory w protokole Diffiego-Hellmana (https://eprint.iacr.org/2016/644). Obecnie można go zobaczyć i zapoznać się z jego dokonaniami na jego blogu znajdującym się pod adresem www.cryptologie.net.

Część I

Prymitywy. Składniki kryptografii

Witajcie w prawdziwym świecie kryptografii! Książka, którą trzymacie w dłoniach (o ile jest to jej wersja drukowana), podzielona została na dwie równe części liczące po 8 rozdziałów. Przechodząc przez nie wszystkie, nauczycie się (niemal) wszystkiego, czego można się nauczyć o prawdziwym świecie kryptografii – tym, w którym się teraz znajdujemy.

Zauważmy, że pierwsza część książki została napisana tak, by była czytana po kolei. Każdy rozdział powinien nam jednak powiedzieć, jakie są wstępne warunki jego lektury, tak więc nie traktujmy tego ograniczenia zbyt ściśle. Pierwsze osiem rozdziałów przeprowadzi was przez podstawy – elementy składowe kryptografii. Każdy rozdział wprowadza nowy składnik i omawia to, co ten składnik robi, jak działa i w jaki sposób można go użyć razem z innymi elementami. W tej pierwszej części chodzi o to, by uzyskać dobry wgląd w zagadnienia kryptograficzne i ich abstrakcyjną perspektywę, nim zaczniemy z nich korzystać w drugiej części tej książki.

Powodzenia!

1

Wprowadzenie

Ten rozdział obejmuje następujące zagadnienia:

■ o co chodzi w kryptografii;

■ czym różni się kryptografia teoretyczna od prawdziwego świata kryptografii;

■ czego nauczymy się w trakcie tej naszej przygody.

Witajcie na pokładzie i usiądźcie wygodnie! Za moment wkroczycie w świat tajemnic i dziwów – świat kryptografii. Kryptografia to starożytna dyscyplina zabezpieczania zdarzeń przed złośliwymi postaciami. Książka ta zawiera zaklęcia, których potrzebujemy, by obronić się przed złośliwcami. Wielu próbowało opanować to rzemiosło, ale tylko nieliczni sprostali wyzwaniom stojącym na drodze do doskonałości. Fascynujące przygody czekają!

W książce tej ujawnimy, w jaki sposób algorytmy kryptograficzne mogą zabezpieczyć nasze listy, zidentyfikować naszych sojuszników i ochronić skarby przed naszymi wrogami. Żegluga przez morze kryptografii nie będzie najbardziej gładką z podróży, jako że kryptografia stanowi fundament wszelkich form bezpieczeństwa i prywatności w naszym świecie – najdrobniejszy błąd może okazać się śmiertelny.

UWAGA! Jeśli się zgubimy, pamiętajmy, by iść naprzód. Koniec końców wszystko nabierze sensu.

1.1. W kryptografii chodzi o zabezpieczenie protokołów

Nasza podróż zaczyna się od wprowadzenia do kryptografii – nauki, której celem jest ochrona protokołów przed sabotażystami. Po pierwsze jednak, czym jest protokół? W prostych słowach: jest to lista kroków, które jakaś osoba (lub większa liczba osób) musi pokonać, by coś osiągnąć. Wyobraźmy sobie na przykład, że chcemy na kilka godzin pozostawić nasz magiczny miecz bez opieki, aby się zdrzemnąć. Jeden umożliwiający to protokół mógłby wyglądać następująco.

1 Złóż broń na ziemi.

2 Zdrzemnij się pod drzewem.

3 Podnieś broń z ziemi.

Oczywiście nie jest to jakiś znakomity protokół i każdy może ukraść nasz miecz, gdy będziemy drzemać. Tak więc w kryptografii chodzi o uwzględnienie przeciwników, którzy gotowi są nas wykorzystać.

W czasach starożytnych, gdy władcy i generałowie zajęci byli wzajemnymi zdradami i planowaniem przewrotów, jednym z największych problemów było odnalezienie sposobu na podzielenie się tajnymi informacjami z godnymi zaufania osobami. Stąd narodziła się idea kryptografii. Konieczne były setki lat i ogrom wytężonej pracy, nim kryptografia stała się poważną dyscypliną, jaką jest dzisiaj. Obecnie stosuje się ją na całym świecie, by zapewnić najbardziej podstawowe usługi w obliczu naszego chaotycznego i nieprzyjaznego świata.

Opowieść zawarta w niniejszej książce dotyczy praktykowania kryptografii. Zabiera nas ona na wyprawę przez świat przetwarzania komputerowego chroniącego protokoły kryptograficzne używane dzisiaj. Pokazuje nam również, z jakich części są zbudowane i w jaki sposób są one ze sobą spasowane. Choć typowa książka poświęcona kryptografii zaczyna się zwykle od jej odkrycia i prowadzi nas przez jej historię, moim zdaniem nie ma większego sensu, bym zaczynał w podobny sposób. Chcę wam opowiedzieć o rzeczach praktycznych. Chcę opowiedzieć wam o tym, co widziałem na własne oczy, dokonując inspekcji aplikacji kryptograficznych jako konsultant pracujący dla wielkich przedsiębiorstw, a także o tych zagadnieniach kryptograficznych, które przydały mi się, gdy pracowałem na tym polu jako inżynier.

Nie będzie (no, prawie) żadnych strasznych równań matematycznych. Celem tej książki jest demistyfikacja kryptografii, przegląd tego, co obecnie uważane jest za użyteczne, i wyrobienie intuicji dotyczącej tego, jak zbudowane są otaczające nas rzeczy. Książka ta powstała z myślą o osobach ciekawych świata, zainteresowanych inżynierach, żądnych przygód programistach i dociekliwych badaczach. Rozdział 1 – ten rozdział – zapoczątkowuje wyprawę przez świat kryptografii. Odkryjemy różne typy kryptografii i ustalimy, które z nich mają dla nas znaczenie i w jaki sposób świat zgodził się co do tego, że to ich należy używać.

1.2. Kryptografia symetryczna. Czym jest szyfrowanie symetryczne?

Jednym z fundamentalnych zagadnień kryptografii jest szyfrowanie symetryczne. Jest ono wykorzystywane w większości algorytmów kryptograficznych w tej książce, więc musi być to kwestia niezwykłej wagi. Wprowadzam w tym miejscu to nowe zagadnienie za pośrednictwem naszego pierwszego protokołu. Wyobraźmy sobie, że królowa Alicja musi wysłać list do lorda Boba, który mieszka kilka zamków dalej. Królowa prosi swojego oddanego posłańca, by dosiadł wiernego wierzchowca i przedarł się przez niebezpieczne ziemie, aby dostarczyć cenną wiadomość lordowi Bobowi. Jest jednak podejrzliwa: choć jej lojalny posłaniec służy jej od wielu lat, chciałaby, by w trakcie swej wędrówki wiadomość pozostała tajna dla wszystkich osób postronnych, w tym samego posłańca! Jak widać, list najprawdopodobniej zawiera jakieś kontrowersyjne plotki na temat królestw leżących po drodze.

Tym, czego potrzeba królowej Alicji, jest protokół imitujący bezpośrednie przekazanie wiadomości samemu lordowi Bobowi bez żadnych pośredników. W praktyce jest to problem niemal niemożliwy do rozwiązania, chyba że do równania wprowadzimy kryptografię (lub teleportację). Tak właśnie postąpiono wieki temu, wynajdując nowy typ algorytmu kryptograficznego zwany symetrycznym algorytmem szyfrującym (znanym również jako szyfr).

UWAGA! Nawiasem mówiąc, typ algorytmu kryptograficznego często nazywany jest prymitywem. O prymitywie możemy pomyśleć jako o najmniejszej użytecznej konstrukcji, o jakiej możemy mówić w kryptografii. Wraz z innymi prymitywami jest on często wykorzystywany do zbudowania protokołu. Jest to tylko pewne słowo i nie ma jakiejś szczególnej wagi, ale na tyle często pojawia się w literaturze przedmiotu, że warto o nim wiedzieć.

Zobaczmy, jak możemy wykorzystać prymityw szyfrujący, by ukryć wiadomość królowej Alicji przed posłańcem. Wyobraźmy sobie, że prymityw jest czarną skrzynką (tak że nie możemy zobaczyć, co jest w jej środku ani jaka jest jej wewnętrzna zasada działania) mającą dwie funkcje:

■ ZASZYFRUJ

■ ODSZYFRUJ

Pierwsza funkcja, ZASZYFRUJ, działa w taki sposób, że przyjmuje klucz tajny (zwykle bardzo dużą liczbę) oraz wiadomość. Następnie na wyjściu daje szereg liczb wyglądających na losowe, co można też określić mianem danych pełnych szumów. Wyjście to nazywać będziemy zaszyfrowaną wiadomością. Ilustruje to rysunek 1.1.

Rysunek 1.1. Funkcja ZASZYFRUJ przyjmuje wiadomość oraz klucz tajny, a na wyjściu daje zaszyfrowaną wiadomość – długi szereg liczb wyglądających jak losowy szum

Druga funkcja, ODSZYFRUJ, jest odwrotnością pierwszej. Przyjmuje ona ten sam klucz tajny oraz „losowe” dane wyjściowe pierwszej funkcji (zaszyfrowaną wiadomość), a następnie odnajduje pierwotną wiadomość. Ilustruje to rysunek 1.2.

Rysunek 1.2. Funkcja ODSZYFRUJ przyjmuje zaszyfrowaną wiadomość i klucz tajny, a zwraca pierwotną wiadomość

Aby skorzystać z tego nowego prymitywu, królowa Alicja i lord Bob najpierw muszą się spotkać w prawdziwym życiu i ustalić, z jakiego klucza tajnego będą korzystać. Następnie królowa Alicja może wykorzystać funkcję ZASZYFRUJ, aby ochronić wiadomość za pomocą klucza tajnego. Następnie przekazuje zaszyfrowaną wiadomość posłańcowi, który ostatecznie dostarcza ją do lorda Boba. Ten zaś, korzystając z funkcji ODSZYFRUJ, zaszyfrowanej wiadomości i tego samego klucza tajnego, odzyskuje pierwotną wiadomość. Proces obrazuje Rysunek 1.3.

W trakcie tej wymiany posłaniec dysponował jedynie czymś, co wyglądało na coś przypadkowego i nie dawało żadnego istotnego wglądu w treść ukrytej wiadomości. W efekcie, z pomocą kryptografii, rozszerzyliśmy nasz niezabezpieczony protokół w taki sposób, że stał się bezpieczny. Dzięki nowemu protokołowi królowa Alicja może dostarczyć poufny list lordowi Bobowi i nikt (z wyjątkiem lorda Boba) nie będzie w stanie poznać jego treści.

Wykorzystanie klucza tajnego w celu przedstawienia czegoś jako szumu, sprawiając, że to coś staje się nieodróżnialne od czegoś losowego, stanowi powszechny sposób zabezpieczania protokołu w kryptografii. Więcej na ten temat dowiemy się w kolejnych rozdziałach, poznając kolejne algorytmy kryptograficzne.

Nawiasem mówiąc, szyfrowanie symetryczne jest częścią szerszej kategorii algorytmów kryptograficznych nazywanych kryptografią symetryczną lub kryptografią klucza symetrycznego. Jest to spowodowane tym, że ten sam klucz jest wykorzystywany do różnych funkcji wystawianych przez prymityw kryptograficzny. Jak zobaczymy później, niekiedy w grę wchodzi więcej niż jeden klucz.

Rysunek 1.3. (1) Alicja korzysta z funkcji ZASZYFRUJ wraz z kluczem tajnym, by przekształcić swoją wiadomość w szum. (2) Następnie przekazuje zaszyfrowaną wiadomość swojemu posłańcowi, który nie dowie się niczego o pierwotnej wiadomości. (3) Bob, odebrawszy zaszyfrowaną wiadomość, może odzyskać pierwotną treść, korzystając z funkcji ODSZYFRUJ i tego samego klucza tajnego, z którego skorzystała Alicja

1.3. Zasada Kerckhoffsa: tylko klucz pozostaje tajny

Zaprojektowanie algorytmu kryptograficznego (takiego jak nasz prymityw szyfrujący) jest łatwym zadaniem, ale zaprojektowanie bezpiecznego algorytmu kryptograficznego to nie zadanie dla osób o słabym sercu. Choć wzbraniamy się przed tworzeniem takich algorytmów w niniejszej książce, nauczymy się, jak rozpoznawać te dobre. Może to być trudne, ponieważ wybór jest tu większy, niż można by chcieć. Pewne wskazówki ukryte są w powtarzających się niepowodzeniach znanych z historii kryptografii, a także we wnioskach, jakie społeczność zdołała z nich wyciągnąć. Spoglądając w przeszłość, uchwycimy to, co sprawia, że algorytm kryptograficzny staje się takim, w którego bezpieczeństwo się ufa.

Minęły setki lat, w czasie których pochowano wiele królowych i wielu lordów. Papier nie jest już naszym głównym środkiem komunikacji – zastąpiły go lepsze i praktyczniejsze techniki. Dziś mamy dostęp do potężnych komputerów i sieci Internet. Jasne, że są one praktyczniejsze, ale też ich wykorzystanie znaczy, że nasz wcześniejszy złośliwy posłaniec stał się znacznie potężniejszy. Jest teraz wszędzie: ukryty w sieci Wi-Fi w kawiarence Starbucksa, w której zwykliśmy przesiadywać, w różnych serwerach składających się na Internet i przekazujących dalej nasze wiadomości, a nawet w maszynach, na których działają nasze algorytmy. Nasi wrogowie są teraz w stanie obserwować znacznie więcej wiadomości, jako że każde zapytanie przesłane przez nas do jakiejś witryny może przejść przez niewłaściwy kabel i zostać zmienione lub skopiowane w ciągu kilku nanosekund i nikt tego nawet nie zauważy.

Najnowsze czasy dają nam wiele przykładów algorytmów szyfrujących, które zawiodły – które zostały złamane przez tajne organizacje państwowe lub niezależnych badaczy i którym nie udało się ochronić wiadomości lub zrealizować innych związanych z nimi obietnic. Dało to wiele materiału do przemyśleń, dzięki czemu powoli udało nam się zrozumieć, na czym polega dobra kryptografia.

UWAGA! Algorytm kryptograficzny można uznać za złamany na wiele sposobów. W przypadku algorytmu szyfrującego można wyobrazić sobie kilka sposobów ataku na niego: klucz tajny może wpaść w ręce napastnika, wiadomość może zostać odszyfrowana bez pomocy klucza, pewne informacje dotyczące wiadomości mogą zostać ujawnione jedynie dzięki przyjrzeniu się zaszyfrowanej wiadomości i tak dalej. O wszystkim, co w jakiś sposób osłabia czynione przez nas założenia dotyczące algorytmu, można powiedzieć, że go osłabia.

Silny pomysł wyłonił się z długiego procesu prób i błędów, przez który przeszła kryptografia: aby zyskać przeświadczenie, że obietnice związane z bezpieczeństwem dawane przez jakiś prymityw kryptograficzny, musi on zostać w jawny sposób przeanalizowany przez ekspertów. W przeciwnym razie polegamy na bezpieczeństwie wynikającym ze skrytości, co historycznie rzecz ujmując się nie sprawdziło. To dlatego kryptografowie (osoby odpowiedzialne za tworzenie) korzystają zwykle z pomocy kryptoanalityków (osób odpowiedzialnych za łamanie), aby przeanalizować bezpieczeństwo jakiejś konstrukcji (choć kryptografowie sami często są jednocześnie kryptoanalitykami i odwrotnie).

Weźmy na przykład algorytm szyfrujący AES (ang. Advanced Encryption Standard, czyli Zaawansowana Norma Szyfrowania). AES jest rezultatem międzynarodowego konkursu zorganizowanego przez NIST (ang. National Institute of Standards and Technology, czyli Narodowy Instytut Norm i Techniki)

UWAGA! NIST to amerykańska agencja, której rolą jest określanie norm i opracowywanie wytycznych na potrzeby działalności rządu, jak również innych publicznych lub prywatnych organizacji. Odpowiada ona za normalizację wielu szeroko wykorzystywanych prymitywów kryptograficznych, tak jak w wypadku AES.

Konkurs dotyczący AES trwał kilka lat, w trakcie których wielu kryptoanalityków z całego świata zgłosiło się na ochotnika, by spróbować swoich sił w złamaniu różnych kandydackich konstrukcji. Po kilku latach, gdy dzięki temu procesowi udało się już osiągnąć wystarczający poziom zaufania, jeden ze współzawodniczących algorytmów szyfrowania został nominowany do roli samej normy AES. Obecnie większość osób jest przekonana, że AES to godny zaufania algorytm szyfrujący. Jest on szeroko wykorzystywany do zaszyfrowania niemal wszystkiego, co można zaszyfrować. Na przykład korzystamy z niego każdego dnia, przeglądając sieciowe zasoby.

Pomysł opracowania norm kryptograficznych w sposób otwarty powiązany jest z koncepcją często nazywaną zasadą Kerckhoffsa, którą wyrazić można w następujący sposób: głupotą byłoby poleganie na tym, że nasi wrogowie nie odkryją, z jakich algorytmów korzystamy, ponieważ najprawdopodobniej uda im się to ustalić. Zamiast tego bądźmy w tej kwestii otwarci.

Jeśli wrogowie królowej Alicji i lorda Boba wiedzą dokładnie, w jaki sposób tych dwoje zaszyfrowało swoje wiadomości, jak to możliwe, że ich algorytm szyfrujący jest bezpieczny? Odpowiedzią jest klucz tajny! To nie tajność samego algorytmu, ale tajność klucza sprawia, że protokół jest bezpieczny. Jest to wątek, który jeszcze nieraz napotkamy w niniejszej książce: wszystkie algorytmy kryptograficzne, które poznamy i które wykorzystywane są w prawdziwym świecie, można swobodnie badać i wykorzystywać. Jedynie klucze tajne wykorzystywane w charakterze wejścia tych algorytmów trzymane są w sekrecie. Ars ipsi secreta magistro (sztuka trzymana w sekrecie nawet przed mistrzem), jak powiedział Jan Bob du Carlet w 1644 roku. W kolejnym podrozdziale omówimy zupełnie inny rodzaj prymitywu kryptograficznego. Na razie spójrzmy na Rysunek 1.4, by ustrukturyzować to, czego dowiedzieliśmy się do tej pory.

Rysunek 1.4. Algorytmy kryptograficzne, które poznaliśmy do tej pory. AES stanowi przykład algorytmu szyfrowania symetrycznego i jest prymitywem kryptograficznym należącym do szerszej klasy symetrycznych algorytmów kryptograficznych

1.4. Kryptografia asymetryczna. Dwa klucze są lepsze niż jeden

W naszych rozważaniach na temat szyfrowania symetrycznego powiedzieliśmy, że królowa Alicja i lord Bob najpierw spotkali się, by ustalić klucz symetryczny. Jest to prawdopodobny scenariusz i wiele protokołów rzeczywiście działa w ten sposób. Niemniej jednak szybko staje się to mniej praktyczne rozwiązanie w wypadku protokołów z wieloma uczestnikami: czy nasza przeglądarka internetowa musi spotykać się z Google'em, Facebookiem, Amazonem i miliardami innych stron internetowych, nim bezpiecznie się z nimi połączy?

Problem ten, często nazywany problemem dystrybucji klucza, pozostawał trudny do rozwiązania przez całkiem długi czas, co najmniej do momentu odkrycia w późnych latach 70. XX wieku innej dużej, użytecznej kategorii algorytmów kryptograficznych zwanych kryptografią asymetryczną lub kryptografią klucza publicznego. Ogólnie rzecz biorąc, kryptografia asymetryczna wykorzystuje różne klucze pełniące różne funkcje (w przeciwieństwie do pojedynczego klucza wykorzystywanego w kryptografii symetrycznej) lub zapewnia różne punkty widzenia różnym uczestnikom. By pokazać, co to znaczy i w jaki sposób kryptografia klucza publicznego pomaga wytworzyć zaufanie między różnymi osobami, wprowadzę w tym podrozdziale kilka prymitywów asymetrycznych. Będzie to jedynie przelotny rzut oka na to, czego nauczymy się dzięki tej książce, gdy w kolejnych rozdziałach bardziej szczegółowo omawiać będę każdy z tych prymitywów kryptograficznych.

1.4.1. O wymienianiu się kluczami albo jak uzyskać dostęp do wspólnego sekretu

Pierwszym prymitywem kryptografii asymetrycznej, któremu się przyjrzymy, jest wymiana kluczy. Pierwszym publicznym algorytmem klucza, jaki został odkryty i opublikowany, był algorytm wymiany klucza nazwany na cześć swoich autorów algorytmem Diffiego-Hellmana (w skrócie DH). Głównym celem algorytmu wymiany klucza DH jest ustanowienie wspólnej tajemnicy między dwiema stronami. Ten wspólny sekret może następnie zostać wykorzystany do różnych celów (np. jako klucz dla jakiegoś prymitywu szyfrowania symetrycznego).

W rozdziale 5 wyjaśnię, jak działa algorytm Diffiego-Hellmana, ale dla potrzeb niniejszego wprowadzenia posłużmy się prostą analogią, by zrozumieć, co daje wymiana klucza. Tak jak w wypadku wielu algorytmów w kryptografii, wymiana klucza musi rozpocząć się od użycia przez uczestników wspólnego zestawu parametrów. Dla potrzeb naszej analogii ustalmy, że królowa Alicja i lord Bob stwierdzili, iż posłużą się kwadratem (■). Ich kolejny krok polegać będzie na wybraniu swoich własnych, przypadkowych kształtów. Każde z nich udaje się do swojego własnego sekretnego miejsca położonego z dala od wścibskich oczu, gdzie królowa Alicja wybiera trójkąt (▲), a lord Bob gwiazdkę (★). Wybrane przez nich obiekty za wszelką cenę muszą pozostać tajemnicą! Obiekty te reprezentują ich klucze prywatne (zob. rysunek 1.5).

Rysunek 1.5. Pierwszy krok wymiany kluczy DH (Diffiego-Hellmana) polega na wygenerowaniu przez obu uczestników kluczy prywatnych. W naszej analogii królowa Alicja na swój klucz prywatny wybiera trójkąt, podczas gdy lord Bob decyduje się na gwiazdkę

Gdy wybiorą już swoje klucze prywatne, każde z nich z osobna łączy swój sekretny kształt z kształtem, na użycie którego zgodzili się na samym początku (kwadratem). Połączenia te skutkują powstaniem unikatowych kształtów reprezentujących ich klucze publiczne. Królowa Alicja i lord Bob mogą teraz wymienić między sobą swoje klucze publiczne (stąd właśnie określenie wymiana kluczy), ponieważ ich klucze publiczne uważane są za informację publiczną. Przedstawia to rysunek 1.6.

Rysunek 1.6. Drugi krok wymiany kluczy DH, w którym oboje uczestnicy wymieniają ze sobą swoje klucze publiczne. Uczestnicy wyprowadzają je przez połączenie swoich kluczy prywatnych ze wspólnym kształtem

Zaczynamy teraz dostrzegać, dlaczego algorytm ten jest nazywany algorytmem klucza publicznego. Jest tak, ponieważ wymaga on pary złożonej z klucza prywatnego i klucza publicznego. Ostatni krok algorytmu wymiany kluczy DH jest dość prosty: królowa Alicja bierze klucz publiczny lorda Boba i łączy go ze swoim kluczem prywatnym. Lord Bob robi to samo z kluczem publicznym królowej Alicji, łącząc go ze swoim własnym kluczem prywatnym. Rezultat powinien być teraz taki sam po każdej ze stron; w naszym przykładzie będzie to kształt łączący gwiazdkę, kwadrat i trójkąt (zob. rysunek 1.7).

Rysunek 1.7. Ostatni krok wymiany kluczy DH, w którym oboje uczestnicy tworzą ten sam wspólny sekret. By tego dokonać, królowa Alicja łączy swój klucz prywatny z kluczem publicznym lorda Boba, a lord Bob łączy swój klucz prywatny z kluczem publicznym królowej Alicji. Wspólnej tajnej informacji nie można uzyskać jedynie przez obserwację kluczy publicznych

Wykorzystanie tego wspólnego sekretu zależy teraz od uczestników protokołu. W tej książce poznamy kilka jego przykładów, ale najbardziej oczywisty scenariusz polega na wykorzystaniu go w algorytmie, który wymaga wspólnego sekretu. Królowa Alicja i lord Bob mogliby teraz np. wykorzystać ten wspólny sekret w charakterze klucza służącego do zaszyfrowania kolejnych wiadomości za pomocą prymitywu szyfrowania symetrycznego. Podsumujmy.

1 Alicja i Bob wymieniają swoje klucze publiczne, które maskują ich odpowiednie klucze prywatne.

2 Mając klucz publiczny drugiego uczestnika i swój klucz prywatny, mogą wytworzyć wspólny sekret.

3 Przeciwnik, który obserwuje wymianę kluczy publicznych, nie ma wystarczających informacji, aby wytworzyć wspólny sekret.

UWAGA! W naszym przykładzie ostatni punkt można z łatwością pominąć. Tak naprawdę nie wiedząc nic o żadnym kluczu prywatnym, możemy połączyć ze sobą klucze publiczne i uzyskać wspólny sekret. Na szczęście jest to jedynie ograniczenie naszej analogii, które działa wystarczająco dobrze, byśmy mogli zrozumieć, na czym polega wymiana kluczy.

W praktyce wymiana kluczy DH jest mało bezpieczna. Czy możecie poświęcić kilka sekund i spróbować zrozumieć dlaczego?

Ponieważ królowa Alicja akceptuje dowolny dostarczony jej klucz publiczny jako klucz publiczny lorda Boba, mógłbym przechwycić wymianę i zastąpić go moim własnym kluczem, co pozwoliłoby mi wcielić się w lorda Boba wobec królowej Alicji (to samo można też zrobić lordowi Bobowi). Mówimy więc, że pośrednik (ang. man-in-the-middle, w skrócie MITM) może z powodzeniem zaatakować protokół. Jak można to naprawić? W dalszych rozdziałach zobaczymy, że musimy albo rozszerzyć ten protokół o jeszcze jeden prymityw kryptograficzny, albo z góry musimy być świadomi tego, jaki jest klucz publiczny lorda Boba. Ale czy w takim wypadku nie wracamy do początku?

Poprzednio królowa Alicja i lord Bob musieli znać wspólny sekret; teraz królowa Alicja i lord Bob muszą znać swoje indywidualne klucze publiczne. W jaki sposób je poznają? Czy to znowu problem jajka i kury? Cóż, poniekąd tak. Jak zobaczymy, w praktyce kryptografia klucza publicznego nie rozwiązuje problemu zaufania, ale upraszcza jego ustanowienie (szczególnie gdy liczba uczestników jest duża).

Zatrzymajmy się w tym miejscu i przejdźmy do następnego punktu, jako że o wymianach kluczy dowiemy się więcej w rozdziale 5. Wciąż pozostało nam do odkrycia jeszcze kilka prymitywów kryptografii asymetrycznej (zob. rysunek 1.8), które pozwolą nam dokończyć naszą podróż po prawdziwym świecie kryptografii.

Rysunek 1.8. Algorytmy kryptograficzne, które poznaliśmy do tej pory. Dwie duże klasy algorytmów kryptograficznych to kryptografia symetryczna (z szyfrowaniem symetrycznym) i kryptografia asymetryczna (z wymianami kluczy)

1.4.2. Szyfrowanie asymetryczne, nie mylić z symetrycznym

Po wynalezieniu algorytmu wymiany klucza DH szybko wynaleziono algorytm RSA, nazwany w ten sposób od nazwisk Rona Rivesta, Adiego Shamira i Leonarda Adlemana. RSA zawiera dwa różne prymitywy: algorytm szyfrowania oparty na kluczu publicznym (czy też szyfrowaniu asymetrycznym) oraz (cyfrowy) schemat podpisu. Oba prymitywy są częścią większej klasy algorytmów kryptograficznych nazywanych kryptografią asymetryczną. W tym punkcie wyjaśnimy, co robią te prymitywy i w jaki sposób można z nich zrobić użytek.

Pierwszy z nich, szyfrowanie asymetryczne, ma podobny cel, co omówiony już algorytm szyfrowania symetrycznego: pozwala na zaszyfrowanie wiadomości w celu uzyskania poufności. Szyfrowanie asymetryczne działa jednak w inny sposób niż szyfrowanie symetryczne, gdzie dwoje uczestników szyfrowało i deszyfrowało wiadomości za pomocą tego samego klucza symetrycznego. Jest tak, ponieważ:

■ wykorzystuje ono dwa różne klucze: klucz publiczny i klucz prywatny;

■ pozwala uzyskać perspektywę asymetryczną: każdy może szyfrować wiadomości przy użyciu klucza publicznego, ale tylko właściciel klucza prywatnego jest w stanie je odszyfrować.

Posłużmy się teraz prostą analogią, by wyjaśnić, jak można wykorzystać szyfrowanie asymetryczne. Raz jeszcze rozpoczniemy od znanej nam już królowej Alicji, która posiada klucz prywatny (a także powiązany z nim klucz publiczny). Zobrazujmy jej klucz publiczny jako otwartą skrzynię, którą publicznie oddaje do użytku każdej zainteresowanej osobie (zob. rysunek 1.9).

Rysunek 1.9. Aby wykorzystać szyfrowanie asymetryczne, królowa Alicja musi najpierw opublikować swój klucz publiczny (tu przedstawiony jako otwarta skrzynia). Każdy może teraz użyć klucza publicznego w celu zaszyfrowania skierowanej do niej wiadomości. Ona natomiast powinna być w stanie ją odszyfrować przy wykorzystaniu powiązanego klucza prywatnego

Teraz ty, ja i każdy, kto tylko ma na to ochotę, może zaszyfrować wiadomość do Alicji za pomocą jej klucza publicznego. W naszej analogii możemy sobie wyobrazić, że wkładamy wiadomość do otwartej skrzyni i ją zamykamy. Gdy skrzynia zostanie zamknięta, nikt oprócz królowej Alicji nie będzie w stanie jej otworzyć. Skrzynia skutecznie ochroni tajny charakter wiadomości przed obserwatorami. Zamknięta skrzynia (czy też zaszyfrowana treść) może następnie zostać przesłana do królowej Alicji, a ona, korzystając ze swojego klucza prywatnego (pamiętajmy – znanego tylko jej!), będzie mogła ją odszyfrować (zob. rysunek 1.10).

Rysunek 1.10. Szyfrowanie asymetryczne: (1) każdy może użyć klucza publicznego królowej Alicji do zaszyfrowania kierowanych do niej wiadomości. (2) Po ich odebraniu (3) może ona odszyfrować ich treść przy wykorzystaniu powiązanego klucza prywatnego. Nikt nie jest w stanie obserwować wiadomości kierowanych do królowej Alicji, gdy te znajdują się w drodze

Podsumujmy za pomocą rysunku 1.11 kryptograficzne prymitywy, które poznaliśmy do tej pory. Brakuje nam jeszcze tylko jednego, byśmy mogli ukończyć naszą wycieczkę po prawdziwym świecie kryptografii!

Rysunek 1.11. Algorytmy kryptograficzne, które jak dotąd poznaliśmy: dwie duże klasy algorytmów kryptograficznych to kryptografia symetryczna (szyfrowanie symetryczne) i kryptografia asymetryczna (wymiany kluczy i szyfrowanie asymetryczne)

1.4.3. Podpisy cyfrowe, zupełnie jak te tradycyjne

Widzieliśmy, że RSA daje algorytm szyfrowania asymetrycznego, ale – jak wspomnieliśmy wcześniej – daje też algorytm podpisu elektronicznego. Wynalezienie tego prymitywu kryptograficznego podpisu cyfrowego było niezmiernie pomocne w ustanowieniu zaufania między Alicjami i Bobami w naszym świecie. Działa to podobnie do tradycyjnych podpisów; no wiecie, tych, które trzeba złożyć na umowie np. wynajmując mieszkanie.

Zapytać można: „A co, jeśli podrobią mój podpis?”. I rzeczywiście, tradycyjne podpisy w prawdziwym świecie nie dają zbyt wiele bezpieczeństwa. Z drugiej strony, podpisów kryptograficznych można używać w taki sam sposób, dają jednak certyfikat kryptograficzny powiązany z naszym nazwiskiem. Nasz podpis kryptograficzny jest niepodrabialny i może łatwo zostać zweryfikowany przez innych. W porównaniu do archaicznych podpisów, jakie składa się na czekach, jest on bardzo użyteczny.

Na rysunku 1.12 możemy wyobrazić sobie protokół, w ramach którego królowa Alicja chce pokazać lordowi Davidowi, że ufa lordowi Bobowi. Jest to typowy przykład tego, jak ustanowić zaufanie w sytuacji, w której bierze udział wielu uczestników, i w jaki sposób może w tym pomóc kryptografia asymetryczna. Podpisując kartkę papieru, na której napisane jest „Ja, królowa Alicja, ufam lordowi Bobowi”, królowa Alicja zajmuje określone stanowisko i powiadamia lorda Davida, że lordowi Bobowi można ufać. Jeśli lord David ufa już królowej Alicji oraz algorytmowi jej podpisu, wtedy będzie mógł w odpowiedzi zaufać lordowi Bobowi.

Rysunek 1.12. Lord David ufa już królowej Alicji. Skoro królowa Alicja ufa lordowi Bobowi, czy lord David może również bezpiecznie zaufać lordowi Bobowi?

Bardziej szczegółowo: królowa Alicja może użyć schematu podpisu RSA oraz swojego klucza prywatnego do podpisania wiadomości: „Ja, królowa Alicja, ufam lordowi Bobowi”. Generuje to podpis, który powinien wyglądać jak losowy szum (zob. rysunek 1.13).

Rysunek 1.13. Aby podpisać wiadomość, królowa Alicja korzysta ze swojego klucza prywatnego i generuje podpis

Następnie każdy może zweryfikować podpis przez połączenie:

■ klucza publicznego Alicji,

■ podpisanej wiadomości oraz

■ podpisu.

W rezultacie otrzymujemy albo prawdę (podpis jest prawidłowy), albo fałsz (podpis jest nieprawidłowy), tak jak pokazuje to rysunek 1.14.

Rysunek 1.14. Aby zweryfikować podpis królowej Alicji, potrzebne są też jej klucz publiczny oraz podpisana wiadomość

Poznaliśmy już trzy różne prymitywy asymetryczne:

■ wymianę kluczy opartą na algorytmie Diffiego-Hellmana,

■ szyfrowanie asymetryczne,

■ podpisy cyfrowe oparte na RSA.

W wypadku kryptografii asymetrycznej te trzy algorytmy kryptograficzne są najszerzej znanymi i najpowszechniej wykorzystywanymi prymitywami. Może nie być całkowicie jasne, w jaki sposób pomagają rozwiązać problemy napotykane w prawdziwym świecie, ale nie martwcie się – są one wykorzystywane każdego dnia w wielu zastosowaniach w celu zabezpieczenia różnych rzeczy. Czas dokończyć nasz rysunek, nanosząc na niego wszystkie poznane przez nas do tej pory algorytmy kryptograficzne (zob. rysunek 1.15).

Rysunek 1.15. Poznane przez nas do tej pory algorytmy symetryczne i asymetryczne