251 116 7MB
Polish Pages 297 [326] Year 2007
Podziękowania W tym miejscu chciałbym podziękować osobom, bez których pomocy napisanie tej książki byłoby o wiele trudniejsze lub wręcz niemożliwe: Mojej żonie Kasi za wsparcie i cierpliwość. Moim rodzicom za nieustający doping. Wydawnictwu Helion za zaufanie i doskonałą prezentację książki. Redaktorowi Michałowi Mrowcowi za wyrozumiałość, zdolność
wypracowywania kompromisu i ponad pół roku dobrze układającej się współpracy. Firmie SISOFT za udostępnienie programu PGP Desktop. Grzegorzowi Surdyce za pomoc merytoryczną podczas prac nad rozdziałem
dotyczącym PGP Desktop. Wszystkim osobom, które poświęciły swój czas na czytanie i poprawianie całości lub fragmentów książki, a więc: Wojciechowi Pająkowi, Maciejowi Mutwilowi, Agacie Siurdzie, Dobromile Stano, Magdalenie Rucińskiej, Annie Idzikowskiej, Magdalenie Lemańskiej oraz Krzysztofowi Pałydze. Będę również wdzięczny Tobie, Drogi Czytelniku, za wszelkie konstruktywne uwagi dotyczące książki. Mam nadzieję, że okaże się ona dla Ciebie bogatym i ciekawym zarazem źródłem wiedzy. Życzę miłej lektury. Marcin Karbowski październik 2013 Kontakt mailowy z autorem: [email protected]
6
Podstawy kryptografii
Spis treści Kilka słów wstępu . ........................................................................ 11 Rozdział 1. Historia kryptografii . ...................................................................... 15 1.1. Prolog — Painvin ratuje Francję . ............................................................................ 15 1.2. Początek… ................................................................................................................ 19 1.2.1. Steganografia ................................................................................................. 19 1.2.2. Kryptografia ................................................................................................... 20 1.2.3. Narodziny kryptoanalizy . .............................................................................. 22 1.3. Rozwój kryptografii i kryptoanalizy . ....................................................................... 23 1.3.1. Szyfry homofoniczne ..................................................................................... 23 1.3.2. Szyfry polialfabetyczne . ................................................................................ 24 1.3.3. Szyfry digraficzne .......................................................................................... 29 1.3.4. Prawdziwy „szyfr nie do złamania” . ............................................................. 30 1.3.5. Kamienie milowe kryptografii . ..................................................................... 32 1.4. Kryptografia II wojny światowej . ............................................................................ 33 1.4.1. Enigma i Colossus .......................................................................................... 33 1.5. Era komputerów ....................................................................................................... 38 1.5.1. DES . ............................................................................................................... 39 1.5.2. Narodziny kryptografii asymetrycznej . ......................................................... 40 1.5.3. RSA ................................................................................................................ 41 1.5.4. PGP . ............................................................................................................... 42 1.5.5. Ujawniona tajemnica ...................................................................................... 43 1.5.6. Upowszechnienie kryptografii . ..................................................................... 44
Rozdział 2. Matematyczne podstawy kryptografii . ............................................ 47 2.1. Podstawowe pojęcia ................................................................................................. 48 2.1.1. Słownik tekstu jawnego . ............................................................................... 48 2.1.2. Przestrzeń tekstu ............................................................................................. 48 2.1.3. Iloczyn kartezjański ........................................................................................ 49 2.1.4. System kryptograficzny . ................................................................................ 50 2.1.5. Szyfrowanie monoalfabetyczne . .................................................................... 51 2.1.6. Funkcje jednokierunkowe . ............................................................................ 51 2.1.7. Arytmetyka modulo ....................................................................................... 52 2.1.8. Dwójkowy system liczbowy . ........................................................................ 53 2.1.9. Liczby pierwsze ............................................................................................. 54 2.1.10. Logarytmy .................................................................................................... 59 2.1.11. Grupy, pierścienie i ciała . ............................................................................ 60 2.1.12. Izomorfizmy ................................................................................................. 61
8
Podstawy kryptografii 2.2. Wzory w praktyce ..................................................................................................... 63 2.2.1. Kryptosystem RSA ......................................................................................... 63 2.2.2. Problem faktoryzacji dużych liczb . ............................................................... 65 2.2.3. Mocne liczby pierwsze ................................................................................... 67 2.2.4. Generowanie liczb pierwszych . ..................................................................... 67 2.2.5. Chińskie twierdzenie o resztach . ................................................................... 70 2.2.6. Logarytm dyskretny ....................................................................................... 70 2.2.7. XOR i AND ................................................................................................... 72 2.2.8. Testy zgodności .............................................................................................. 73 2.2.9. Złożoność algorytmów . ................................................................................. 82 2.2.10. Teoria informacji .......................................................................................... 83
Rozdział 3. Kryptografia w teorii . ..................................................................... 89 3.1. Ataki kryptoanalityczne i nie tylko . ......................................................................... 89 3.1.1. Metody kryptoanalityczne . ............................................................................ 89 3.1.2. Kryptoanaliza liniowa i różnicowa . ............................................................... 91 3.1.3. Inne rodzaje ataków ....................................................................................... 92 3.2. Rodzaje i tryby szyfrowania ..................................................................................... 98 3.2.1. Szyfry blokowe .............................................................................................. 98 3.2.2. Szyfry strumieniowe .................................................................................... 107 3.2.3. Szyfr blokowy czy strumieniowy? . ............................................................. 112 3.3. Protokoły kryptograficzne ...................................................................................... 113 3.3.1. Protokoły wymiany kluczy . ......................................................................... 113 3.3.2. Podpis cyfrowy ............................................................................................. 117 3.3.3. Dzielenie sekretów ....................................................................................... 120 3.3.4. Inne protokoły .............................................................................................. 123 3.4. Infrastruktura klucza publicznego . ......................................................................... 126 3.4.1. PKI w teorii… .............................................................................................. 127 3.4.2. …i w praktyce .............................................................................................. 127 3.5. Kryptografia alternatywna ...................................................................................... 130 3.5.1. Fizyka kwantowa w kryptografii . ................................................................ 130 3.5.2. Kryptografia DNA ....................................................................................... 137 3.5.3. Kryptografia wizualna . ................................................................................ 142 3.6. Współczesna steganografia ..................................................................................... 144 3.6.1. Znaki wodne ................................................................................................. 144 3.6.2. Oprogramowanie steganograficzne . ............................................................ 145
Rozdział 4. Kryptografia w praktyce . ............................................................. 147 4.1. Konstrukcja bezpiecznego systemu kryptograficznego . ........................................ 147 4.1.1. Wybór i implementacja kryptosystemu . ...................................................... 148 4.1.2. Bezpieczny system kryptograficzny . ........................................................... 149 4.1.3. Najsłabsze ogniwo ....................................................................................... 150 4.2. Zabezpieczanie połączeń internetowych . ............................................................... 154 4.2.1. Protokół TLS ................................................................................................ 154 4.2.2. Protokół SSH ................................................................................................ 162 4.3. Symantec Encryption Desktop . .............................................................................. 169 4.3.1. PGP Keys ..................................................................................................... 173 4.3.2. PGP Messaging ............................................................................................ 177 4.3.3. PGP Zip ........................................................................................................ 181 4.3.4. PGP Disk ...................................................................................................... 185 4.3.5. PGP Viewer .................................................................................................. 194 4.3.6. File Share Encryption . ................................................................................. 196 4.3.7. PGP Shredder ............................................................................................... 198 4.3.8. Web of Trust ................................................................................................ 199
Spis treści
9 4.4. GnuPG . ................................................................................................................... 201 4.4.1. Tworzenie certyfikatu . ................................................................................ 201 4.4.2. Obsługa certyfikatów . ................................................................................. 203 4.4.3. Szyfrowanie i podpisywanie . ...................................................................... 205 4.4.4. Obsługa serwerów ........................................................................................ 209 4.5. TrueCrypt ............................................................................................................... 210 4.5.1. Tworzenie szyfrowanych dysków i partycji . ............................................... 210 4.5.2. Obsługa dysków wirtualnych . ..................................................................... 213 4.5.3. Ukryte dyski ................................................................................................. 213 4.5.4. Pozostałe opcje i polecenia . ......................................................................... 215 4.6. Składanie i weryfikacja podpisów elektronicznych . .............................................. 218 4.6.1. Wymagania techniczne . .............................................................................. 218 4.6.2. Jak zdobyć certyfikat cyfrowy? . .................................................................. 219 4.6.3. O czym warto pamiętać? . ............................................................................ 221 4.6.4. Konfiguracja programu pocztowego . .......................................................... 222 4.6.5. Struktura certyfikatu ..................................................................................... 226 4.7. Kryptografia w PHP i MySQL . ............................................................................. 229 4.7.1. Funkcje szyfrujące w PHP . ......................................................................... 229 4.7.2. Szyfrowanie danych w MySQL . ................................................................. 234 4.7.3. Kolejne udoskonalenia . ............................................................................... 238
Podsumowanie . .............................................................................................. 241 Dodatek A Jednokierunkowe funkcje skrótu . ................................................. 243 A.1. MD5 . ...................................................................................................................... 243 A.1.1. Przekształcenia początkowe . ...................................................................... 243 A.1.2. Pętla główna MD5 ....................................................................................... 244 A.1.3. Obliczenia końcowe . .................................................................................. 246 A.2. SHA-1 . ................................................................................................................... 246 A.2.1. Przekształcenia początkowe . ...................................................................... 246 A.2.2. Pętla główna algorytmu SHA-1 . ................................................................. 247 A.2.3. Operacje w cyklu SHA-1 . ........................................................................... 247 A.2.4. Obliczenia końcowe . .................................................................................. 248 A.3. SHA-2 . ................................................................................................................... 249 A.3.1. Dodatkowe pojęcia ...................................................................................... 249 A.3.2. Przekształcenia początkowe . ...................................................................... 250 A.3.3. Operacje w cyklu SHA-2 . ........................................................................... 251 A.3.4. Dodatkowe różnice między algorytmami SHA-2 . ......................................... 253 A.4. SHA-3 . ................................................................................................................... 254 A.4.1. SHA-3 — ogólny opis . ............................................................................... 254 A.4.2. Funkcja rundy SHA-3 ................................................................................. 254 A.4.3. Funkcja mieszająca SHA-3 . ....................................................................... 256 A.5. Inne funkcje skrótu ................................................................................................ 257
Dodatek B Algorytmy szyfrujące . .................................................................. 259 B.1. IDEA . ..................................................................................................................... 259 B.1.1. Przekształcenia początkowe . ...................................................................... 259 B.1.2. Operacje pojedynczego cyklu IDEA . ......................................................... 259 B.1.3. Generowanie podkluczy . ............................................................................ 261 B.1.4. Przekształcenia MA ..................................................................................... 261 B.1.5. Deszyfrowanie IDEA . ................................................................................ 261 B.2. DES . ....................................................................................................................... 263 B.2.1. Permutacja początkowa (IP) . ...................................................................... 263 B.2.2. Podział tekstu na bloki . ............................................................................... 263
10
Podstawy kryptografii B.2.3. Permutacja rozszerzona . ............................................................................. 265 B.2.4. S-bloki ......................................................................................................... 266 B.2.5. P-bloki ......................................................................................................... 267 B.2.6. Permutacja końcowa .................................................................................... 268 B.2.7. Deszyfrowanie DES .................................................................................... 268 B.2.8. Modyfikacje DES ........................................................................................ 269 B.3. AES . ....................................................................................................................... 271 B.3.1. Opis algorytmu ............................................................................................ 271 B.3.2. Generowanie kluczy . .................................................................................. 271 B.3.3. Pojedyncza runda algorytmu . ..................................................................... 272 B.3.4. Podsumowanie ............................................................................................. 274 B.4. Twofish . ................................................................................................................. 275 B.4.1. Opis algorytmu ............................................................................................ 275 B.4.2. Pojedyncza runda algorytmu . ..................................................................... 275 B.4.3. Podsumowanie ............................................................................................. 280 B.5. CAST5 . .................................................................................................................. 280 B.5.1. Opis algorytmu ............................................................................................ 280 B.5.2. Rundy CAST5 ............................................................................................. 281 B.6. Blowfish . ................................................................................................................ 282 B.6.1. Opis algorytmu ............................................................................................ 282 B.6.2. Funkcja algorytmu Blowfish . ..................................................................... 283 B.7. DSA . ...................................................................................................................... 284 B.7.1. Podpisywanie wiadomości . ......................................................................... 284 B.7.2. Weryfikacja podpisu .................................................................................... 285 B.7.3. Inne warianty DSA ...................................................................................... 285 B.8. RSA . ...................................................................................................................... 287 B.8.1. Generowanie pary kluczy . .......................................................................... 287 B.8.2. Szyfrowanie i deszyfrowanie . ..................................................................... 287 B.9. Inne algorytmy szyfrujące ...................................................................................... 288
Dodatek C Kryptografia w służbie historii . ..................................................... 291 C.1. Święte rysunki ........................................................................................................ 292 C.1.1. 1000 lat później… ....................................................................................... 293 C.1.2. Szyfr faraonów ............................................................................................ 294 C.1.3. Ziarno przeznaczenia . ................................................................................. 295 C.1.4. Je tiens l’affaire! .......................................................................................... 296 C.1.5. Tajemnica hieroglifów . ............................................................................... 297 C.2. Język mitów ........................................................................................................... 298 C.2.1. Mit, który okazał się prawdziwy . ............................................................... 298 C.2.2. Trojaczki Kober ........................................................................................... 301 C.2.3. Raport z półwiecza ...................................................................................... 303 C.3. Inne języki ............................................................................................................. 305
Bibliografia . ................................................................................................... 307 Skorowidz . ..................................................................................................... 309
Kilka słów wstępu Szanowny Czytelniku! Książka, którą trzymasz w rękach, ma spełnić dwa zadania. Po pierwsze, przybliżyć jak najszerszemu gronu czytelników fascynującą naukę, jaką bez wątpienia jest kryptografia, a po drugie, umożliwić każdemu z nich wykorzystanie jej do ochrony własnych danych. Postanowiłem ją napisać, ponieważ właśnie takiej publikacji brakowało mi podczas pisania pracy magisterskiej. Brakowało mi książki, która stopniowo wprowadzałaby w świat algorytmów kryptograficznych; książki, która po zachęcającym wstępie nie rzuca czytelnika od razu na głęboką wodę skomplikowanych wzorów i terminów kryptograficznych; książki, która daje możliwość wykorzystania zdobytej wiedzy w praktyce. Mówiąc krótko: takiej, od której można zacząć. Z tego względu najbardziej przyda się ona studentom oraz każdemu, kto chciałby poznać tę dziedzinę nauki, a nie posiada specjalistycznej wiedzy z dziedziny matematyki i informatyki. Myślę jednak, iż nawet osoby zaznajomione z tematem mogą w niej znaleźć sporo interesujących wiadomości.
Jak czytać tę książkę? No cóż, najlepiej zgodnie z numeracją stron. Kolejne pojęcia z dziedziny kryptologii wprowadzane są stopniowo, poczynając od podstawowych szyfrów historycznych, a na współczesnych algorytmach komputerowych kończąc. Rozdział 1. opowiada o początkach szyfrów i ich rozwoju na przestrzeni wieków. W rozdziale 2. opisane zostały podstawowe twierdzenia i wzory matematyczne wykorzystywane w kryptografii, a także (w jego drugiej części) ich praktyczne wykorzystanie. Oczywiście nie zawarłem tu wszystkich związanych z kryptografią aspektów matematycznych, a jedynie te najważniejsze i potrzebne do zrozumienia zagadnień opisywanych w dalszych rozdziałach.
12
Podstawy kryptografii
Rozdział 3. jest wprowadzeniem teoretycznym do współczesnej kryptografii. Zawiera on opisy najpopularniejszych ataków i metod kryptoanalitycznych, wskazuje rodzaje stosowanych szyfrów oraz ich tryby. Znajduje się w nim również krótka analiza problematyki związanej z infrastrukturą klucza publicznego, charakterystyka najważniejszych protokołów kryptograficznych oraz opis nietypowych i nieco futurystycznych metod szyfrowania. Z ostatniego rozdziału dowiedzieć się można, jak wykorzystać opisane wcześniej algorytmy i programy do ochrony własnych danych. Na wstępie mamy więc kilka uwag ogólnych, które mimo iż mogą brzmieć jak kontynuacja wywodów teoretycznych z poprzedniego rozdziału, naprawdę warto wziąć sobie do serca. W dalszej części znajdują się opisy programów i technik pozwalających na zabezpieczenie danych w trakcie ich przechowywania (pliki, szyfrowane partycje, bazy danych), jak i przesyłania (poczta elektroniczna, połączenie w trybie terminalowym). Dodatki A i B przeznaczone są dla bardziej zaawansowanych Czytelników, zainteresowanych działaniem współczesnych algorytmów szyfrujących i funkcji skrótu. Dodatek C przeczytać powinien każdy, kogo interesuje historia kryptografii. Opisuje on bardzo interesujące przypadki wykorzystania tej dziedziny nauki w celu odczytania pisma dawnych cywilizacji. Oczywiście nic nie stoi na przeszkodzie, aby zagadnienia opisane w niniejszej książce potraktować bardziej wybiórczo, zgodnie z własnymi potrzebami i zainteresowaniami. Informacje zawarte w pierwszych dwóch rozdziałach nie są potrzebne do wykorzystania wiedzy zawartej w rozdziale 4., jednak warto wcześniej przeczytać przynajmniej rozdział 3. Jeśli więc kogoś interesuje przede wszystkim praktyka, powinien mimo wszystko zacząć od teorii. W ten sposób uniknie ewentualnych niejasności związanych ze stosowanymi terminami. Marcin Karbowski Katowice, wrzesień 2013
Kilka słów wstępu
13
Szalony jest człowiek, który zapisuje sekrety w sposób nieskrywający ich przed pospólstwem. Roger Bacon, Epistoła o tajnych dziełach Sztuki i nicości Magii (XIII wiek)
14
Podstawy kryptografii
Rozdział 1.
Historia kryptografii Dążenie do odkrywania tajemnic tkwi głęboko w naturze człowieka, a nadzieja dotarcia tam, dokąd inni nie dotarli, pociąga umysły najmniej nawet skłonne do dociekań. Niektórym udaje się znaleźć zajęcie polegające na rozwiązywaniu tajemnic… Ale większość z nas musi zadowolić się rozwiązywaniem zagadek ułożonych dla rozrywki: powieściami kryminalnymi i krzyżówkami. Odczytywaniem tajemniczych szyfrów pasjonują się nieliczne jednostki. John Chadwick Jeszcze nigdy tak wielu nie zawdzięczało tak wiele tak niewielu. Winston Churchill Szyfr Cezara wprowadzono w armii rosyjskiej w roku 1915, kiedy okazało się, że sztabowcom nie można powierzyć niczego bardziej skomplikowanego. Friedrich L. Bauer
1.1. Prolog — Painvin ratuje Francję 21 marca 1918 roku o godzinie 4:30 rozpoczął się największy ostrzał artyleryjski I wojny światowej. Przez pięć godzin niemieckie działa pluły ogniem na pozycje połączonych sił brytyjskich i francuskich. Następnie 62 dywizje niemieckie zalały front na odcinku 60 kilometrów. Dzień po dniu alianci zmuszani byli do wycofywania się i dopiero tydzień później ofensywa została zatrzymana. Do tego czasu wojska niemieckie wbiły się 60 km poza linię frontu. Sukces ten wynikał w dużej mierze z przewagi liczebnej, jaką dysponowały — po kapitulacji Rosji przerzucono do Francji dywizje do tej pory związane walką na froncie wschodnim. Rozciągnięta linia frontu zmuszała obrońców do znacznego rozproszenia sił, co skwapliwie wykorzystywał generał Erich von Ludendorf. Jego taktyka opierała się na koncentrowaniu dużych sił w jednym punkcie i atakowaniu z zaskoczenia. Poznanie planów nieprzyjaciela było kluczowe dla skutecznej obrony. Dzięki temu możliwe stałoby się zgromadzenie większych sił na zagrożonym odcinku frontu. Prowadzono więc intensywny nasłuch radiowy i przechwytywano liczne meldunki przesyłane między niemieckimi centrami dowodzenia, problem polegał jednak na tym, iż w większości wyglądały one mniej więcej tak:
16
Podstawy kryptografii
XAXXF AGXVF DXGGX FAFFA AGXFD XGAGX AVDFA GAXFX GAXGX AGXVF FGAXA… Był to nowy szyfr stosowany przez niemieckie wojska. Nazwano go ADFGX od stosowanych liter alfabetu tajnego. Ich wybór nie był przypadkowy. W alfabecie Morse’a różniły się one w istotny sposób, dzięki czemu ewentualne zniekształcenia komunikatów radiowych były minimalne. Jedynym sukcesem francuskiego wydziału szyfrów na tym etapie było złamanie innego niemieckiego systemu, tzw. Schlusselheft. Był to jednak szyfr stosowany głównie do komunikacji między oddziałami w okopach, natomiast naprawdę istotne informacje chronione były przy użyciu ADFGX. Wprowadzenie tego szyfru praktycznie oślepiło francuskie centrum dowodzenia. Najdobitniej świadczą o tym słowa ówczesnego szefa francuskiego wywiadu: „Z racji mego stanowiska jestem najlepiej poinformowanym człowiekiem we Francji, a w tej chwili nie mam pojęcia, gdzie są Niemcy. Jak nas dopadną za godzinę, nawet się nie zdziwię”1. Oczywiście Bureau du Chiffre nie pozostawało bezczynne. Zadanie złamania niemieckiego szyfru powierzono najlepszemu z francuskich kryptoanalityków — Georges’owi Painvinowi. Jednak nawet on nie był w stanie przeniknąć spowijającej ów szyfr tajemnicy. Zdołał jedynie ustalić, iż system oparty jest na szachownicy szyfrującej i że klucze zmienia się codziennie. Te informacje mogłyby się na coś przydać, gdyby przechwycono większą liczbę zaszyfrowanych depesz. Ta jednak była zbyt skromna i szyfr nadal pozostawał zagadką. Sytuacja zmieniła się dopiero na początku kwietnia, kiedy Niemcy zwiększyli liczbę przekazów radiowych. W ręce Painvina wpadła większa ilość materiału do badań, co dało nadzieję na uczynienie pierwszych postępów w łamaniu szyfru. Po wstępnej analizie francuski kryptoanalityk zauważył, iż niektóre wiadomości pochodzące z tego samego dnia mają identyczne początki. Założył więc, że są to te same nagłówki meldunków zaszyfrowane kluczem dziennym. Pozwoliło mu to wydobyć pierwsze informacje na temat konstruowania tego klucza. Następnie posegregował wiadomości na segmenty o takich samych początkach i przesuwając je względem siebie, próbował znaleźć kolejne prawidłowości. Ogromnie pomocne okazało się przechwycenie 18 wiadomości tego samego dnia. Wszystkie były zaszyfrowane tym samym kluczem, dzięki czemu Painvin był w stanie porównać je ze sobą i wyodrębnić stosowane do szyfrowania pary liter (AA, AD, AF itd.). Następnie policzył częstotliwość występowania poszczególnych par. Najczęściej pojawiała się kombinacja DG. Nasunęło mu to podejrzenie, iż odpowiadała ona literze e, najczęściej pojawiającej się w języku niemieckim. Udało mu się również ustalić wygląd stosowanej tablicy (patrz rysunek 1.1).
1
Kahn D., Łamacze kodów — historia kryptologii, Wydawnictwa Naukowo-Techniczne, Warszawa 2004.
Rozdział 1. Historia kryptografii
17
Rysunek 1.1. Tablica podstawień szyfru ADFGX ustalona przez Painvina
Na niemieckim systemie szyfrowania pojawiła się pierwsza rysa. Był to jednak dopiero początek drogi. Teraz należało ustalić współrzędne pozostałych liter. Rozpoczęły się długie dni mozolnej analizy statystycznej przechwyconych kryptogramów. Painvin porównywał częstotliwość występowania pojedynczych liter w parach i na tej podstawie dzielił kryptogramy. Przypisał każdej literze dwie współrzędne — górną i boczną — a następnie próbował je ustalić. Opierał się na każdym, najmniejszym nawet strzępku informacji, jaki udało mu się zdobyć: na częstości występowania czy parzystości lub nieparzystości sumy współrzędnych. Mozolnie, litera po literze, zrekonstruował niemiecką tabelę podstawień i był teraz w stanie rekonstruować dzienne klucze niemieckich szyfrantów. Przed końcem maja doszedł do takiej wprawy, iż otrzymane wiadomości był w stanie odczytać już po dwóch dniach. I wtedy stało się to, czego najbardziej się obawiał. Niemcy zmienili szyfr. Komunikaty niemieckie przechwycone 1 czerwca zawierały dodatkową literę — V. Oznaczało to zmianę wyglądu tabeli szyfrowania i być może całego systemu. Tymczasem niemiecka ofensywa trwała. Decydujący atak był kwestią czasu, a Francuzi stracili właśnie możliwość przewidzenia, w którym miejscu nastąpi. Po długiej, bezsennej nocy i kolejnym dniu pracy Painvinowi udało się jednak, poprzez porównywanie starych i nowych kryptogramów, odtworzyć szachownicę szyfrowania (patrz rysunek 1.2). Rysunek 1.2. Tablica szyfru ADFGVX
Czym prędzej zabrał się do łamania przechwyconych wiadomości i już tego samego dnia udało mu się wysłać pierwsze cenne informacje do sztabu dowodzenia. Mniej więcej w tym samym czasie pierwsze pociski z niemieckich dział dalekosiężnych spadły na Paryż… Czasu było coraz mniej. Linia frontu była zbyt długa, by należycie zabezpieczyć wszelkie możliwe punkty ataku. Należało więc za wszelką cenę zdobyć informację, gdzie Ludendorf zamierza uderzyć. Francuzi wzmocnili nasłuch radiowy i czekali. Trzeciego czerwca udało się przechwycić depeszę z niewielkiego miasteczka Remaugies, opanowanego
18
Podstawy kryptografii
przez wojska niemieckie. Po jej odczytaniu okazało się, iż zawiera ona rozkaz przysłania dużej ilości amunicji. To mogło być to! Ciężki ostrzał artyleryjski przed rozpoczęciem szturmu był powszechną praktyką. Zwiad lotniczy istotnie zaobserwował w ciągu kolejnych dni dużą liczbę ciężarówek na drogach prowadzących do Remaugies. Hipotezę o ataku potwierdzały również informacje od schwytanych jeńców i dezerterów. Prawdopodobną datę ataku wyznaczono na 7 czerwca. Nie pozostawało już nic innego, jak tylko wzmocnić odpowiedni odcinek frontu i czekać. Wzmocniono obie linie obrony i poinformowano oficerów o zbliżającym się natarciu. Wreszcie nadszedł decydujący dzień. W nerwowym oczekiwaniu żołnierze spoglądali w kierunku niemieckich umocnień. Nic się jednak nie działo. Tak upłynął 7 czerwca, a po nim 8. Napięcie rosło. Oczywiście możliwe było pewne opóźnienie ataku, a informacje od jeńców mogły być nieścisłe, a jednak… w serca obrońców wkradł się niepokój. Wreszcie o północy 9 czerwca niemieckie działa otworzyły ogień. Francuskie linie były bombardowane przez 3 godziny z niespotykaną dotąd intensywnością. Chwilę później nastąpił atak. Do przodu ruszyło 15 niemieckich dywizji. Kolejnych pięć dni wypełnionych było ciągłą walką o każde miasteczko i ulicę. Niemcy postępowali naprzód, by kolejnego dnia ustępować przed kontratakiem Francuzów. Jeśli jednak ktokolwiek był zaskoczony przebiegiem bitwy, to jedynie generał von Ludendorf. Po raz pierwszy nie udało mu się skoncentrowanym atakiem przełamać linii oporu wroga. Co więcej, wróg odważnie kontratakował. W ciągu następnych tygodni próbował jeszcze kolejnych ataków, jednak wkrótce zabrakło mu sił. Paryż został ocalony. A wraz z nim Francja. Wkrótce potem w Europie wylądowały siły amerykańskie. Dzięki ich wsparciu alianci byli w stanie przystąpić do kontrofensywy, zmuszając Niemców do odwrotu i ostatecznie do poddania się. Niemieccy generałowie podpisali akt kapitulacji 11 października w miejscowości Compiegne. I wojna światowa została zakończona. A Painvin? Cóż… Painvin pojechał na zasłużony urlop. Po latach, zapytany o historię złamania szyfru ADFGVX, odpowiedział: „Osiągnięcie to pozostawiło niezmywalny ślad na mej duszy i pozostało jednym z najjaśniejszych i najwspanialszych wspomnień w całym moim życiu”2. I trudno mu się chyba dziwić. Nie każdemu dane jest ocalić własny kraj. Przytoczona tu historia stanowi niewątpliwie znakomity materiał na film. Wiele osób może zadziwić to, jak wielki wpływ na losy wojny może mieć jeden człowiek. Oczywiście bez odpowiedniej reakcji ze strony dowództwa, odpowiedniego planowania i wykorzystywania zdobytej przewagi, a przede wszystkim bez odwagi i poświęcenia zwykłych żołnierzy, którzy oddali życie za swój kraj, informacje zdobyte przez Painvina zostałyby zmarnowane. Z drugiej jednak strony, gdyby nie on, szanse na ocalenie Paryża byłyby nikłe. Upadek stolicy wpłynąłby zaś nie tylko na losy Francji, ale i na wynik całej wojny.
2
Kahn D., Łamacze kodów — historia kryptologii, op.cit.
Rozdział 1. Historia kryptografii
19
Tymczasem z punktu widzenia historii kryptografii przypadek francuskiego kryptoanalityka nie jest niczym niezwykłym. Historia jest pełna opowieści o jemu podobnych, którzy łamiąc szyfr, decydowali o losach setek, tysięcy lub nawet milionów ludzi. Jednak ich osiągnięcia często wychodziły na jaw dopiero po latach, kiedy tajemnice rządowe mogły zostać bezpiecznie ujawnione. Byli więc szarymi eminencjami historii, wpływali na bieg politycznych negocjacji, gry wywiadów czy wreszcie wojen. Wszystko dzięki znakomitemu opanowaniu sztuki „sekretnego pisma” pozwalającej na odkrywanie cudzych tajemnic i zabezpieczanie swoich. Historia kryptografii to opowieść o tych właśnie ludziach. A zatem posłuchajcie…
1.2. Początek… Na początku było pismo. Wykształcone niezależnie w wielu kulturach stanowiło niezbadaną tajemnicę dla tych, którzy nie potrafili czytać. Szybko jednak zrodziła się konieczność ukrycia informacji również przed tymi, którym umiejętność ta nie była obca. Najbardziej oczywistym rozwiązaniem było schowanie tajnej wiadomości przed ludźmi, którzy mogliby ją odczytać. Takie zabiegi wkrótce jednak przestały wystarczać. Wiadomość mogła zostać odnaleziona podczas wnikliwego przeszukania, a wtedy tajne informacje dostałyby się w ręce wroga. A gdyby udało się napisać list działający na zasadzie „drugiego dna”? Z pozoru zawierałby on błahe treści, jednak jeśli adresat wiedziałby, gdzie i jak szukać, mógłby dotrzeć do „mniej niewinnych” informacji. Tak narodziła się steganografia.
1.2.1. Steganografia Steganografia to ogół metod ukrywania tajnych przekazów w wiadomościach, które nie są tajne. Jej nazwa wywodzi się od greckich słów: steganos (ukryty) oraz graphein (pisać). W przeszłości stosowano wiele wymyślnych sposobów osiągnięcia tego efektu. Popularny niewidzialny atrament to jeden z najbardziej znanych przykładów steganografii. Pierwsze zapiski na temat stosowania tej sztuki znaleźć można już w księgach z V w. p.n.e. Przykładem może być opisana przez Herodota historia Demaratosa, Greka, który ostrzegł Spartan przed przygotowywaną przeciw nim ofensywą wojsk perskich. Nie mógł on wysłać oficjalnej wiadomości do króla, zeskrobał więc wosk z tabliczki i wyrył tekst w drewnie. Następnie ponownie pokrył tabliczkę woskiem i wręczył posłańcowi. Czysta tabliczka nie wzbudziła podejrzeń perskich patroli i bezpiecznie dotarła do celu. Tam co prawda długo głowiono się nad jej znaczeniem, wkrótce jednak żona spartańskiego wodza Leonidasa wpadła na pomysł zeskrobania wosku, co pozwoliło odkryć tajną wiadomość. W miarę postępu technicznego, a także rozwoju samej steganografii, powstawały coraz wymyślniejsze metody ukrywania wiadomości. Znana jest na przykład metoda ukrywania wiadomości w formie kropki w tekście drukowanym, stosowana podczas II wojny światowej. Wiadomość była fotografowana, a klisza pomniejszana do rozmiarów około milimetra kwadratowego i naklejana zamiast kropki na końcu jednego ze
20
Podstawy kryptografii
zdań w liście. Obecnie bardzo popularne jest ukrywanie wiadomości w plikach graficznych. Kolejne przykłady można mnożyć, jednak nawet najbardziej wymyślne z nich nie gwarantują, iż wiadomość nie zostanie odkryta. Koniecznością stało się zatem wynalezienie takiego sposobu jej zapisywania, który gwarantowałby tajność nawet w przypadku przechwycenia przez osoby trzecie.
1.2.2. Kryptografia Nazwa kryptografia również wywodzi się z języka greckiego (od wyrazów kryptos — ukryty i graphein — pisać). Jej celem jest utajnienie znaczenia wiadomości, a nie samego faktu jej istnienia. Podobnie jak w przypadku steganografii data jej powstania jest trudna do określenia. Najstarsze znane przykłady przekształcenia pisma w formę trudniejszą do odczytania pochodzą ze starożytnego Egiptu, z okresu około 1900 roku p.n.e. Pierwsze tego typu zapisy nie służyły jednak ukrywaniu treści przed osobami postronnymi, a jedynie nadaniu napisom formy bardziej ozdobnej lub zagadkowej. Skrybowie zapisujący na ścianach grobowców historie swych zmarłych panów świadomie zmieniali niektóre hieroglify, nadając napisom bardziej wzniosłą formę. Często celowo zacierali ich sens, zachęcając czytającego do rozwiązania zagadki. Ten element tajemnicy był ważny z punktu widzenia religii. Skłaniał on ludzi do odczytywania epitafium i tym samym do przekazania błogosławieństwa zmarłemu. Nie była to kryptografia w ścisłym tego słowa znaczeniu, zawierała jednak dwa podstawowe dla tej nauki elementy — przekształcenie tekstu oraz tajemnicę. Na przestrzeni kolejnych 3000 lat rozwój kryptografii był powolny i dosyć nierówny. Powstawała ona niezależnie w wielu kręgach kulturowych, przybierając różne formy i stopnie zaawansowania. Zapiski na temat stosowania szyfrów znaleziono na pochodzących z Mezopotamii tabliczkach z pismem klinowym. Ich powstanie datuje się na 1500 rok p.n.e. W II w. p.n.e. grecki historyk Polibiusz opracował system szyfrowania oparty na tablicy przyporządkowującej każdej literze parę cyfr (patrz rysunek 1.3). Rysunek 1.3. Tablica Polibiusza
W późniejszych czasach tablica ta stała się podstawą wielu systemów szyfrowania. Przekształcenie liter w liczby dawało możliwość wykonywania dalszych przekształceń za pomocą prostych obliczeń lub funkcji matematycznych. Metodę Polibiusza uzupełnioną kilkoma dodatkowymi utrudnieniami kryptoanalitycznymi zastosowała m.in. niemiecka armia przy opracowywaniu wspomnianego na wstępie systemu szyfrującego ADFGX oraz jego udoskonalonej wersji ADFGVX.
Rozdział 1. Historia kryptografii
21
Pierwsze wzmianki dotyczące stosowania kryptografii w celach politycznych pochodzą z IV w. p.n.e. z Indii. Wymieniana jest ona jako jeden ze sposobów zdobywania informacji przez przebywających za granicą ambasadorów. Sekretne pismo wspomniane jest również w słynnej Kamasutrze — figuruje tam jako jedna z 64 sztuk, które kobieta powinna znać. Ogólnie stosowane w starożytności metody kryptografii można podzielić na dwa rodzaje — przestawianie i podstawianie. W pierwszym przypadku następowała zamiana szyku liter w zdaniach, czyli innymi słowy, tworzony był anagram. Przykładem szyfrowania przestawieniowego jest pierwsze znane urządzenie szyfrujące — spartańska scytale z V w. p.n.e. Miała ona kształt pręta o podstawie wielokąta, na który nadawca nawijał skórzany pas. Wiadomość pisana była wzdłuż pręta, po czym odwijano pas, na którym widać było tylko pozornie bezsensowną sekwencję liter. Potem goniec przenosił list do adresata, stosując czasem steganograficzne sztuczki, na przykład opasując się nim i ukrywając tekst po wewnętrznej stronie. Odczytanie wiadomości było możliwe przy użyciu scytale o takiej samej grubości, jaką miał pręt nadawcy. Druga, bardziej popularna metoda polegała na podstawianiu za litery tekstu jawnego innych liter bądź symboli. Za przykład może tu posłużyć szyfr Cezara, najsłynniejszy algorytm szyfrujący czasów starożytnych (jego twórcą był Juliusz Cezar). Szyfr ten opierał się na zastąpieniu każdej litery inną, położoną o trzy miejsca dalej w alfabecie. W ten sposób na przykład wiadomość o treści Cesar przekształca się w Fhvdu. Adresat znający sposób szyfrowania w celu odczytania wiadomości zastępował każdą literę tekstu tajnego literą położoną o trzy miejsca wcześniej w alfabecie (patrz rysunek 1.4). Rysunek 1.4. Szyfr Cezara
Szyfry przyporządkowujące każdej literze alfabetu jawnego dokładnie jedną literę, kombinację cyfr lub symbol nazywamy szyframi monoalfabetycznymi. W przypadku szyfru Cezara układ alfabetu tajnego zawsze pozostawał ten sam. Znacznie bezpieczniejszym rozwiązaniem było dokonywanie w nim okresowych zmian, tak aby znajomość metody szyfrowania nie wystarczała do odczytania wiadomości. Stanowiło to jednak utrudnienie również dla adresata. Musiał on dodatkowo posiadać klucz (układ liter lub symboli w alfabecie tajnym). Tak powstał największy problem w historii kryptografii — dystrybucja klucza. Raz przechwycony klucz stawał się bezużyteczny, gdyż wiadomości szyfrowane za jego pomocą nie były już bezpieczne. O ile w przypadku wymiany wiadomości między dwiema osobami nie była to z reguły duża przeszkoda (wystarczyło ustalić nowy klucz), o tyle w przypadku szyfrowania na potrzeby wojskowe rodziło to bardzo wiele problemów. Trzeba było dostarczyć nowy klucz do wszystkich jednostek i to możliwie szybko, gdyż każda przechwycona przez wroga wiadomość stawała się dla niego łatwa do odczytania.
22
Podstawy kryptografii
1.2.3. Narodziny kryptoanalizy Kolebką kryptoanalizy były państwa arabskie, które najlepiej opanowały sztukę lingwistyki i statystyki, na nich bowiem opierała się technika łamania szyfrów monoalfabetycznych. Najwcześniejszy jej opis znajduje się w pracy Al-Kindiego, uczonego z IX wieku, znanego jako „filozof Arabów” (napisał on 29 prac z dziedziny medycyny, astronomii, matematyki, lingwistyki i muzyki). Jego największy traktat, O odczytywaniu zaszyfrowanych listów, został odnaleziony w 1987 roku w Archiwum Ottomańskim w Stambule. W pracy tej Al-Kindi zawarł szczegółowe rozważania na temat statystyki fonetyki i składni języka arabskiego oraz opis opracowanej przez siebie techniki poznawania tajnego pisma. To jeden z pierwszych udokumentowanych przypadków zastosowania ataku kryptoanalitycznego. Pomysł arabskiego uczonego był następujący: „Jeden sposób na odczytanie zaszyfrowanej wiadomości, gdy wiemy, w jakim języku została napisana, polega na znalezieniu innego tekstu w tym języku, na tyle długiego, by zajął mniej więcej jedną stronę, i obliczeniu, ile razy występuje w nim każda litera. Literę, która występuje najczęściej, będziemy nazywać »pierwszą«, następną pod względem częstości występowania »drugą« i tak dalej, aż wyczerpiemy listę wszystkich liter w próbce jawnego tekstu. Następnie bierzemy tekst zaszyfrowany i również klasyfikujemy użyte w nim symbole. Znajdujemy najczęściej występujący symbol i zastępujemy go wszędzie „pierwszą” literą z próbki jawnego tekstu. Drugi najczęściej występujący symbol zastępujemy „drugą” literą, następny „trzecią” i tak dalej, aż wreszcie zastąpimy wszystkie symbole w zaszyfrowanej wiadomości, którą chcemy odczytać”3. Opisana powyżej metoda znana jest jako analiza częstości i po dziś dzień stanowi podstawową technikę kryptoanalityczną. Każdy język posiada własną charakterystykę występowania poszczególnych liter w piśmie, zawsze jednak pewne znaki pojawiają się częściej niż inne. Na tej podstawie kryptoanalityk może zidentyfikować te litery w kryptogramie. To z kolei pozwala odgadnąć niektóre ze znajdujących się w tajnym piśmie wyrazów, dzięki czemu rozszyfrowuje się kolejne litery itd. Wszystko opiera się tutaj w dużej mierze na prawdopodobieństwie, gdyż najczęściej występujący w kryptogramie znak wcale nie musi być literą najczęściej występującą w danym języku. Niemniej jednak znajomość tej metody pozwalała znacznie zredukować liczbę możliwych podstawień i osiągnąć rozwiązanie metodą prób i błędów. Należy tu podkreślić, że jeśli mamy do czynienia z jedną krótką wiadomością, analiza częstości występowania znaków może dać fałszywe wyniki (w tych kilku konkretnych zdaniach najczęściej pojawiającą się literą może być na przykład czternasta pod względem częstości występowania w danym języku) i utrudnić dekryptaż. Stąd też im dłuższy jest zaszyfrowany tekst, tym większa szansa na złamanie szyfru. Dzięki wynalazkowi Al-Kindiego monoalfabetyczne systemy szyfrujące przestały być bezpieczne. Od tej chwili rozpoczął się trwający do dziś wyścig kryptografów z kryptoanalitykami. 3
Singh S., Księga szyfrów, Albatros, Warszawa 2001, s. 31.
Rozdział 1. Historia kryptografii
23
1.3. Rozwój kryptografii i kryptoanalizy Jeszcze wiele lat po odkryciu Al-Kindiego liczni uczeni negowali możliwość złamania szyfru podstawieniowego. Szybko jednak metody kryptoanalityczne rozprzestrzeniły się z Bliskiego Wschodu na Europę. W średniowieczu nie dokonał się większy postęp w europejskiej kryptologii. Szyfry znane były mnichom i skrybom, a i ci nie traktowali ich jako odrębnej nauki, a jedynie jako rodzaj intelektualnej rozrywki. Aż do początków XV wieku używano wyłącznie szyfrów podstawieniowych. Popularne były również tzw. nomenklatory. Było to połączenie szyfru podstawieniowego z kodem — oprócz klasycznego alfabetu tajnego nomenklator zawierał listę słów i ich odpowiedników kodowych. Prawdziwy rozkwit technik szyfrowania nastąpił równolegle z rozwojem i umacnianiem stosunków dyplomatycznych między europejskimi państwami. Ambasadorowie, pełniący jednocześnie rolę szpiegów na obcych dworach, potrzebowali sposobu na bezpieczne przekazywanie tajnych informacji. Z tych samych powodów wzrosło zainteresowanie kryptoanalizą. W związku z dokonanymi w tej dziedzinie postępami szyfry monoalfabetyczne nie były już bezpieczne, zaczęto więc opracowywać nowe metody szyfrowania.
1.3.1. Szyfry homofoniczne Jedną z najbardziej znanych metod jest szyfrowanie z użyciem homofonów. Miało ono zabezpieczyć szyfr przed atakiem z użyciem analizy częstości. Pierwszy znany przykład szyfru homofonicznego pochodzi z roku 1401. W szyfrach takich alfabet tekstu tajnego wzbogacano o pewne dodatkowe symbole, które następnie przypisywano literom najczęściej występującym w alfabecie tekstu jawnego. I tak, jeśli częstość występowania danej litery wynosiła 7%, przypisywano jej 7 różnych symboli. W ten sposób każdy znak tekstu tajnego pojawiał się w wiadomości z taką samą częstością. Mogłoby się wydawać, że od tej chwili tajne wiadomości pozostaną nieodczytane. Nic bardziej mylnego. Częstość występowania liter nie jest jedyną charakterystyką języka. Istnieją również liczne powiązania między literami, takie jak częstość pojawiania się określonych par i trójek. Poszczególne wyrazy w języku również charakteryzują się określoną częstotliwością występowania. Dzięki takim prawidłowościom możliwa jest kryptoanaliza szyfrów homofonicznych poprzez wyszukiwanie tzw. częściowych powtórzeń. Załóżmy dla przykładu, iż szyfrowanie opiera się na podstawianiu par cyfr zamiast liter. Literom o większej częstości występowania przypisana jest większa liczba kombinacji dwucyfrowych. Tak skonstruowany szyfr można złamać przy odpowiedniej ilości materiału do badań. Wystarczy wyszukać w tekście podobne kombinacje znaków, na przykład: 67 55 10 23 i 67 09 10 23. Z dużą dozą prawdopodobieństwa założyć można, iż odpowiadają one tym samym wyrazom. Dzięki temu łatwo zidentyfikować zestawy cyfr odpowiadające tej samej literze (w naszym przykładzie — 55 i 09). Po odtworzeniu odpowiedniej liczby takich powiązań szyfr złamać można tradycyjną metodą analizy częstości. Zaczęto więc udoskonalać szyfry homofoniczne, aby uodpornić je na tego typu kryptoanalizę.
24
Podstawy kryptografii
Bardzo wiele usprawnień w szyfrowaniu wprowadziła włoska rodzina Argentich. W XVI i XVII wieku jej członkowie pracowali dla kolejnych papieży, służąc im swoją bogatą wiedzą kryptologiczną. Na początku XVII wieku wprowadzili liczne udoskonalenia w stosowanych wówczas technikach szyfrowania. Przede wszystkim stosowali symbole puste w każdym wierszu kryptogramu. Zlikwidowali również rozdzielanie wyrazów i zapisywanie znaków interpunkcyjnych. Nawet cyfry odpowiadające poszczególnym literom zapisywali razem, mieszając często liczby jedno- i dwucyfrowe. Dzięki tym zabiegom problem pojawiał się już na etapie podziału tekstu tajnego na pojedyncze znaki. Oczywiście złamanie szyfru nadal było możliwe, jednak zadanie to było znacznie trudniejsze niż w przypadku zwykłego szyfru homofonicznego. Symbol pusty — znak alfabetu tajnego nieposiadający odpowiednika w alfabecie jawnym. Adresat wiadomości podczas dekryptażu ignoruje takie znaki, natomiast dla kryptoanalityka są one dodatkowym utrudnieniem.
1.3.2. Szyfry polialfabetyczne Szyfry polialfabetyczne opisać można jako połączenie wielu szyfrów monoalfabetycznych. Mają wiele alfabetów tajnych, z których każdy szyfruje jeden znak tekstu tajnego. Używane są cyklicznie, a więc po wyczerpaniu wszystkich powraca się do pierwszego i kontynuuje szyfrowanie. Prawdopodobnie pierwszym zastosowanym szyfrem polialfabetycznym był szyfr Albertiego, włoskiego architekta z XV wieku.
1.3.2.1. Tarcza Albertiego Urodzony w roku 1404 Leone Battista Alberti był człowiekiem niezwykle wszechstronnym — komponował, malował, pisał, zajmował się aktorstwem, architekturą, prawem. Kryptografią zainteresował się dosyć późno, bo dopiero w roku 1466, za namową Leonardo Dato — ówczesnego papieskiego sekretarza. Alberti napisał obszerną rozprawę o tematyce kryptologicznej. Obejmowała ona zarówno zagadnienia kryptoanalizy, jak i metodologii tworzenia nowych szyfrów. Architekt opisał w niej również swój własny szyfr i stwierdził, iż nikt nie będzie w stanie go złamać. Szyfr ten opierał się na urządzeniu zaprojektowanym przez niego samego. Składało się ono z dwóch okrągłych tarcz (patrz rysunek 1.5). Jedna z nich zawierała się wewnątrz drugiej, na obu zaś, na osobnych polach, wypisane były litery alfabetu. Szyfrowanie polegało na zastępowaniu liter z małej tarczy literami znajdującymi się na odpowiadających im polach dużej. Wszystko to tworzyłoby jedynie prosty szyfr monoalfabetyczny, gdyby nie fakt, iż wewnętrzna tarcza była ruchoma. Obracając ją, szyfrujący zmieniał przypisania wszystkich używanych liter, tym samym wybierając nowy alfabet szyfrowy. Oczywiście osoby prowadzące zaszyfrowaną korespondencję przy użyciu tarczy Albertiego muszą posiadać jej identyczne egzemplarze i ustalić początkową pozycję wewnętrznej tarczy względem zewnętrznej.
Rozdział 1. Historia kryptografii
25
Rysunek 1.5. Tarcza Albertiego Źródło: Kahn D., Łamacze kodów — historia kryptologii, op.cit.
Dodatkowo włoski architekt umieścił na zewnętrznej tarczy cyfry od 1 do 4, co umożliwiało wstawianie do wiadomości słów kodowych (na przykład nazwy własne mogły być zastępowane kombinacjami cyfr). W połączeniu z wynalezieniem szyfru polialfabetycznego i dokonaniem pierwszego na Zachodzie opisu kryptoanalizy stanowiło to niebywałe osiągnięcie, zwłaszcza jak na człowieka, który kryptografią zajmował się raptem kilka lat. Osiągnięcia Albertiego zyskały mu miano ojca kryptologii Zachodu. Szyfrowanie z użyciem wielu alfabetów stanowiło wielki przełom, jednak stosowanie w tym celu urządzenia szyfrującego powodowało pewne niedogodności. Pół wieku później zupełnie inny sposób wykorzystania techniki szyfrowania polialfabetycznego zaproponował niemiecki uczony Johannes Trithemius.
1.3.2.2. Tabula recta Trithemius urodził się 2 lutego 1462 roku w Trittenheim w Niemczech. W wieku 17 lat rozpoczął studia na uniwersytecie w Heidelbergu, gdzie szybko zdobył uznanie dzięki swemu niebywałemu intelektowi. Mając lat dwadzieścia, przez przypadek trafił do opactwa benedyktynów. Życie mnichów zafascynowało go do tego stopnia, iż postanowił rozpocząć nowicjat. Niecałe dwa lata później wybrany został opatem. Oprócz sprawowania swego nowego stanowiska Trithemius zajmował się pisaniem książek. Pierwsza z nich została opublikowana, kiedy miał 24 lata. Pisał opowieści, słowniki, biografie, kroniki oraz kazania. Prowadził też bogatą korespondencję z innymi uczonymi. W roku 1499 rozpoczął pisanie książki pt. Steganographia. Opisywała ona znane metody szyfrowania. Tak naprawdę jednak w książce tej więcej było okultyzmu i czarnej magii niż kryptografii. Trithemius nie ukrywał swej fascynacji praktykami magicznymi i lubił uchodzić za cudotwórcę. Ze zrozumiałych względów kościelni zwierzchnicy zdecydowanie potępiali postępowanie opata i ostatecznie nie ukończył on swojej książki.
26
Podstawy kryptografii
W roku 1508 Trithemius powrócił do tematyki kryptologicznej, tym razem traktując temat bardziej naukowo. Jego kolejna książka — Poligraphia — skupiała się wyłącznie na zagadnieniach czysto kryptograficznych. Ukazała się ona dopiero w roku 1518, dwa lata po śmierci uczonego. Była to pierwsza książka na temat kryptologii wydana drukiem. Jej tytuł brzmiał: Sześć ksiąg o poligrafii przez Johannesa Trithemiusa, opata w Wurzburgu, poprzednio w Spanheim, dla cesarza Maksymiliana. Książka zawierała głównie kolumny słów używanych przez Trithemiusa w jego systemach kryptograficznych. W księdze piątej znajdował się jednak opis nowego systemu szyfrowania polialfabetycznego. Opierał się on na specjalnej tabeli nazwanej przez Trithemiusa tabula recta. Przedstawia ją rysunek 1.6. Rysunek 1.6. Tabela Trithemiusa
Na samej górze tabeli umieszczono alfabet tekstu tajnego. Kolejne linijki to tajne alfabety utworzone przez przenoszenie kolejnych liter z początku alfabetu na jego koniec. W ten sposób Trithemius uzyskał 26 alfabetów szyfrowych. Szyfrowanie tą metodą przebiega następująco: dla pierwszej litery tekstu jawnego używa się pierwszej linijki tabeli, dla drugiej litery — drugiej linijki itd. Pozwala to na zabezpieczenie tekstu przed atakiem przez analizę częstości. Jednak podobnie jak w przypadku szyfru Cezara nie chroni to przed odszyfrowaniem w przypadku, gdy kryptoanalityk zna stosowany algorytm. Próbą rozwiązania tego problemu był opublikowany w 1586 roku szyfr Vigenere’a.
Rozdział 1. Historia kryptografii
27
1.3.2.3. Le chiffre indechiffrable Blaise de Vigenere urodził się 5 kwietnia 1523 roku we Francji. W wieku 23 lat rozpoczął karierę dyplomatyczną na dworze w Wormancji. Podróżował po całej Europie i rok później został przyjęty na służbę u księcia de Nevers. W roku 1549 podczas misji dyplomatycznej w Rzymie Vigenere po raz pierwszy zetknął się z kryptografią. Ogromnie zafascynowany sztuką „tajnego pisma” oddał się studiowaniu książek największych kryptologów oraz własnym badaniom. Miał również możliwość współpracy z najwybitniejszymi ekspertami kurii papieskiej, co pozwoliło mu znacznie pogłębić wiedzę. Dzięki niej i bogatemu doświadczeniu został sekretarzem samego króla. W końcu w wieku 47 lat postanowił opuścić dwór i zająć się pisaniem książek. W roku 1586 Vigenere opublikował Traktat o szyfrach. Podobnie jak w dziele Trithemiusa, tak i tutaj znajdują się liczne dygresje na tematy zupełnie niezwiązane z kryptografią, za to jak najbardziej związane z czarną magią. Autor zachował mimo to naukową solidność w tych fragmentach książki, które w ogóle miały coś z nauką wspólnego. Opisał również własny szyfr polialfabetyczny. System opracowany przez Vigenere’a polegał na szyfrowaniu kolejnych liter wiadomości za pomocą różnych wierszy tablicy Trithemiusa. Różnica polegała na sposobie wyboru kolejnego wiersza szyfrującego. Dla pierwszej litery mógł to być wiersz 17., dla drugiej — 5., dla trzeciej — 13. itd. W ten sposób znajomość samego systemu przestawała wystarczać do odszyfrowania wiadomości. Trzeba było jeszcze znać kombinację wierszy zastosowaną w danym przypadku. Nadawca i odbiorca mogli sobie ułatwić zapamiętanie tej kombinacji, ustalając specjalne słowo klucz. Jego litery stanowiły jednocześnie pierwsze litery kolejno stosowanych wierszy szyfrowania. Dla przykładu: słowo kluczowe sekret oznaczało, iż do zaszyfrowania pierwszej litery wiadomości zastosowano 19. wiersz tabeli, dla drugiej — 5., dla trzeciej — 11. itd. Znajomość słowa klucza wystarczała adresatowi do odszyfrowania wiadomości. Odszukiwał on kolejne litery szyfrogramu w odpowiadających im linijkach tabeli, po czym odczytywał literę tekstu jawnego z linijki znajdującej się na samej górze. Vigenere stworzył również dwa systemy szyfrowania oparte na koncepcji autoklucza. W pierwszym przypadku kluczem stawał się odszyfrowywany tekst jawny. Konieczna była jedynie znajomość pojedynczej litery, stanowiącej tzw. klucz pierwotny. Dzięki niej adresat odczytywał pierwszą literę tekstu jawnego, którą wykorzystywał do odczytania drugiej itd. Drugi system z autokluczem również wykorzystywał klucz pierwotny. Tutaj jednak po zaszyfrowaniu pierwszej litery tekstu jawnego jej odpowiednik w kryptogramie stawał się kolejną literą klucza. Obie metody były znacznie bardziej innowacyjne i błyskotliwe niż opracowany przez Vigenere’a szyfr polialfabetyczny, jednak z niewiadomych przyczyn uległy zapomnieniu, a z nazwiskiem francuskiego uczonego kojarzony jest głównie szyfr oparty na tabeli Trithemiusa. Warto również zaznaczyć, iż koncepcja autoklucza została pierwotnie opisana przez włoskiego matematyka Girolamo Cardano, jednak opracowany przez niego system był pełen niedoskonałości i dopiero udoskonalenia wprowadzone przez Vigenere’a pozwalały na wykorzystanie tej metody przy szyfrowaniu wiadomości.
28
Podstawy kryptografii
Szyfr Vigenere’a przez bardzo długi czas uchodził za niemożliwy do złamania. Zyskał nawet przydomek le chiffre indechiffrable (pol. szyfr nieodszyfrowywalny). Został złamany dopiero w XIX wieku przez brytyjskiego uczonego Charlesa Babbage’a.
1.3.2.4. Złamanie szyfru „nie do złamania” Charles Babbage urodził się w roku 1792. Pochodził z bogatej rodziny (jego ojciec był bankierem), co pozwoliło mu na rozwijanie różnorodnych zainteresowań, w tym tych dotyczących kryptografii. Już jako dziecko zdradzał wyjątkowy talent w tej dziedzinie, przez co nieraz wpadał w kłopoty — łamał szyfry swoich szkolnych kolegów, a ci w rewanżu spuszczali mu lanie. Wraz z upływem lat rozwijał swoje umiejętności, aż stał się znany w całej Anglii. Często pomagał w przygotowywaniu materiału dowodowego w prowadzonych sprawach sądowych poprzez odszyfrowywanie korespondencji z nimi związanej. W roku 1854 zainteresował się problemem kryptoanalizy szyfru Vigenere’a. Nie przejmując się opiniami, jakoby szyfr ten był nie do złamania, rozpoczął poszukiwanie punktu zaczepienia, który pozwoliłby na skuteczną kryptoanalizę. Jeszcze w tym samym roku dokonał przełomowego odkrycia. Babbage zauważył mianowicie, że jeśli pozna się długość użytego słowa klucza, rozszyfrowanie tekstu będzie o wiele łatwiejsze, gdyż będzie wtedy wiadomo, które litery zaszyfrowane są przy użyciu takich samych podstawień. Na przykład: jeśli słowo kluczowe ma 5 liter, to co piąta litera tekstu jest szyfrowana przy użyciu identycznego alfabetu. Wystarczy zatem podzielić tekst na grupy liter szyfrowane tą samą literą klucza i dokonać kryptoanalizy opartej na analizie częstości. Grupy te nie są bowiem niczym innym jak prostym szyfrem podstawieniowym. Oczywiście kryptoanalityk nie zna długości klucza, informację tę można jednak zdobyć podczas badania kryptogramu. Przy dłuższych tekstach często zdarzają się bowiem powtórzenia wyrazów lub ich fragmentów szyfrowane tym samym fragmentem klucza. W takiej sytuacji w kryptogramie wystąpią powtarzające się kombinacje liter. Analizując odległości między nimi, ustalić można najbardziej prawdopodobną długość klucza. Z reguły jest nią jeden ze wspólnych dzielników tych odległości. Jeśli zatem udało nam się wyodrębnić cztery takie przypadki, a odstępy wynoszą 8, 16, 20 i 23 litery, to możemy z dużą dozą prawdopodobieństwa przyjąć, iż długość klucza wynosi cztery. Czasem powtórzenie może być dziełem przypadku, a nie synchronizacji klucza i tekstu, dlatego też ostatnią wartość (23) można zignorować. Zawsze jednak warto odszukać jak najwięcej powtórzeń, gdyż dzięki temu uzyskujemy większą ilość materiału do analizy, a co za tym idzie — większą pewność co do wyznaczonej długości klucza. Technika zastosowana przez Babbage’a została rozwinięta i usystematyzowana przez pruskiego wojskowego, Friedricha W. Kasickiego. W swojej książce Die Geheimschriften und die Dechiffrir-kunst (Tajne pisma i sztuka deszyfracji) szczegółowo opisał on metodykę łamania polialfabetów, począwszy od wyznaczania okresu klucza, a na analizie wyodrębnionych szyfrów monoalfabetycznych skończywszy. Książka stała się znana dopiero po jego śmierci w roku 1881 roku, a opracowaną metodę ochrzczono mianem analizy Kasickiego.
Rozdział 1. Historia kryptografii
29
1.3.3. Szyfry digraficzne Szyfr digraficzny opiera się na szyfrowaniu par znaków. Tekst jawny dzielony jest na pary znaków, a następnie przekształcany w kryptogram według ustalonego wzoru. Każdy symbol w kryptogramie jest więc zależny od dwóch liter tekstu jawnego, co utrudnia złamanie szyfru. Szyfry digraficzne zaliczyć można do szerszej grupy szyfrów wieloliterowych (operujących na grupach liter). Pierwszy znany szyfr digraficzny pochodzi z dzieła De Furtivis Literarum Notis autorstwa Giovanniego Battisty Porty — włoskiego uczonego z XVI wieku. Zawierało ono opis znanych ówcześnie szyfrów, lingwistycznych aspektów kryptografii, technik kryptoanalitycznych oraz autorskie propozycje technik szyfrowania. Autor umieścił w nim również liczne cenne wskazówki dotyczące zarówno szyfrowania, jak i łamania szyfrów. To Porta jako pierwszy wpadł na pomysł kryptoanalizy opartej na prawdopodobieństwie występowania słów w tekście. Mówiąc najogólniej, kryptoanalityk znający przeznaczenie danej wiadomości może spróbować odszukać w tekście wyraz często występujący w tekstach o takim charakterze. Na przykład dla meldunku wojskowego mogą to być wyrazy atak, wróg, dowódca itp. Co ciekawe, Porta nie podzielał powszechnej opinii, jakoby szyfry polialfabetyczne były nie do złamania. Przypuścił wiele ataków na znane wówczas polialfabety i był bardzo blisko sukcesu. W jednym przypadku udało mu się na podstawie występujących powtórzeń określić długość klucza, jednak nie zrobił z tej informacji żadnego użytku. W rezultacie szyfry polialfabetyczne uznawane były za bezpieczne przez kolejnych 300 lat. Pierwszym w historii literowym szyfrem digraficznym był szyfr Playfaira, nazwany tak od nazwiska angielskiego uczonego epoki wiktoriańskiej. Nazwa ta przylgnęła do tego szyfru, mimo iż tak naprawdę jego autorem był inny uczony, Charles Wheatstone. Obaj panowie byli jednak do siebie łudząco podobni, przez co notorycznie ich ze sobą mylono. Szyfr Playfaira opierał się na tablicy o wymiarach 5x5, w którą wpisywano kolejne litery alfabetu. Można też ją było wypełnić w oparciu o słowo klucz. W takim przypadku wpisywano je w tablicy (ignorując powtarzające się litery), a pozostałe litery wstawiano w puste miejsca w porządku alfabetycznym. Rysunek 1.7 przedstawia tablicę utworzoną w oparciu o słowo Playfair. Rysunek 1.7. Tablica szyfru Playfaira
30
Podstawy kryptografii
Szyfrowanie rozpoczynano od podzielenia tekstu jawnego na pary znaków (i oraz j traktowano jak ten sam znak, natomiast pary takich samych liter należało oddzielić literą x). Następnie przekształcano wiadomość w kryptogram w oparciu o następujące zasady: Jeśli obie litery znajdowały się w tym samym rzędzie, były zastępowane
literami znajdującymi się bezpośrednio po ich prawej stronie. Obowiązywała tutaj zasada cykliczności, tzn. ostatnia litera w rzędzie była zastępowana pierwszą po lewej. Jeśli obie litery znajdowały się w tej samej kolumnie, zastępowano je literami
znajdującymi się pod spodem. Tutaj również obowiązywała zasada cykliczności. Litery znajdujące się w innych kolumnach i wierszach były zastępowane
literami z tego samego wiersza, ale znajdującymi się w kolumnie drugiej litery tekstu jawnego. Być może brzmi to nieco zawile. Łatwiej będzie zrozumieć to na przykładzie. Zaszyfrujemy wiadomość o treści: tekst jawny w oparciu o tablicę zamieszczoną na rysunku 1.7. Po podziale na pary znaków otrzymujemy: TE KS TJ AW NY. Litery T i E znajdują się w różnych kolumnach i wierszach, dokonujemy zatem podstawienia zgodnie z trzecią z wymienionych powyżej zasad — T zamienia się w N, a E w M. Kolejna para liter znajduje się w tej samej kolumnie, zastosowanie ma zatem zasada druga. W rezultacie otrzymujemy wynik SX. W przypadku trzeciej pary ponownie wykorzystujemy zasadę trzecią, przez co TJ zamienia się w ND. Czwarta para liter szyfrowana jest z użyciem zasady drugiej (AW przechodzi w BA), natomiast piąta — z użyciem zasady trzeciej (NY przechodzi w SP). Szyfry digraficzne są trudniejsze do złamania za pomocą analizy częstości. Liczba digrafów jest zawsze o wiele większa niż liczba liter alfabetu jawnego (na przykład dla 26 liter mamy 676 digrafów) i mają one bardziej równomiernie rozłożoną częstość występowania. Z tego względu szyfr Playfaira przez wiele lat uważany był za wyjątkowo bezpieczny — wykorzystywano go zarówno podczas pierwszej, jak i drugiej wojny światowej.
1.3.4. Prawdziwy „szyfr nie do złamania” Mimo iż zmagania na arenie kryptografii i kryptoanalizy trwają nieprzerwanie, tak naprawdę od niemal stu lat znany jest szyfr, który przy prawidłowym wykorzystaniu jest niemożliwy do złamania. W tym przypadku twierdzenie to nie jest jedynie pobożnym życzeniem twórców, ale udowodnionym matematycznie faktem. Mowa tu o opracowanym przez Gilberta Vernama i Josepha Mauborgne’a szyfrze z kluczem jednorazowym (ang. one-time pad). Rozwiązanie opracowane przez Vernama i Mauborgne’a polega na szyfrowaniu każdego tekstu jawnego z wykorzystaniem generowanego losowo klucza o tej samej długości. Po wykorzystaniu klucz jest niszczony, a do zaszyfrowania kolejnego komunikatu należy wygenerować następny losowy klucz. W rezultacie kryptoanalityk nie ma żadnego punktu zaczepienia — nie ma tu prawidłowości związanych z cyklicznym
Rozdział 1. Historia kryptografii
31
powtarzaniem się klucza, a jeśli nawet poszczególne znaki zaszyfrowane są z użyciem tego samego alfabetu szyfrowego, ich rozmieszczenie ma charakter losowy. Co za tym idzie, sam szyfrogram ma rozkład statystyczny ciągu losowego. Ponieważ klucz ma taką samą długość jak tekst jawny, a jego generowanie nie opiera się na żadnych sformalizowanych zasadach, po przechwyceniu kryptogramu możemy dopasować do niego wiele różnych kluczy, uzyskując różne sensowne teksty jawne, z których każdy jest tak samo prawdopodobny. Przykładowo: dla trzynastoliterowego tekstu tajnego możemy dobrać różne klucze, deszyfrując go jako „ATAKWPOŁUDNIE”, „WIĘZIEŃUCIEKŁ” tudzież „VALARDOHAERIS” i tylko od kontekstu zależy, którą z tych wiadomości uznamy za najbardziej prawdopodobną. Gdybyśmy mieli więcej wiadomości zaszyfrowanych tym samym kluczem, mielibyśmy również potencjalny punkt zaczepienia, ale niepowtarzalność klucza jest podstawową zasadą omawianego systemu. Być może zastanawiacie się teraz, dlaczego w ogóle przez ostatnie sto lat poszukiwano nowych szyfrów i metod ukrywania informacji. Przecież mamy już idealny system, odporny na wszelkie ataki! Niestety o ile w teorii mamy 100-procentowe bezpieczeństwo, o tyle w praktyce nie jest już tak różowo. Owszem, sam szyfr rzeczywiście jest nie do złamania, ale jego implementacja stanowi nie lada wyzwanie. Podstawowe problemy to: Losowość klucza — nawet obecnie w erze komputerów generowanie ciągów
losowych stanowi niezwykle trudne i złożone zagadnienie. Więcej informacji na ten temat znaleźć można w kolejnych rozdziałach, tu wystarczy powiedzieć, że tworzenie naprawdę pozbawionych prawidłowości sekwencji znaków stanowi spore wyzwanie dla twórców oprogramowania i wciąż poszukuje się nowych sposobów na uzyskanie tego efektu. Jednorazowość klucza — dla każdej wiadomości musimy wygenerować
co najmniej tak samo długi klucz, co podwaja ilość wymaganej pamięci i przesyłanych danych (oprócz szyfrogramów adresat musi też w jakiś sposób wejść w posiadanie kolejnych partii klucza). Przy zakrojonych na szeroką skalę operacjach, w których udział biorą dziesiątki lub setki tysięcy ludzi, byłby to często ogromny problem techniczny. Intensywnie wykorzystywany kryptosystem może wymagać milionów kluczy na sekundę, co niebagatelnie zwiększyłoby koszt całego przedsięwzięcia. Dystrybucja klucza — jak dostarczymy adresatowi jego kopie kluczy? Przy
komunikacji pomiędzy dwoma osobami nie wydaje się to aż tak trudne, choć i tutaj trzeba ustalić jakiś bezpieczny kanał, który od tego momentu będzie wąskim gardłem całego przedsięwzięcia. Co jednak, jeśli komunikacja odbywa się między tysiącami osób na całym świecie? Parafrazując słynne pytanie z „Rejsu” — jaką metodą zaszyfrujemy jednorazowe klucze szyfrujące? Oczywiście nie oznacza to, że system z kluczem jednorazowym jest nieprzydatny w praktyce. Z powodzeniem można go wykorzystywać w komunikacji o niskim natężeniu, której bezpieczeństwo ma krytyczne znaczenie (tajne informacje wymieniane na wysokim szczeblu).
32
Podstawy kryptografii
1.3.5. Kamienie milowe kryptografii Ogromny wpływ na rozwój kryptografii miało wynalezienie telegrafu. Umożliwiło ono komunikację na niespotykaną dotąd skalę i wywołało dyskusję na temat poufności przekazywanych informacji. W obawie przed nieuczciwymi telegrafistami wiele osób opracowywało własne szyfry „nie do złamania”. Powstawały też liczne książki kodowe spełniające podwójne funkcje — oprócz ochrony tajnych informacji pozwalały one zmniejszyć koszt wysyłanych wiadomości. W książkach takich pojedyncze słowa kodowe odpowiadały bowiem całym zdaniom w tekście jawnym, przez co telegram stawał się krótszy. Telegraf zmienił również oblicze wojny, która teraz mogła być prowadzona na znacznie większym obszarze. Dowódca mógł kontrolować wiele rozproszonych oddziałów i reagować znacznie szybciej na zachodzące na polu walki zmiany. Tutaj szyfrowanie było jeszcze istotniejsze, gdyż przechwycenie meldunków przez wroga mogło kosztować życie wielu ludzi. Powstawały zatem liczne szyfry polowe, nieraz oparte na pomysłach kryptologów amatorów. Wbrew pozorom opracowanie dobrego szyfru polowego nie było prostym zadaniem. Musiał on bowiem być nie tylko trudny do złamania, ale również prosty w implementacji. Podczas bitwy nie było czasu na przeprowadzanie wielu skomplikowanych obliczeń i przekształceń, a nieodłączny w takiej sytuacji stres mógł być przyczyną błędów w szyfrowaniu. Dobry szyfr polowy musiał zatem być prosty i skuteczny zarazem. Kolejny rozkwit rozmaitych metod i technologii kryptograficznych przyniosła I wojna światowa. Oprócz telegrafu w powszechnym użyciu było już także radio, co zwiększało potencjał komunikacyjny, wymuszając jednocześnie większą dbałość o ochronę przekazywanych informacji. W tym ostatnim wypadku do podsłuchania przekazu nie trzeba już było uzyskiwać dostępu do linii telegraficznej — wystarczyło prowadzić nasłuch na odpowiedniej częstotliwości. Należało zatem liczyć się z faktem, iż każda wysłana w ten sposób informacja trafia w ręce wroga i może być odczytana, jeśli chroniący ją szyfr nie jest wystarczająco silny. Po obu stronach frontu pracowały więc całe sztaby ludzi prowadzących regularną kryptograficzną wojnę. Warto wspomnieć choćby brytyjski Pokój 40, którego członkowie, łamiąc niemieckie szyfry, otworzyli swoim wojskom drogę do wielu spektakularnych zwycięstw, czy przytoczoną we wstępie historię złamania szyfru ADFGX. Był to również okres wprowadzania licznych książek kodowych w komunikacji między oddziałami na froncie. Taki sposób zabezpieczania łączności miał jednak tę wadę, iż przechwycenie jednej z nich kompromitowało cały system. W związku z tym w razie groźby pojmania w pierwszej kolejności niszczono posiadane egzemplarze książek kodowych. Czasem jednak któraś z nich wpadała w ręce wroga, co powodowało konieczność opracowania i wysłania do wszystkich oddziałów nowych egzemplarzy. Tymczasem w przypadku dobrego systemu szyfrowania jedynym ryzykiem była utrata klucza. Powstawały zatem kolejne szyfry i kody, a kryptografia stawała się coraz bardziej popularna, jednak z naukowego punktu widzenia nie dokonano wówczas żadnego istotnego przełomu. Prawdziwie rewolucyjne zmiany przynieść miała dopiero kolejna wojna.
Rozdział 1. Historia kryptografii
33
1.4. Kryptografia II wojny światowej Niewiele osób zdaje sobie sprawę, że to właśnie potrzeby kryptoanalityków okresu II wojny światowej doprowadziły do zaprojektowania i skonstruowania pierwszego komputera. Przyczyna była dość pragmatyczna — łamanie szyfrów stało się bardzo skomplikowane obliczeniowo i konieczne stało się odciążenie kryptoanalityków z wykonywania żmudnych przeliczeń. Istnienie takiej maszyny przez długie lata objęte było tajemnicą wojskową, a oficjalnie za pierwszy komputer jeszcze do niedawna uznawano ENIAC. Duży wpływ na jej powstanie miał wkład polskich naukowców, ale — jak mawia pewien znany historyk — nie uprzedzajmy faktów.
1.4.1. Enigma i Colossus Wszystko zaczęło się od zastosowania przez niemiecką armię nowej wirnikowej maszyny szyfrującej — słynnej Enigmy (patrz rysunek 1.8). Rysunek 1.8. Enigma
Wywiad aliantów znał schemat zarówno cywilnej, jak i wojskowej wersji niemieckiej maszyny jeszcze przed wojną, jednak naukowcy uznali, że zastosowany w niej algorytm szyfrujący uniemożliwia złamanie szyfru. Istotnie, był on wyjątkowo trudny do kryptoanalizy, jednak głównym powodem niewielkiego zainteresowania Enigmą był panujący w krajach byłej koalicji po zakończeniu I wojny światowej brak poczucia zagrożenia ze strony Niemiec. Tymczasem Polska, która niedawno odzyskała niepodległość,
34
Podstawy kryptografii
obawiała się znacznego pogorszenia stosunków z Niemcami, zwłaszcza po dojściu do władzy Adolfa Hitlera. Założono więc biuro szyfrów i podjęto kroki w celu poznania systemu szyfrowania zachodnich sąsiadów.
1.4.1.1. Jak działała Enigma? Enigma była jedną z popularnych wówczas maszyn wirnikowych. Pierwszą taką maszynę skonstruował amerykański wynalazca Eduard Hugo Hebern. Jego wynalazek stanowiły dwie połączone elektryczne maszyny do pisania. Naciśnięcie klawisza w jednej z nich powodowało uruchomienie czcionki w drugiej. Połączenia były zmodyfikowane, a więc wstukiwane litery ulegały zamianie na inne, w rezultacie dając prosty szyfr monoalfabetyczny. Kable przebiegały przez wirniki, które można było obracać, zmieniając tym samym schemat połączeń. W swojej pierwszej maszynie Hebern zamontował pięć walców, każdy o 26 możliwych ustawieniach. Można je było obracać względem siebie, co dawało łącznie 265 możliwych schematów połączeń. Odpowiada to szyfrowi Vigenere’a z kluczem o długości około 12 000 000 znaków. Równolegle do Heberna podobną maszynę wynalazł holenderski uczony Hugo Aleksander Koch, a także niemiecki inżynier Artur Scherbius. Ten drugi zaproponował swój wynalazek armii niemieckiej już w 1918 roku, jednak wówczas nie spotkał się on z większym zainteresowaniem. Sytuacja zmieniła się po dojściu do władzy Hitlera. W ramach powszechnej modernizacji armii postanowiono wyposażyć niemieckie oddziały w maszyny szyfrujące. Wybór padł na maszynę Scherbiusa. Enigma oprócz układu wirników wyposażona była w tzw. walec odwracający. Dzięki niemu możliwe było wykorzystanie maszyny zarówno do szyfrowania, jak i do deszyfrowania wiadomości. Co ciekawe, o ile z praktycznego punktu widzenia była to niewątpliwa zaleta, o tyle kryptograficznie stanowiło to poważną wadę. Taka konstrukcja powoduje bowiem powstanie negatywnego wzorca, czyli innymi słowy, zbioru zasad ograniczających liczbę możliwych kryptogramów. W tym przypadku żadna litera tekstu jawnego nie mogła zostać zaszyfrowana jako ona sama (czyli A w A, B w B itd.). Wiedza o tym okazała się bardzo cenna dla polskich, a później angielskich kryptoanalityków. Wirniki Enigmy miały zdefiniowany układ połączeń, jednak można je było wkładać do urządzenia w różnej kolejności. Dodatkowo było ich więcej niż przeznaczonych na nie w maszynie gniazd (na początku wojny wirników było osiem). Każdy z nich można było ustawić na 26 sposobów. Podczas szyfrowania pierwszy z wirników obracał się o jedną pozycję z każdą szyfrowaną literą. Jego pełny obrót powodował przesunięcie o jedną pozycję drugiego wirnika, ten z kolei musiał wykonać pełny obrót, zanim o jedną pozycję przesunął się wirnik trzeci itd. Reasumując, o rodzaju zastosowanego przypisania decydowały następujące czynniki: wybór wirników szyfrujących, kolejność wirników w maszynie, początkowe pozycje wirników.
Rozdział 1. Historia kryptografii
35
Na rysunku 1.8 widać Enigmę z czterema gniazdami wirników. Po naciśnięciu klawisza odpowiadającego literze tekstu jawnego na znajdującym się powyżej panelu podświetlana była litera tekstu tajnego. Szyfrowanie oparte było na systemie kluczy dziennych determinujących ustawienie wirników. Często już pierwsza litera wiadomości powodowała przesunięcie nie tylko pierwszego, ale również drugiego, a nawet trzeciego wirnika. Szyfrant zapisywał tekst tajny, po czym przekazywał go radiotelegrafiście. Dla uzyskania dodatkowego bezpieczeństwa korzystano również z osobnych kluczy dla poszczególnych depesz. Klucz taki był szyfrowany kluczem dziennym na początku wiadomości. Dla pewności powtarzano go dwa razy. Odbiorca deszyfrował klucz depeszy, po czym zmieniał zgodnie z nim ustawienia maszyny i odczytywał przekaz. Wiedza na temat zasad stosowania kluczy dla poszczególnych wiadomości była kolejnym ułatwieniem dla polskich kryptoanalityków. Wiedzieli bowiem, iż na początku każdego kryptogramu znajduje się powtórzona dwukrotnie kombinacja liter, co pozwalało uzyskać cenne informacje na temat klucza dziennego oraz ustawienia wirników. Równie cenne okazało się lenistwo niemieckich szyfrantów, którzy wielokrotnie powtarzali ten sam klucz. Nie bez znaczenia była również niemiecka pedantyczność i sformalizowany charakter nadawanych depesz. Komunikaty zaczynały się i kończyły w identyczny sposób, zawierały również liczne powtórzenia samej treści. Innymi słowy, niemieccy szyfranci byli bardzo przewidywalni. Dawało to dodatkowe informacje na temat zawartych w depeszy wyrazów i zwrotów.
1.4.1.2. Cyklometr i Bomby W roku 1927 polskie służby celne przechwyciły jeden z egzemplarzy Enigmy wysłany do niemieckiej firmy w charakterze zaopatrzenia. Polacy zakupili później kolejne cywilne egzemplarze maszyny. Pomogły one w poznaniu zasad działania ich wojskowych odpowiedników. Rozpracowywaniem niemieckiego szyfru zajmowali się trzej naukowcy — Marian Rejewski, Henryk Zygalski i Jerzy Różycki. Dodatkową pomocą były dla nich dane udostępnione przez francuski wywiad. We Francji uznano Enigmę za niemożliwą do złamania, materiały te nie miały zatem dla francuskich naukowców większej wartości. Niemcy ciągle doskonalili Enigmę (na przykład dodając kolejne wirniki), przez co łamanie szyfru stawało się coraz trudniejsze. Przede wszystkim rosła liczba koniecznych obliczeń. W końcu polscy matematycy postanowili zaprojektować specjalną maszynę, której zadanie polegałoby wyłącznie na wyszukiwaniu typowych permutacji występujących podczas szyfrowania za pomocą niemieckiej maszyny. Nie była to więc maszyna szyfrująca ani deszyfrująca, a jedynie narzędzie wspomagające obliczenia wykonywane podczas łamania szyfru. Urządzeniu nadano nazwę Cyklometr. Szyfranci armii niemieckiej ustawicznie zwiększali złożoność algorytmu szyfrującego używanego w Enigmie i wkrótce Cyklometr nie był już w stanie wykonywać odpowiedniej liczby obliczeń. Dlatego skonstruowano nowe urządzenia obliczeniowe mające wspomagać kryptoanalizę szyfrów Enigmy. Urządzenia te nazwano Bombami.
36
Podstawy kryptografii
Polski wywiad udostępnił Anglikom wyniki badań nad Enigmą w roku 1939. Jeszcze przed rozpoczęciem wojny polscy naukowcy (wraz z ich Bombami) zostali przewiezieni do Anglii. Tam badania były kontynuowane w słynnym Bletchley Park. Niestety, z niejasnych przyczyn polscy kryptoanalitycy nie zostali dopuszczeni do prac prowadzonych w tym miejscu. Powierzano im mniej istotne zadania, a z istnienia wielkiego ośrodka kryptoanalitycznego nawet nie zdawali sobie sprawy.
1.4.1.3. Bletchley Park Centrum kryptoanalityczne w Bletchley Park powstało w wyniku poszerzenia personelu utworzonego w czasie I wojny światowej Pokoju 40. Początkowo zatrudniano tam głównie filologów i lingwistów, jednak po spektakularnym sukcesie trzech polskich matematyków postanowiono poszerzyć profil wykształcenia pracowników. Nowo zatrudnionych kierowano do Rządowej Szkoły Kodów i Szyfrów (GC&CS), a ta znajdowała się właśnie w ulokowanym w Buckinghamshire Bletchley Park. Znajdujący się tam niewielki pałacyk stał się brytyjskim centrum łamania szyfrów. W miarę przybywania nowego personelu w otaczających go ogrodach dobudowywano kolejne baraki i poszerzano specjalizację poszczególnych działów. Wkrótce podział ten w naturalny sposób wiązał się z przynależnością do określonego baraku. Na przykład barak 8 specjalizował się w kryptoanalizie depesz niemieckiej marynarki wojennej. Po opanowaniu polskich metod kryptoanalitycznych specjaliści z Bletchley Park szybko zaczęli opracowywać własne techniki kryptoanalityczne. Jednym z najwybitniejszych pracowników centrum był Alan Turing. Opierając się na analizie archiwalnych kryptogramów, doszedł on do wniosku, iż często możliwe jest przewidzenie fragmentów depesz na podstawie ogólnych informacji na ich temat. Jeśli kryptoanalityk wie, iż w tekście musi się pojawić dany wyraz, może z dużym prawdopodobieństwem ustalić jego pozycję, korzystając z zasady negatywnego wzorca. Jak pamiętamy, żadna litera nie mogła zostać przekształcona w wyniku szyfrowania w nią samą, co eliminuje bardzo wiele potencjalnych pozycji wyrazu w tekście. Kryptoanalityk przesuwał pasek z wyrazem lub zwrotem pod treścią kryptogramu, analizując powstające w pionie pary liter. Pozycję można było odrzucić, jeśli dawała się wyróżnić chociaż jedna para identycznych liter. Spójrzmy na rysunek 1.9. Kryptoanalityk zakłada w tym przypadku, iż gdzieś w kryptogramie znajduje się słowo „angriff” (niem. atak). Przykłada zatem pasek z tym wyrazem pod kryptogramem. W pozycji początkowej pojawia się para liter F. Można ją zatem odrzucić, gdyż jak pamiętamy, żadna litera nie mogła zostać zaszyfrowana jako ona sama. Po pierwszym przesunięciu pojawia się z kolei para liter G. Oznacza to, iż również na tej pozycji nie może się znajdować szukane słowo. Kolejne przesunięcie daje aż dwie pary takich samych liter (A i I). Dopiero za czwartym razem udaje się znaleźć miejsce, gdzie (teoretycznie) mógłby się znajdować poszukiwany wyraz. Kolejne dwa przesunięcia również nie dadzą pozytywnego wyniku ze względu na znajdującą się na pozycji jedenastej w kryptogramie literę F, jednak przesunięcie szóste ujawni następną możliwą pozycję wyrazu w kryptogramie (nie pojawią się żadne pary takich samych liter).
Rozdział 1. Historia kryptografii
37
Rysunek 1.9. Kryptoanaliza Enigmy oparta na negatywnym wzorcu
Turing udoskonalił również Bomby, przystosowując je do zmieniającej się struktury niemieckiego szyfru i wprowadzając własne poprawki dotyczące zarówno efektywności działania, jak i zastosowanych algorytmów. Na dobrą sprawę skonstruował on więc zupełnie nowe urządzenia, choć oparte na pomyśle polskiego kryptoanalityka. Maszyny wykorzystywano do poszukiwania ustawień wirników, które przekształcałyby podany wyraz w określony kryptogram. Ogólnie więc metodyka łamania Enigmy opierała się na wyszukiwaniu prawdopodobnych wyrazów w tekście, aby następnie ustalić wartości klucza na podstawie tak uzyskanej relacji „tekst jawny — kryptogram”. Dzięki przeprowadzonej przez Turinga analizie niemieckiego szyfru oraz udoskonalonym przez niego Bombom możliwe było dalsze odczytywanie niemieckich przekazów radiowych mimo rosnącej złożoności stosowanych szyfrów. Warto wspomnieć, iż tak naprawdę w niemieckiej armii funkcjonowało kilka różnych kryptosystemów — inny szyfr miała na przykład marynarka, a nieco inny — siły lądowe. Stosowane były inne wirniki i modele Enigmy, a i sami szyfranci cechowali się różnym stopniem profesjonalizmu. Tym niemniej z większym lub mniejszym trudem pracownicy Bletchley Park dzień w dzień odkrywali przed alianckim dowództwem zamiary i sekrety niemieckiej armii.
1.4.1.4. Colossus W Bletchley Park nie zajmowano się jedynie Enigmą. Był to co prawda najpopularniejszy, ale nie jedyny szyfr niemiecki. Do wymiany wiadomości między najwyższymi rangą wojskowymi Trzeciej Rzeszy używano tzw. przystawki szyfrującej. Było to urządzenie opracowane w firmie Lorenz. Wykorzystywało ono kod opracowany przez francuskiego wynalazcę J.M.E. Baudota. W kodzie tym każdy znak reprezentowany był w systemie dwójkowym z wykorzystaniem taśmy perforowanej. Jedynce odpowiadała dziura w taśmie, a zeru — jej brak. Przystawka odczytywała jednocześnie dwie
38
Podstawy kryptografii
taśmy (jedna zawierała tekst jawny, a druga klucz), wykonując na odczytanych wartościach operację dodawania bez przenoszenia reszt (innymi słowy, dodawania modulo 2 — patrz rozdział 2.). Wynik zapisywany był na trzeciej taśmie. Ten system szyfrowania był o wiele bardziej wyszukany niż stosowany w Enigmie, jednak i tutaj Anglicy odnieśli sukces. Po raz kolejny trzeba było wykorzystać maszyny do przeprowadzania niezbędnych obliczeń. W tym wypadku Bomby już nie wystarczały. Należało skonstruować nowe urządzenie, operujące na podobnej zasadzie jak niemiecka przystawka. Tak powstał Colossus. Colossus opierał się na teoretycznym modelu opracowanym przez Alana Turinga. W odróżnieniu od Bomb, które były urządzeniami elektromechanicznymi, był urządzeniem elektronicznym. Zawierał półtora tysiąca lamp (dwa i pół tysiąca w późniejszych modelach) i potrafił zapamiętywać dane do dalszego przetwarzania. Czyniło to z niego pierwsze urządzenie, które można nazwać komputerem. Pierwszy model Colossusa oddano do użytku w roku 1943, a więc trzy lata przed słynnym komputerem ENIAC. Ponieważ jednak jego istnienie owiane było tajemnicą wojskową, świat dowiedział się o nim dopiero w roku 1975, po odtajnieniu dotyczących projektu akt. Wkład alianckich kryptoanalityków w przebieg II wojny światowej był ogromny. Niemcy nie wierzyli, iż można złamać szyfr Enigmy, a tymczasem każdego dnia już po kilku godzinach od zmiany klucza pracownicy Bletchley Park odczytywali pierwsze kryptogramy i przesyłali je do dowództwa. Możliwość poznania zamiarów wroga była ogromnym atutem, o niczym jednak nie przesądzała. Podobnie jak w całej historii tajemnego pisma z odczytanego szyfru należało jeszcze zrobić odpowiedni użytek. Wiedzy tak zdobytej nie można było też nadużywać, by nie wzbudzić u Niemców podejrzeń, że ich system został skompromitowany. Przesadą byłoby twierdzić, iż to kryptoanalitycy wygrali wojnę z Trzecią Rzeszą. Niemniej jednak gdyby nie ludzie tacy jak Rejewski czy Turing, z pewnością potrwałaby ona kilka lat dłużej. Hitler zdążyłby użyć pocisków V1 i V2, zginęłyby również kolejne setki tysięcy ludzi. Bardzo możliwe, iż II wojna światowa zakończyłaby się dopiero po zrzuceniu bomb atomowych na Niemcy.
1.5. Era komputerów Zastosowanie komputerów zasadniczo zmieniło dotychczasowe sposoby szyfrowania. Po pierwsze, proces szyfrowania przebiegał teraz szybciej i mógł się opierać na znacznie bardziej skomplikowanym algorytmie. Należy pamiętać, że mechaniczne maszyny szyfrujące ograniczały złożoność algorytmu poprzez samą swoją konstrukcję. W przypadku komputerów ograniczenie to znikało, ponieważ można było zasymulować dowolnie skomplikowane urządzenie. Innymi słowy, teraz można było szyfrować wiadomości przy użyciu „wirtualnych” szyfratorów, których fizyczna konstrukcja byłaby niemożliwa do wykonania.
Rozdział 1. Historia kryptografii
39
Ostatnia, najważniejsza zmiana, jaka nastąpiła dzięki zastosowaniu komputerów, dotyczyła poziomu szyfrowania. Do tej pory odbywało się ono na poziomie liter. Oparte na elektronicznych przełącznikach maszyny operowały jedynie na liczbach dwójkowych. Spowodowało to przejście z szyfrowania liter i znaków na szyfrowanie ciągów zer i jedynek, które w systemie komputerowym służą do zapisu danych. Wcześniej należało ustalić reguły konwersji znanych nam znaków na system binarny. Stąd też w latach sześćdziesiątych opracowano kod ASCII. Liczby w kodzie ASCII można z łatwością przedstawić w postaci binarnej, co umożliwia ich zapis w komputerze. Po zapisaniu wiadomości w postaci dwójkowej można przejść do szyfrowania, które zasadniczo nie różni się od procesu szyfrowania w erze przedkomputerowej. Nadal podstawową metodą jest przestawianie elementów zapisanej wiadomości według określonego klucza i algorytmu, tak by dla osoby postronnej nie miały one większego sensu — z tą różnicą, że tutaj podstawowym elementem, na którym dokonuje się operacji szyfrowania, jest pojedynczy bit, a nie znak, jak to miało miejsce wcześniej. Jak wiadomo, aby zapisać jeden znak, potrzeba jednego bajta, czyli ośmiu bitów. ASCII (skrót od ang. American Standard Code for Information Interchange) jest zestawem kodów, standardowo z zakresu 0 – 127 (dziesiętnie), przyporządkowanych przez ANSI (Amerykański Instytut ds. Standardów) poszczególnym znakom alfanumerycznym (litery alfabetu angielskiego i cyfry), znakom pisarskim oraz sterującym (typu nowa linia). Na przykład litera „a” jest zakodowana przy użyciu liczby 97. Ponieważ ASCII jest standardem 7-bitowym, a większość komputerów operuje na wielkościach 8-bitowych (bajtach), pojawił się również rozszerzony kod ASCII. Dzięki niemu możliwe stało się wprowadzenie znaków narodowych do stosowanego na danym komputerze alfabetu. W związku z tym obecnie wykorzystywane w ramach kodu ASCII znaki mogą się różnić w zależności od komputera. Aby uniknąć tego typu zróżnicowania, opracowano standard UNICODE składający się z 65 536 znaków, dzięki czemu możliwe jest definiowanie znaków w wielu różnych językach.
1.5.1. DES Kryptologia komputerowa najszybciej rozwijała się w Stanach Zjednoczonych. Powstało tam wiele systemów kryptograficznych, jednak ze względu na specyfikę amerykańskiego prawa wkrótce pojawiła się konieczność ustalenia powszechnie obowiązującego standardu szyfrowania. W 1973 roku z propozycją takiego uniwersalnego systemu o nazwie Demon wystąpił Horst Feistel, niemiecki emigrant, który przybył do USA w 1934 roku. Nazwa wywodziła się od słowa Demonstration, a jej skrócona forma spowodowana była ograniczoną długością nazw plików w używanym przez twórcę standardu systemie. Później Demon został „przechrzczony” na Lucyfera (ang. Lucipher), co stanowiło swoistą grę słów (angielskie słowo cipher oznacza szyfr). Lucyfer był szyfrem blokowym, a więc jako dane wejściowe przyjmował bloki danych o ustalonej długości, zaś na wyjściu podawał bloki kryptogramu o takiej samej długości. Innymi słowy, podstawową jednostką przetwarzania nie były tu pojedyncze bity czy bajty, a całe bloki danych (patrz podrozdział 3.2). Feistel utworzył kilka wersji tego szyfru; najbardziej znana opierała się na kluczu 128-bitowym, niezwykle odpornym na ataki metodą pełnego przeglądu (sprawdzania wszystkich kluczy po kolei — patrz podrozdział 3.1).
40
Podstawy kryptografii
Aby Lucyfer został przyjęty jako standard, musiał najpierw zostać przedłożony Narodowej Agencji Bezpieczeństwa (NSA). Organizacja ta starała się cały czas kontrolować pojawiające się na rynku narzędzia kryptograficzne. Jej głównym celem było ograniczanie tych zabezpieczeń w taki sposób, aby mogły być złamane przez rządowych kryptoanalityków, gdyby zachodziło podejrzenie, że zabezpieczone nimi dane mogą stanowić zagrożenie dla bezpieczeństwa państwa. Podobnie było w przypadku kryptosystemu Feistela. Przestrzeń kluczy systemu Feistela została przez NSA bardzo ograniczona — długość klucza zmniejszono ze 128 do 56 bitów. Każdy kolejny bit długości klucza powoduje podwojenie tej przestrzeni, a tym samym podwojenie bezpieczeństwa systemu, przynajmniej w odniesieniu do ataku wyczerpującego (patrz podrozdział 3.1). Wynika z tego, że skrócenie klucza o jeden bit implikuje 50-procentowy spadek bezpieczeństwa szyfru (w tym kontekście można sobie wyobrazić, jak drastyczny spadek bezpieczeństwa powoduje redukcja klucza ze 128 do 56 bitów). System ten nadal był wystarczająco bezpieczny dla sektora prywatnego, jednak ograniczenie wprowadzone przez NSA spotkało się ze zdecydowanym sprzeciwem pozarządowych środowisk kryptograficznych, które zdawały sobie sprawę z możliwości złamania tego szyfru przez agencję. Ostatecznie jednak pomimo licznych protestów 23 listopada 1976 roku 56-bitowa wersja szyfru Lucyfer Feistela została oficjalnie przyjęta jako standard szyfrowania danych DES (skrót od ang. Data Encryption Standard).
1.5.2. Narodziny kryptografii asymetrycznej Jedną z osób, które dążyły do przełamania kryptograficznego monopolu NSA, był Whit Diffie. Diffiemu marzył się system kryptograficzny wolny od problemu dystrybucji klucza. Jego koncepcja opierała się na założeniu dotąd uważanym za technicznie niemożliwe do zrealizowania — klucz szyfrujący miał być powszechnie dostępny. Jedną z niepodważalnych zasad kryptografii była zasada tajności tego klucza i używania go zarówno do szyfrowania, jak i deszyfrowania wiadomości. Diffie zaprojektował natomiast system oparty na dwóch kluczach szyfrujących. Para takich kluczy miała być tworzona dla każdego użytkownika jego systemu. Jeden z nich (klucz publiczny) miał służyć do szyfrowania wiadomości wysyłanych do użytkownika i miał być powszechnie dostępny. Drugi (klucz tajny) miał być wykorzystywany do dekryptażu wiadomości zaszyfrowanych przy użyciu pierwszego klucza. Za pomocą drugiego klucza można było również szyfrować wiadomości. W takim przypadku dekryptaż miał umożliwiać klucz publiczny. Dzięki takiej kombinacji możliwe stawało się uwierzytelnianie nadawcy wiadomości elektronicznej, ponieważ tylko osoba posiadająca klucz tajny mogła zaszyfrować dokument tak, aby dało się go odczytać przy użyciu klucza publicznego. Zaszyfrowanie wiadomości kluczem prywatnym stanowiło więc jednocześnie formę elektronicznego podpisu. Sama teoria kluczy nie wystarczała i konieczne stało się opracowanie odpowiednich podstaw matematycznych, możliwych do zaimplementowania w językach programowania. Problem ten rozwiązał współpracownik Whita Diffiego — Marty Hellman. Hellman i Diffie wspólnie opracowali system matematyczny oparty na funkcji jednokierunkowej bazującej na tzw. logarytmowaniu dyskretnym (patrz rozdział 2.). System ten znany jest obecnie jako algorytm Diffiego-Hellmana.
Rozdział 1. Historia kryptografii
41
System Diffiego i Hellmana nie tylko rozwiązał problem dystrybucji klucza, ale również zapoczątkował technologię elektronicznego uwierzytelniania użytkowników. Jego metoda rodzi bowiem jeszcze jedną istotną implikację, którą jest niemożliwość wyparcia się swojego cyfrowego podpisu. Skoro wiadomo, że technicznie niemożliwe jest, aby osoba nieznająca tajnego klucza wygenerowała poprawny podpis, jego właściciel nie może się wyprzeć swojego udziału w poświadczonej nim transakcji. Ta właściwość stała się podstawą technologii podpisu elektronicznego.
1.5.3. RSA Idea kryptosystemu z kluczem publicznym została rozwinięta przez trzech naukowców z uniwersytetu w Stanford — Rona Rivesta, Adi Shamira i Leonarda Adlemana. Podobnie jak Diffie i Hellman poświęcili oni dużo czasu na znalezienie matematycznego wzoru, który pozwalałby zrealizować ideę szyfrowania przy użyciu pary kluczy w praktyce. Przełomowego odkrycia podczas tych badań dokonał Rivest. Polegało ono na zastąpieniu algorytmu Diffiego-Hellmana jego własnym systemem obliczeń. Koncepcja Rivesta opiera się na problemie rozkładu dużych liczb na czynniki pierwsze. Klucz publiczny generowany jest przez pomnożenie przez siebie dwóch dużych, losowo wybranych liczb pierwszych. Następnie wybierana jest kolejna duża liczba o określonych właściwościach — stanowi ona klucz szyfrujący. Klucz publiczny tworzony jest na podstawie klucza szyfrowania oraz wspomnianego iloczynu liczb pierwszych. Klucz prywatny można łatwo obliczyć, jeśli zna się liczby pierwsze tworzące iloczyn zastosowany przy tworzeniu klucza publicznego. Są one znane właścicielowi pary kluczy, natomiast kryptoanalityk może je uzyskać jedynie dzięki rozwiązaniu problemu faktoryzacji dużych liczb. Matematyczne szczegóły tej metody opisane zostały w rozdziale 2. Algorytm opracowany przez Rivesta i jego współpracowników został wkrótce opatentowany pod nazwą RSA (od pierwszych liter nazwisk wynalazców). Agencja Bezpieczeństwa Narodowego próbowała zapobiec upowszechnieniu się tego standardu szyfrowania. Zaczęto wywierać naciski na NIST (skrót od ang. National Institute of Standards and Technology), aby przyjął jako obowiązujący w USA standard program DSA (skrót od ang. Digital Signature Algorithm — patrz dodatek B). W wielu miejscach DSA powielał rozwiązania z RSA, jednak był systemem znacznie słabszym: „Pod względem czysto technicznym było jasne, że DSA był gorszy od RSA. Algorytm ten był, jak to wyłożył jeden z obserwatorów, »dziwacznym standardem«, o wiele wolniejszym od systemu RSA, jeśli chodzi o weryfikowanie podpisów (chociaż szybszym w podpisywaniu wiadomości), trudniejszym do wdrożenia i bardziej skomplikowanym. I nie umożliwiał szyfrowania. System opracowany przez rząd oferował jednak pewną korzyść w porównaniu z RSA […]. Był bezpłatny”4. Brak możliwości szyfrowania był poważną wadą techniczną systemu DSA, jednak poprzez rozprowadzanie go w charakterze darmowego oprogramowania NSA ustanowiła silną konkurencję dla standardu RSA (tym bardziej że DSA stał się ustawowo ustalonym standardem). 4
Levy S., Rewolucja w kryptografii, Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
42
Podstawy kryptografii
1.5.4. PGP Działalność NSA zmierzająca do ograniczenia dostępu do kryptografii powodowała konflikt między rządem a kryptoanalitykami sektora publicznego. Ci drudzy szukali sposobu na wprowadzenie kryptografii do powszechnego użytku. Zdawali sobie sprawę, że upowszechnienie komputerów, a zwłaszcza internetu, znacznie ograniczy prywatność zwykłych użytkowników, jeśli nie zagwarantuje się im odpowiednich zabezpieczeń. Z tego powodu Phil Zimmerman, programista z Florydy, rozpoczął projektowanie własnego systemu kryptograficznego. Nadał mu nazwę PGP (skrót od ang. Pretty Good Privacy — całkiem niezła prywatność). Początkowo miał to być kolejny komercyjny pakiet szyfrujący. Zamiary Zimmermana zmienił projekt opracowanej w Komisji Prawnej Senatu ustawy nr 266 z 24 stycznia 1991 roku. Zgodnie z nią dostawcy usług komunikacji elektronicznej, a także wytwórcy sprzętu komunikacyjnego powinni zapewnić rządowi możliwość uzyskania jawnej treści komunikacji między użytkownikami, jeśli uzyska on do tego upoważnienie prawne. Zimmerman zdał sobie sprawę, że po wejściu ustawy w życie nie będzie już mógł wprowadzić na rynek swojego programu. Postanowił więc udostępnić go jak największej liczbie osób, zanim posługiwanie się nim przestanie być prawnie dozwolone. W tym celu postanowił wykorzystać internet. Skontaktował się ze swoim przyjacielem, Kellym Goenem, powierzając mu zadanie umieszczenia PGP 1.0 na powszechnie dostępnych sieciowych witrynach znajdujących się w USA. Wyznaczonego dnia Goen przy użyciu telefonów publicznych, laptopa i telefonu komórkowego wprowadził PGP do internetowych serwerów plików. Mógł go stamtąd ściągnąć każdy, kto miał dostęp do internetu, nie tylko w USA. Phil Zimmerman zagwarantował prywatność każdemu, kto miał dostęp do jego programu. Ustawa 266 ostatecznie nie została wprowadzona w życie ze względu na protesty środowisk walczących o swobody obywatelskie. Była ona także niemożliwa do wyegzekwowania ze względu na powszechną dostępność pakietu PGP. Sam Zimmerman natomiast został pozwany do sądu przez RSA Data Security z powodu naruszenia praw patentowych algorytmu RSA (Zimmerman użył go w swoim programie, nie wiedząc, że RSA jest objęty ochroną patentową). Firma domagała się od niego wycofania PGP. Ostatecznie doszło do ugody, w myśl której autor PGP 1.0 zaprzestał dalszej dystrybucji swojego programu, a firma nie wniosła oskarżenia. W 1993 roku Zimmerman został oskarżony o złamanie prawa przez rząd USA. Zdaniem FBI, udostępniając publicznie silny system kryptograficzny, Zimmerman dostarczył wrogim państwom oraz terrorystom narzędzie do walki z USA. Dochodzenie umorzono po trzech latach. Zresztą wydanie wyroku skazującego i tak nic by już nie zmieniło. Wycofanie PGP z powszechnego obiegu było niemożliwe, tak jak niemożliwe jest pełne kontrolowanie przepływu informacji w internecie. Prawne restrykcje wobec twórców kryptograficznego oprogramowania były dość częstym środkiem stosowanym przez rząd USA w celu ograniczenia dostępu do kryptografii. Eksport oprogramowania z zakresu tzw. silnej kryptografii (opartej na większej niż ustalona długości klucza) był prawnie zakazany i traktowany na równi z nielegalnym eksportem broni. Sytuacja ta zmieniła się dopiero na początku obecnego stulecia,
Rozdział 1. Historia kryptografii
43
kiedy okazało się, że z uwagi na gwałtowny rozwój internetu niemożliwa jest dalsza kontrola nad rozprzestrzenianiem się oprogramowania, a tego typu ograniczenia osłabiają tylko gospodarkę USA. Firmy amerykańskie traciły zagranicznych klientów, gdyż nie były w stanie zagwarantować im takiego samego bezpieczeństwa danych jak firmy spoza USA, nieobjęte ograniczeniami co do długości klucza. Należy zauważyć, że posunięcie Zimmermana oprócz niewątpliwych korzyści dla zwykłych użytkowników sieci komputerowych mogło również spowodować znaczne szkody. Teraz bowiem każdy mógł zaszyfrować swoje komunikaty w ten sposób, że nikt nie byłby w stanie ich odczytać. Innymi słowy, PGP umożliwia szyfrowanie korespondencji również terrorystom, miłośnikom dziecięcej pornografii i każdemu, kto wykorzystuje komputer do działalności przestępczej. Zimmerman zdawał sobie z tego sprawę, uznał jednak, że upowszechnienie pakietu będzie „mniejszym złem”. Wkrótce po udostępnieniu PGP program został poddany szczegółowej analizie przez grono specjalistów od kryptografii. Okazało się, że posiada on pewne wady ograniczające jego bezpieczeństwo. Postanowiono więc stworzyć nową wersję programu — PGP 2.0. Zastosowane w niej rozwiązania były stosowane także w późniejszych wersjach. W roku 2010 PGP zostało przejęte za ponad 300 milionów dolarów przez firmę Symantec i zintegrowane z oprogramowaniem szyfrującym firmy.
1.5.5. Ujawniona tajemnica Wart wspomnienia jest fakt, że technika szyfrowania asymetrycznego została opracowana już w 1969 roku przez Jamesa Ellisa, pracownika angielskiego GCHQ (skrót od ang. Government Communication Headquarters — głównej rządowej kwatery łączności), jednak nie mógł on jej upowszechnić ze względu na obowiązującą go tajemnicę państwową. Efekty jego pracy zostały ujawnione dopiero niedawno, dlatego też informacje o nich można znaleźć jedynie w najnowszych opracowaniach z dziedziny kryptografii. Pomysł Ellisa był bardzo podobny do systemu Whita Diffiego. Również opierał się on na idei pary kluczy szyfrujących. Podobnie jak Diffie, również Ellis stworzył teoretyczne fundamenty systemu szyfrowania asymetrycznego i także nie był w stanie samodzielnie opracować wzoru matematycznego, na podstawie którego taki system mógłby funkcjonować. Przez kilka następnych lat wielu matematyków GCHQ zmagało się z tym problemem, jednak żaden nie znalazł rozwiązania. Sytuacja zmieniła się, kiedy zadanie to powierzono nowo zatrudnionemu matematykowi, Cliffordowi Cocksowi. Klucz publiczny opracowany przez Cocksa opierał się, podobnie jak w systemie RSA, na iloczynie dwóch dużych liczb pierwszych. Iloczyn ten miał być dostępny dla każdego, kto chciał wysłać zaszyfrowaną wiadomość do odbiorcy. Cocks opracował następnie formułę matematyczną, dzięki której wiadomość zaszyfrowana przy użyciu klucza publicznego mogła być odszyfrowana jedynie pod warunkiem znajomości oryginalnych liczb pierwszych. Formuła zastosowana przez angielskiego matematyka była niemal identyczna z tą, którą zastosował Ron Rivest. Innymi słowy, Ellis i Cocks opracowali system, który trzy lata później został ponownie odkryty przez trzech matematyków z MIT i wprowadzony do powszechnego użytku jako RSA.
44
Podstawy kryptografii
1.5.6. Upowszechnienie kryptografii Spopularyzowanie kryptografii asymetrycznej doprowadziło do przełamania kryptologicznego monopolu NSA. Kryptografia cieszyła się coraz większym zainteresowaniem w sektorze publicznym, co utrudniało wszelkie próby ograniczania dostępu do opartych na niej zabezpieczeń. Mimo to agencja nadal starała się kontrolować rozwój badań nad nowymi technologiami z tego zakresu. Naukowcy, którzy nie pracowali dla NSA, zobowiązani byli przedstawiać swoje artykuły przed ich publikacją specjalnie w tym celu utworzonej komisji. Jej zadaniem było wyławianie treści potencjalnie niebezpiecznych dla bezpieczeństwa narodowego. Na tym etapie była to już jednak walka skazana na niepowodzenie. Na początku lat osiemdziesiątych zainaugurowano serię konwentów o nazwie Crypto, które odtąd odbywały się corocznie. Spotykali się na nich kryptolodzy z całego świata w celu wymiany doświadczeń i wyznaczania nowych kierunków badań. O ile jednak w tym przypadku NSA mogła się jeszcze pokusić o próby wpływania na prezentowane treści, o tyle prężnie rozwijający się internet stanowił medium, którego nawet agencja nie mogła sobie podporządkować. Raz zamieszczony w sieci artykuł lub program był ściągany i kopiowany przez niezliczone rzesze użytkowników, co uniemożliwiało jego wycofanie, nawet gdyby udało się przekonać do tego samego autora. Najlepszym przykładem jest tu PGP. Solą w oku NSA była w tamtym czasie grupa ludzi określających się jako Szyfropunki. Pisali oni programy, artykuły i opracowania z dziedziny kryptografii, a następnie udostępniali je w sieci. Oczywiście nikt tu nie pytał NSA o zgodę. Grupka ta doskonale odzwierciedlała nastroje panujące w amerykańskim społeczeństwie, coraz bardziej wzburzonym rządowymi próbami kontrolowania przepływu informacji i ingerowania w prywatność obywateli. Wkrótce więc kryptograficzni anarchiści stali się ulubieńcami mediów i symbolem walki o swobody obywatelskie. Kolejnym etapem kryptograficznych zmagań było zapoczątkowanie przez NSA w 1993 roku projektu EES (skrót od ang. Escrowed Encryption Standard) opartego na chipach Capstone i Clipper. Miały to być powszechnie dostępne urządzenia umożliwiające szyfrowany przekaz danych. Capstone służyć miał posiadaczom komputerów przenośnych, natomiast Clipper był przeznaczony do montowania w telefonach i faksach. Każde z urządzeń miało na trwałe zaimplementowany klucz szyfrowania, do którego służby rządowe mogły uzyskać dostęp, gdyby zachodziło podejrzenie, iż właściciel chipu prowadzi działalność niezgodną z prawem. Tak przynajmniej wyglądało to w teorii, nie da się jednak ukryć, że deponowanie kluczy dawało organizacjom rządowym ogromne pole do nadużyć. W rezultacie nie trzeba było długo czekać na protesty środowisk liberalnych. Były one tym bardziej uzasadnione, iż zastosowany w obu chipach algorytm Skipjack opracowany został w NSA i dane na jego temat były tajne. W rezultacie agencja miała monopol na produkcję obu urządzeń, a to budziło uzasadnione poniekąd podejrzenia co do prawdziwych intencji rządu. Ostatecznie NSA zdecydowała się upublicznić algorytm, jednak to jedynie pogorszyło sprawę. Jego kryptoanaliza przeprowadzona w środowiskach prywatnych wykazała bowiem, iż po pierwsze, nie jest on tak mocny jak AES, a po drugie, możliwe jest wykorzystanie go bez deponowania kluczy. Znacznie osłabiło to rozwój nowej technologii i ostatecznie udaremniło jej upowszechnienie na większą skalę.
Rozdział 1. Historia kryptografii
45
Obecnie każdy może bez przeszkód korzystać z dobrodziejstw kryptografii. Nie jest ona domeną tylko i wyłącznie organizacji rządowych, choć z całą pewnością dysponują one pod tym względem znacznie większym potencjałem z uwagi na to, że skupiają najlepszych fachowców i inwestują w badania nad nowymi technologiami. Trudno powiedzieć, jakie dokładnie są możliwości agencji takich jak NSA w odniesieniu do kryptografii, z pewnością jednak możliwości „zwykłego śmiertelnika” zwiększyły się w ciągu ostatniego półwiecza niepomiernie.
46
Podstawy kryptografii
Rozdział 2.
Matematyczne podstawy kryptografii Problem odróżniania liczb pierwszych od liczb złożonych i rozkładania tych ostatnich na czynniki pierwsze jest znany jako jeden z najważniejszych i najbardziej użytecznych w całej arytmetyce… Dostojeństwo nauki wymaga zgłębiania wszelkich możliwych środków do rozwiązania tego problemu — tak eleganckiego i sławnego. Carl Friedrich Gauss Bóg stworzył liczby całkowite. Cała reszta jest dziełem człowieka. Leopold Kronecker Tysiące mało prawdopodobnych zagrożeń sumuje się w zagrożenie bardzo prawdopodobne. Bruce Schneier Kryptografia od samego początku nierozerwalnie związana była z matematyką. Pierwsze przypadki kryptoanalizy opierały się na statystyce, a każdy szyfr zapisać można w formie działania matematycznego. Od momentu wprowadzenia do kryptologii pierwszych maszyn liczących, a później komputerów, konieczne stało się przełożenie pojęć i metod stosowanych w tej dziedzinie na język matematyki. Umożliwiło to zaprogramowanie urządzeń tak, aby wykonywały obliczenia służące zarówno kryptoanalizie, jak i kryptografii. Były to z reguły działania matematyczne, których wykonanie zajęłoby człowiekowi nieporównywalnie więcej czasu. Główną przyczyną powstania tych urządzeń była zatem potrzeba przyspieszenia obliczeń wykorzystywanych podczas badań kryptoanalitycznych. Obecnie kryptolodzy dysponują już całą „biblioteką” matematycznych pojęć, wzorów i definicji.
48
Podstawy kryptografii
2.1. Podstawowe pojęcia W tym rozdziale wprowadzam elementarne pojęcia i definicje matematyczne stosowane w kryptografii. Ich znajomość jest niezbędna do zrozumienia zasad działania algorytmów stosowanych w praktyce, mocnych i słabych stron tychże algorytmów, a także sposobów oceny i weryfikacji gotowych rozwiązań.
2.1.1. Słownik tekstu jawnego Zbiór znaków V, którego używamy do tworzenia wyrazów tekstu jawnego, nazywamy zbiorem znaków tekstu jawnego lub — zastępczo — słownikiem tekstu jawnego. Z kolei zbiór znaków W używany do zapisania kryptogramu (zwanego też tekstem kodowanym) stanowi słownik tekstu zaszyfrowanego lub zbiór znaków tekstu zaszyfrowanego. Zawartość zbiorów jest różna w zależności od typu szyfru. Mogą się one składać z liter alfabetów, kombinacji cyfr lub ideogramów. Opisane zbiory mogą być równe, mieć część wspólną lub być rozłączne. Najłatwiej zrozumieć to na podstawie przedstawionego w rozdziale 1. szyfru Cezara. Szyfr ten przyporządkowywał każdej literze tekstu jawnego literę położoną w alfabecie o trzy miejsca dalej. W tym przypadku oba wymienione zbiory są równe zbiorowi liter alfabetu. W związku z tym są również identyczne. W przypadku szyfru, który każdej literze tekstu jawnego przyporządkowuje nietypowy symbol (na przykład #, $, % itd.), oba zbiory są rozłączne. Z częścią wspólną mielibyśmy do czynienia wówczas, gdyby w alfabecie szyfrowym oprócz liter stosowanych również w tekście jawnym używano nietypowych symboli w funkcji homofonów. Opisaną zależność przedstawia rysunek 2.1.
2.1.2. Przestrzeń tekstu Oznaczmy teraz zbiory słów tekstu jawnego i tekstu tajnego odpowiednio jako V* i W*. W zbiorach tych zawarte są wszystkie wyrazy, które można utworzyć, posługując się alfabetami V oraz W. Przyjęto tu również oznaczenie Z(n) jako symbol zbioru wszystkich słów o długości nie większej niż n. Określa to matematyczny wzór: Z (n) { } Z 1 Z 2 Z 3 ... Z n
gdzie:
— słowo puste, Z1, Z2, …, Zn — zbiory słów o długości 1, 2, …, n liter. Zbiory V* oraz W* bywają również nazywane odpowiednio przestrzenią tekstu jawnego i przestrzenią tekstu tajnego.
Rozdział 2. Matematyczne podstawy kryptografii
49
Rysunek 2.1. Zbiory tekstu jawnego i szyfrogramu
2.1.3. Iloczyn kartezjański „Niech A i B oznaczają pewne zbiory. Iloczynem kartezjańskim A×B nazywamy zbiór wszystkich par (a, b) takich, że a A oraz b B. Za pomocą określonych uprzednio symboli definicję iloczynu kartezjańskiego zapisać możemy w następujący sposób: A B {( a, b) : a A, b B}
Możemy, oczywiście, rozpatrywać iloczyn kartezjański jakiegoś zbioru A przez ten sam zbiór A, tzn. A×A. Będzie to zbiór wszystkich par (a’, a’’) takich, że a’ A oraz a’’ A. Przez relację R w zbiorze A rozumiemy dowolny podzbiór iloczynu kartezjańskiego A×A. Zapisy (a’, a’’) R oraz a’ R a’’ uważamy za równoważne”1. Powyższa definicja ma szczególne znaczenie z punktu widzenia kryptografii. Szyfrowanie definiuje się bowiem jako relację R:, opartą na zbiorach V* oraz W*, natomiast deszyfrowanie oparte jest na odwrotności tej relacji, co wyrażamy zapisem: 1
Krysicki W., Włodarski L., Analiza matematyczna w zadaniach — część I, Wydawnictwo Naukowe PWN, Warszawa 2001.
50
Podstawy kryptografii
R : V * W * — szyfrowanie, R 1 : V * W * — deszyfrowanie.
Mówimy, że relacja jest jednoznaczna, jeśli każdemu elementowi zbioru A przyporządkowuje dokładnie jeden element zbioru B: ( x z) ( y z) ( x y)
Deszyfrowanie musi być relacją jednoznaczną, gdyż w przeciwnym wypadku odbiorca nie byłby w stanie odszyfrować otrzymanej wiadomości. Szyfrowanie nie musi spełniać tego warunku, jeśli jednak go spełnia, mówimy, że jest ono funkcyjne. Wynika to z definicji funkcji matematycznej. Funkcją matematyczną nazywamy takie odwzorowanie zbioru X na zbiór Y, które każdemu elementowi ze zbioru X przyporządkowuje dokładnie jeden element ze zbioru Y.
Aby ułatwić zrozumienie powyższych definicji, powrócę do omawianego wcześniej przykładu. Szyfr Cezara jest relacją, która każdej literze alfabetu przyporządkowuje inną literę tego samego alfabetu, położoną o 3 miejsca dalej. Stanowi on zatem relację typu A×A, a jednocześnie przykład szyfrowania funkcyjnego, ponieważ każdej literze ze zbioru tekstu jawnego przyporządkowuje dokładnie jedną literę ze zbioru tekstu tajnego. Tego rodzaju przekształcenie alfabetu na ten sam alfabet nazywane jest permutacją (zmianą porządku alfabetu).W przypadku szyfru homofonicznego mamy do czynienia z szyfrowaniem niefunkcyjnym, ponieważ niektórym literom przyporządkowane są dodatkowe symbole alfabetu tekstu tajnego, nazywane wariantami lub homofonami.
2.1.4. System kryptograficzny W matematyce system szyfrowania przedstawia się jako skończony, niepusty zbiór M relacji definiowany następująco: M { X 0 , X 1 , X 2 ,..., X 1}
gdzie:
— liczba wszystkich relacji w zbiorze M. Pojedynczą relację opisuje wzór: X i : V ( ni ) W ( mi )
Każdą z tych relacji nazywa się krokiem szyfrowania. Analogicznie definiowany jest system deszyfrowania. Oba te systemy tworzą w połączeniu system kryptograficzny, zwany również kryptosystemem.
Rozdział 2. Matematyczne podstawy kryptografii
51
2.1.5. Szyfrowanie monoalfabetyczne Mówimy, iż szyfrowanie jest monoalfabetyczne, jeśli wykorzystuje tylko jeden krok szyfrowania (stosowana jest tylko jedna relacja ze zbioru M). Jeśli w zbiorze M znajduje się tylko jedna relacja, mamy do czynienia z kryptosystemem monoalfabetycznym. Analogicznie szyfrowanie polialfabetyczne wykorzystuje więcej niż jeden krok szyfrowania, a polialfabetyczny kryptosystem ma więcej niż jedną relację w zbiorze M. Szyfr Cezara jest kryptosystemem wykorzystującym tylko jeden krok szyfrowania (w jego zbiorze M znajduje się tylko jedna relacja). Kryptosystem oparty na tablicy Trithemiusa jest polialfabetyczny, przy czym pojedyncze szyfrowanie może być w pewnych przypadkach monoalfabetyczne. Dzieje się tak, jeśli jako klucz wybierzemy na przykład „mmmm” lub „yyyyyyyy”. Wówczas wykorzystywana będzie tylko jedna relacja, mimo iż moc zbioru M() jest równa liczbie liter w danym alfabecie. Gdyby ten sam kryptosystem oparty był wyłącznie na słowie kluczowym „szyfry”, jego moc wynosiłaby 5 (y powtarza się 2 razy, a dana litera oznacza zawsze tę samą relację).
2.1.6. Funkcje jednokierunkowe Niezwykle istotne we współczesnej kryptografii są takie pojęcia jak funkcja jednokierunkowa i funkcja zapadkowa. Mają one podstawowe znaczenie w kryptosystemach z kluczem publicznym, a także w sieciowych systemach bezpieczeństwa. „Przez funkcję jednokierunkową będziemy rozumieć taką funkcję f: X Y, dla której obliczenia wartości f(x) można dokonać dla każdego x X w czasie wielomianowym, natomiast dla prawie wszystkich wartości y Y nie można wyznaczyć w sposób deterministyczny i w czasie wielomianowym żadnego x X takiego, że f(x) = y”2. Innymi słowy, policzenie funkcji, jak sama nazwa wskazuje, jest możliwe tylko w jednym kierunku. Na przykład funkcja y = x2 nie jest jednokierunkowa, ponieważ jeśli mamy dany y (powiedzmy — 9), łatwo możemy obliczyć, jaki x został wstawiony do wzoru funkcji. W tym celu wystarczy wstawić y do wzoru funkcji odwrotnej: x
y
W przypadku funkcji jednokierunkowych takie działanie jest niemożliwe. Dla ścisłości warto zaznaczyć, iż tak naprawdę nie istnieją funkcje z udowodnioną jednokierunkowością. Niektóre z nich można jednak podejrzewać o jednokierunkowość, ponieważ „zachowują się” zgodnie z oczekiwaniami. Takimi funkcjami są na przykład: a) funkcja wykładnicza z logarytmowaniem dyskretnym jako funkcją odwrotną, b) funkcja potęgowa z pierwiastkowaniem dyskretnym jako funkcją odwrotną, c) produkt (iloczyn) dużych liczb pierwszych z faktoryzacją jako funkcją odwrotną. 2
Stokłosa J., Kryptograficzna ochrona danych w systemach komputerowych, Nakom, Poznań 1994.
52
Podstawy kryptografii
Funkcje jednokierunkowe stosuje się często jako metodę zabezpieczania tajnych informacji (takich jak hasło czy PIN w sieciowych bazach danych). W bazie nie przechowuje się oryginalnych danych, a jedynie wynik ich przekształcenia przez funkcję jednokierunkową. Podczas procesu logowania komputer przekształca podane hasło lub PIN w oparciu o stosowaną funkcję jednokierunkową i porównuje wynik z odpowiednim rekordem w bazie danych. Jeśli oba zapisy się zgadzają, dostęp zostaje przyznany. Omawiane funkcje są wykorzystywane również w celu zabezpieczenia danych przed niepowołanymi zmianami. Dokonuje się tego poprzez tworzenie odpowiadających im kodów MAC (patrz podrozdział 3.2). Szczególnym przypadkiem tego typu funkcji, nadającym się do wykorzystania w dziedzinie kryptograficznych zabezpieczeń, jest jednokierunkowa funkcja zapadkowa. Może ona być policzona w przeciwnym kierunku, gdy uwzględniony jest określony warunek — jest nim z reguły jakaś dodatkowa informacja wykorzystywana w obliczeniach. Informacja ta stanowi właśnie ową „zapadkę” uruchamiającą mechanizm liczenia wartości x dla zadanego y. Podstawą szyfrowania asymetrycznego jest wykorzystanie jednokierunkowej funkcji zapadkowej opartej na arytmetyce modularnej. Aby przybliżyć zasadę działania tego mechanizmu, należy najpierw wyjaśnić, na czym owa arytmetyka polega, i wprowadzić pojęcie dwójkowego systemu liczbowego.
2.1.7. Arytmetyka modulo Stosujemy zapis: a b(mod n)
jeśli: a b kn
gdzie k jest liczbą całkowitą. Jeśli liczba a jest nieujemna, a b leży między 0 i n, możemy traktować b jako resztę z dzielenia a przez n. Mówimy też, że a jest kongruentne z b modulo n (znak jest oznaczeniem kongruencji). Zbiór liczb całkowitych od 0 do n–1 tworzy zupełny zbiór reszt modulo n, co oznacza, iż dla każdego a reszta z dzielenia należy do zbioru {0, 1, 2,…, n–1}. Działanie a mod n (nazywane też redukcją modularną) oblicza resztę z dzielenia a przez n należącą do tego zbioru. W praktyce arytmetyka modularna jest bardzo prosta i często pojawia się już w szkole podstawowej, gdzie przedstawiana jest jako „arytmetyka zegarowej tarczy”. Nazwa ta wzięła się stąd, że arytmetyki modulo używa się do obliczania upływu czasu na zegarku. Na przykład: jeśli mamy godzinę 21:00 i wiadomo, że jakieś wydarzenie nastąpi za pięć godzin, można obliczyć, że będzie wówczas godzina 2:00. W tym przypadku liczbą modularną jest 24. Zapisujemy to jako:
Rozdział 2. Matematyczne podstawy kryptografii
53
a (b c) mod n
gdzie: a — obliczana godzina, b — aktualna godzina, c — upływ czasu, n — liczba modularna. W powyższym przykładzie obliczenia można przedstawić następująco: A (21 5) mod 24 2
gdyż resztą z dzielenia 26/24 jest 2. Najbardziej podstawowym przykładem szyfrowania z wykorzystaniem arytmetyki modulo jest omówiony w poprzednim rozdziale szyfr Cezara, w którym każda litera tekstu jawnego jest przekształcana na literę tekstu tajnego przez przesunięcie o trzy miejsca dalej w alfabecie, przy czym ostatnie trzy litery zastępowane są trzema pierwszymi. Matematycznie przekształcenie to można więc zapisać jako: e = (p+3)mod26 Gdzie e jest literą w wiadomości tajnej, a p — literą szyfrowanego tekstu jawnego.
2.1.8. Dwójkowy system liczbowy Dwójkowy system liczbowy to sposób zapisu liczb operujący na kolejnych potęgach liczby 2. Używa się w nim tylko cyfr 1 i 0. Najłatwiej wyjaśnić reguły zapisu dwójkowego na zasadzie analogii do używanego powszechnie systemu dziesiętnego. System dziesiętny opiera zapis liczb na iloczynach kolejnych potęg liczby 10. Na przykład liczba 253 oznacza 2·102+5·101+3·100. Analogicznie system dwójkowy operuje iloczynami potęg liczby 2. I tak zapis 1011 oznacza 1·23+0·22+1·21+1·20, czyli liczbę 11 w systemie dziesiętnym. Istnieją też inne systemy liczbowe mające praktyczne zastosowanie w komputeryzacji, na przykład system szesnastkowy (zwany też heksadecymalnym). Stosując powyższe zasady, można stworzyć system opierający się na potędze dowolnej liczby naturalnej n. Podstawową zasadą, o której należy pamiętać, jest to, że maksymalna wartość, jaką można zapisać w danym systemie w postaci jednej cyfry, to n–1. Kiedy dana cyfra ma osiągnąć poziom n, „wyzerowuje” się ją i zwiększa o 1 cyfrę stojącą po jej lewej stronie. Stąd w systemie dziesiętnym nie istnieje możliwość zapisu wartości liczby 10 za pomocą jednego symbolu, natomiast w systemie szesnastkowym jest to możliwe, gdyż wprowadzono w nim oznaczenia A, B, C, D, E, F odpowiadające liczbom od 10 do 15. W myśl powyższych ustaleń zapisy A, 10 oraz 1010 są tożsame pod względem wyrażanej wartości.
54
Podstawy kryptografii
System dwójkowy jest wykorzystywany w informatyce, ponieważ liczby w tym systemie można zapisać przy użyciu bramek logicznych procesora. W zależności od napięcia wyjściowego bramki jej stan określany jest jako 1 lub 0. Komputer potrafi odczytać tylko te dwa stany, jednak dzięki nim przy użyciu pojęć z dziedziny logiki matematycznej (takich jak koniunkcja czy alternatywa) można zdefiniować podstawowe działania matematyczne. Na ich podstawie określane są kolejne działania i tak dochodzi się do coraz bardziej skomplikowanych operacji.
2.1.9. Liczby pierwsze Liczby pierwsze są często stosowane w kryptografii ze względu na swe specyficzne właściwości. Stanowią one nieodłączny element kryptografii asymetrycznej i wielu algorytmów wykorzystywanych w kryptografii symetrycznej. W tym rozdziale omówię podstawowe cechy tych liczb oraz powody, dla których są one aż tak istotne.
2.1.9.1. Co to za liczby i ile ich jest? Liczby pierwsze to takie liczby naturalne większe od 1, które dzielą się tylko przez siebie i przez 1. Należą więc do nich liczby: 2, 3, 5, 7, 11, 13, 17, 19… itd. Pozostałe liczby naturalne nazywamy złożonymi, natomiast 1 nie należy do żadnego z tych zbiorów. Każdą liczbę złożoną przedstawić można jako iloczyn liczb pierwszych (mówi się wtedy o rozkładaniu na czynniki pierwsze lub faktoryzacji). Stąd w matematyce porównywane są one do najmniejszych „cegiełek”, z których tworzy się inne liczby. Już starożytni wiedzieli, iż liczb pierwszych jest nieskończenie wiele. Udowodnił to Euklides w IV w. p.n.e. Tok jego rozumowania był następujący: Załóżmy, że istnieje skończenie wiele liczb pierwszych. W takim przypadku musi również istnieć największa liczba pierwsza N. Ciąg liczb pierwszych ma wówczas postać: p1, p2, p3, …, N. Wyobraźmy sobie teraz liczbę M obliczaną według wzoru: M p1 p2 p3 ... N 1
Liczba ta nie jest podzielna przez żadną z liczb pierwszych w ciągu p1, p2, p3, …, N, zawsze bowiem z jej dzielenia otrzymamy resztę 1. Skoro tak, to M albo sama jest liczbą pierwszą, albo muszą istnieć liczby pierwsze nienależące do ciągu p1, p2, p3, …, N, przez które M jest podzielna. W obu przypadkach dochodzimy do sprzeczności, na początku założyliśmy bowiem, iż ciąg p1, p2, p3, …, N zawiera wszystkie liczby pierwsze. Problem z liczbami pierwszymi polega na ich rozmieszczeniu pośród liczb naturalnych. Nie opracowano dotąd żadnego wzoru pozwalającego na wyszukiwanie kolejnych liczb pierwszych. Znamy kilka wzorów wyszukujących liczby pierwsze o określonych właściwościach, nie ma jednak wzoru „uniwersalnego”, który generowałby je po kolei, na bazie podstawianych do niego liczb naturalnych.
Rozdział 2. Matematyczne podstawy kryptografii
55
2.1.9.2. Sito Eratostenesa Najprostszą, choć mało efektywną metodę wyszukiwania kolejnych liczb pierwszych opracował grecki matematyk Eratostenes (III – II w. p.n.e.). Polega ona na „odsiewaniu” liczb pierwszych z zadanego zbioru liczb naturalnych (stąd nazywana jest sitem Eratostenesa). Odsiewanie przebiega następująco: Z zadanego zbioru liczb naturalnych większych od 1 wybieramy najmniejszą, po czym usuwamy ze zbioru wszystkie jej wielokrotności. Następnie wybieramy najmniejszą z pozostałych i postępujemy tak jak w pierwszym kroku. Po zakończeniu procedury w zbiorze pozostaną jedynie liczby pierwsze. Dla przykładu poniżej pokazano sito Eratostenesa dla zbioru (2, 30): Krok 1. Usuwamy wszystkie wielokrotności liczby 2. Zbiór = {2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29} Krok 2. Usuwamy wszystkie wielokrotności liczby 3. Zbiór = {2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29} Krok 3. Usuwamy wszystkie wielokrotności liczby 5. Zbiór = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29} Po kroku 3. w zbiorze nie pozostała już ani jedna wielokrotność któregokolwiek z jego elementów. Znaleźliśmy wszystkie liczby pierwsze w zadanym zakresie.
2.1.9.3. Sito Sundarama Inną znaną metodą jest sito Sundarama, XX-wiecznego indyjskiego matematyka. Po wybraniu zakresu liczb od 1 do n usuwamy z niego wszystkie liczby obliczone ze wzoru:
l i j 2ij gdzie
i, j N ,1 i j oraz i j 2ij n Pozostałe liczby mnożymy przez 2 i powiększamy o 1, uzyskując finalną listę liczb pierwszych w zbiorze (2, 2n+2).
2.1.9.4. Sito Atkina Jest to ulepszona wersja sita Eratostenesa, zwana też sitem Atkina-Bernsteina. Dzięki wykorzystaniu bardziej finezyjnych obliczeń pozwala na wyszukiwanie liczb pierwszych szybciej niż wersja opracowana przez starożytnego matematyka. Podczas przeszukiwania zadanego zakresu ignorowane są liczby, których reszta z dzielenia przez 60 jest parzysta, podzielna przez 3 lub podzielna przez 5. Pozostałe liczby analizowane są na podstawie ich reszty z dzielenia przez 12. Jeśli wynosi ona:
56
Podstawy kryptografii 1 lub 5 — liczba taka jest pierwsza, jeśli liczba rozwiązań równania 4x2 + y2
= n (gdzie n to analizowana liczba, a x i y to dowolne liczby naturalne) jest nieparzysta, a n nie jest kwadratem innej liczby naturalnej. 7 — liczba taka jest pierwsza, jeśli liczba rozwiązań równania 3x2 + y2 = n
(gdzie n to analizowana liczba, a x i y to dowolne liczby naturalne) jest nieparzysta, a n nie jest kwadratem innej liczby naturalnej. 11 — liczba taka jest pierwsza, jeśli liczba rozwiązań równania 4x2 – y2 = n
(gdzie n to analizowana liczba, a x i y to dowolne liczby naturalne i x>y) jest nieparzysta, a n nie jest kwadratem innej liczby naturalnej. Być może nasuwa się Wam w tym momencie pytanie: „Dlaczego w takim razie nie zadać odpowiednio dużego zbioru i nie znaleźć tylu liczb pierwszych, ile ich tylko potrzeba?”. Owszem, teoretycznie można to zrobić, zapisując wybrane sito w postaci programu. Po jego uruchomieniu wystarczy podać zakres przeszukiwania i czekać na wynik. Problem w tym, że przy większym zbiorze możemy nie doczekać się efektu. Przeszukanie zbioru (2, 2000 000 000) na komputerze z procesorem 2 GHz trwa kilka godzin. Można oczywiście zainwestować w lepszy sprzęt i przeszukać w ten sposób zakres kilku- lub nawet kilkunastokrotnie większy. Niestety, w praktyce znalezione przez nas liczby na niewiele się zdadzą, ponadto są już od dawna znane. Cała inwestycja byłaby więc po prostu nieopłacalna. Największa znana obecnie liczba pierwsza jest nieporównanie większa od liczb, które moglibyśmy w ten sposób wyszukać, nawet przy użyciu najnowocześniejszych komputerów. Proponuję mały eksperyment. Postarajcie się zgadnąć, ile cyfr (mniej więcej) może mieć wspomniana liczba. Macie już swój typ? Świetnie. Prawidłową odpowiedź znajdziecie w kolejnym podrozdziale.
2.1.9.5. Liczby pierwsze Mersenne’a i nie tylko Liczbami Mersenne’a (nazwanymi tak na cześć francuskiego uczonego, Marina Mersenne’a) nazywamy liczby w postaci: L 2n 1
gdzie n jest liczbą naturalną. Spośród wszystkich do tej pory wygenerowanych liczb tego typu zaledwie 48 to liczby pierwsze. Wspominam o nich jednak, ponieważ ostatnia z nich jest zarazem największą znaną nam liczbą pierwszą, a wszystkie dziesięć największych liczb pierwszych również zostało obliczonych z podanego wzoru. Największa znana nam liczba pierwsza odkryta została w styczniu 2013 roku w ramach projektu GIMPS (skrót od ang. The Great Internet Mersenne Prime Search — wielkie internetowe poszukiwanie liczb pierwszych Mersenne’a). Zainteresowanych szczegółami tego przedsięwzięcia odsyłam do oficjalnej strony: http://www.mersenne.org. A teraz odpowiedź na postawione wcześniej pytanie. Otóż największa znana liczba pierwsza jest równa 257885161–1 i ma 17 425 170 cyfr. Gdyby ją zapisać, byłaby około pięćdziesiąt razy dłuższa niż ta książka. I co, byliście blisko? Warto wspomnieć, że wykładnik potęgi liczby pierwszej Mersenne’a również jest liczbą pierwszą. Stąd w stosunku do takich liczb stosuje się zapis: 2P–1.
Rozdział 2. Matematyczne podstawy kryptografii
57
W terminologii liczb pierwszych często spotykamy również pojęcie liczby Fermata (od nazwiska francuskiego matematyka Pierre’a de Fermata). Jest to liczba obliczana za pomocą wzoru: n
L 22 1
gdzie n jest liczbą naturalną. Początkowo Fermat przypuszczał, iż wszystkie obliczone z tego wzoru liczby są pierwsze, gdyż pierwszych pięć liczb (3, 5, 17, 257, 65 537) zdawało się potwierdzać tę hipotezę. Została ona jednak obalona w XVIII wieku przez Leonarda Eulera, który rozłożył szóstą liczbę Fermata (4 294 967 297) na czynniki pierwsze (641×6 700 417). Innym istotnym pojęciem są liczby względnie pierwsze. Nazywamy tak parę liczb, których największym wspólnym dzielnikiem jest 1. Niekoniecznie musi to oznaczać, iż obie te liczby są pierwsze, na przykład 17 i 12 są względnie pierwsze, mimo iż 12 nie jest liczbą pierwszą. Jak łatwo się domyślić, każda liczba pierwsza jest względnie pierwsza ze wszystkimi liczbami złożonymi z wyjątkiem swoich wielokrotności. Dla każdej liczby naturalnej n wyznaczyć możemy zbiór liczb {1, …, n} względnie pierwszych z tą liczbą. Liczba elementów takiego zbioru nazywana jest funkcją Eulera liczby n i oznaczana jest jako (n). Istotną własnością funkcji Eulera jest:
(n) n 1 n jest liczbą pierwszą oraz:
( pq) ( p 1)(q 1) dla dowolnych liczb pierwszych p i q.
2.1.9.6. Małe twierdzenie Fermata Małe twierdzenie Fermata opracowane zostało dla liczb pierwszych. Euler odniósł to twierdzenie do innych liczb, przez co dokonał jego uogólnienia. W swej podstawowej postaci wyraża się ono wzorem:
a p 1 1mod p gdzie p jest liczbą pierwszą, natomiast a — liczbą niepodzielną przez p. Uogólnienie dla wszystkich liczb naturalnych przybiera postać:
a ( n ) 1 mod n Gdzie (n) to funkcja znana jako tocjent Eulera, definiowany jako ilość dodatnich liczb całkowitych mniejszych od n i względnie pierwszych z n. Pozwala ono obliczać odwrotność dowolnej liczby naturalnej modulo n, tzn. dla zadanych a oraz n takich, że: ax 1 mod n
zachodzi: x a ( n )1
58
Podstawy kryptografii
Poza tym pamiętając o właściwościach funkcji Eulera, zapisać możemy: m ( p 1)( q 1) 1 mod pq
a więc: m ( p1)( q1)1 m mod pq
dla dowolnej liczby m niepodzielnej zarówno przez p, jak i przez q. Jeśli oznaczymy iloczyn pq jako n i wybierzemy dwie liczby e i d większe od 1 takie, że: de ( p 1)(q 1) 1
to przy znanych n i e łatwo będzie policzyć me mod n, natomiast dokonanie odwrotnego działania (obliczenie m przy znanych n, e oraz znanym wyniku działania me mod n) będzie równoznaczne z rozwiązaniem problemu faktoryzacji liczby n na czynniki pierwsze. Jest to tym trudniejsze, im większe są liczby p i q. W związku z tym dla odpowiednio dużych liczb pierwszych obliczenie m jest niemożliwe, chyba że zna się liczbę d. Stanowi to esencję algorytmu szyfrowania asymetrycznego RSA. Szczegółowo problem rozkładania dużych liczb na czynniki pierwsze omówiony zostanie w podrozdziale 2.2.2.
2.1.9.7. NWD i NWW Kolejnymi pojęciami ściśle związanymi z liczbami pierwszymi są największy wspólny dzielnik oraz najmniejsza wspólna wielokrotność. Pomagają one między innymi w wyszukiwaniu par liczb względnie pierwszych. Największym wspólnym dzielnikiem liczb a i b nazywamy (jak sama nazwa wskazuje) największą liczbę, przez którą da się podzielić jednocześnie a i b. Zapisujemy to jako NWD (a, b) i obliczamy, korzystając z algorytmu Euklidesa, w podany poniżej sposób. Wybieramy większą z pary liczb a i b, a następnie obliczamy jej resztę modulo mniejsza liczba. W tym momencie druga liczba stanie się większa. Obliczamy z kolei jej resztę modulo pierwsza liczba. Postępujemy w ten sposób, dopóki jedna z liczb nie osiągnie wartości 0. Druga z liczb będzie wówczas równa NWD (a, b). Być może wygląda to nieco zawile, dlatego po raz kolejny posłużę się przykładem. Przypuśćmy, że chcemy wyznaczyć największy wspólny dzielnik liczb 45 oraz 63. Liczba 63 jest większa. Obliczamy zatem jej resztę modulo 45 i otrzymujemy 18. Teraz obliczamy 45 mod 18 = 9. W kolejnym kroku mamy 18 mod 9 = 0. Ostatecznie otrzymaliśmy parę (0, 9). Stąd NWD (45, 63) = 9. Jak być może się zorientowaliście, liczby, dla których NWD = 1, są względnie pierwsze. Najmniejsza wspólna wielokrotność jest najmniejszą liczbą, która dzieli się jednocześnie przez a i przez b. Wyznacza ją poniższy wzór:
Rozdział 2. Matematyczne podstawy kryptografii
NWW (a, b)
59
ab NWD(a, b)
Dla liczb zastosowanych w naszym przykładzie otrzymamy zatem: NWW (45,63)
45 63 2835 315 9 NWD(45,63)
Jest to najmniejsza liczba dzieląca się jednocześnie przez 45 i 63.
2.1.10. Logarytmy Logarytmem dodatniej liczby b przy podstawie a nazywamy wykładnik potęgi, do której należy podnieść a, żeby otrzymać b. Zapisujemy to następująco: log a b c a c b
dla a będącego liczbą dodatnią różną od 1. Jeżeli w zapisie logarytmu nie podano podstawy, przyjmuje się, iż wynosi ona 10, a więc: log b 2 b 10 2 100
Przyjmuje się również zapis ln jako oznaczenie logarytmu naturalnego. Jest to logarytm, którego podstawą jest liczba e, nazywana również stałą Eulera (jej wartość to w przybliżeniu 2,718). Podstawowe własności logarytmów są następujące: a) dla a, b, c, R+ i a 1 log a bc loga b log a c
oraz: log a
b log a b log a c c
b) dla a, b R+, a 1 i r R log a b r r log a b
Istnieje szereg dodatkowych własności logarytmów, jednak opisane powyżej wzory i definicje w zupełności nam wystarczą.
60
Podstawy kryptografii
2.1.11. Grupy, pierścienie i ciała Często podczas opisywania przekształceń kryptograficznych na zadanych argumentach pojawia się pojęcie grupy lub, nieco rzadziej, pierścienia. Wyjaśnię teraz, co oznaczają te pojęcia, jako że we wspomnianych opisach bywają one nieraz niepotrzebnie komplikowane.
2.1.11.1. Grupa Wyobraźmy sobie niepusty zbiór elementów A oraz działanie dwuargumentowe * (na przykład dodawanie lub mnożenie). Oba te obiekty tworzą grupę, jeśli działanie * spełnia następujące warunki: Zachowana jest łączność, czyli (a*b)* c = a*(b*c) dla dowolnych elementów
a, b, c A. Działanie nie wyprowadza poza zbiór, a więc a*b A dla a, b A. Istnieje element neutralny n A taki, że a*n = n*a = a dla a A. Istnieje element odwrotny dla dowolnego elementu a A oznaczany jako a–1
taki, że: a*a–1 = a–1*a = n Jeśli działanie * jest dodawaniem, to mówimy o grupie addytywnej, natomiast w przypadku mnożenia — o grupie multiplikatywnej. W grupie addytywnej element odwrotny nazywamy elementem przeciwnym. Jeśli w grupie zachodzi dodatkowo przemienność działania *, a więc: a*b = b*a dla dowolnych elementów a, b A, mamy do czynienia z grupą abelową. Ogólny zapis takiej grupy ma postać (A, *). Przykładem grupy może być zbiór liczb całkowitych z elementem dodawania (C, +). Często stosowanym pojęciem jest rząd grupy. Jest to nic innego, jak liczba elementów zbioru A. Spotkać się można z różnymi oznaczeniami rzędu, takimi jak: #A, rzA czy /A/. Wspomniana wcześniej grupa oparta na zbiorze liczb całkowitych ma rząd nieskończony.
2.1.11.2. Pierścień Jeśli mamy do czynienia ze zbiorem A ze zdefiniowanymi działaniami mnożenia i dodawania takimi, że: zbiór A z działaniem dodawania tworzy grupę abelową, mnożenie w zbiorze A jest łączne i przemienne,
Rozdział 2. Matematyczne podstawy kryptografii
61
zachodzi rozdzielność mnożenia względem dodawania, a więc:
(a + b)*c = (a*c) + (b*c) a*(b + c) = (a*b) + (a*c) dla dowolnych elementów a, b, c A, to strukturę taką nazywamy pierścieniem. Czasem rozróżnia się pojęcia pierścienia i pierścienia przemiennego w zależności od tego, czy zachodzi wspomniana własność. Przykładem pierścienia jest zbiór liczb całkowitych.
2.1.11.3. Ciało Ciało jest szczególnym przypadkiem pierścienia. Aby nazwać strukturę składającą się ze zbioru A o przynajmniej dwóch elementach oraz działań dodawania i odejmowania ciałem, musi ona spełniać następujące warunki: zbiór A wraz z dodawaniem tworzy grupę abelową, zbiór A/{0} z mnożeniem tworzy grupę abelową, zachodzi rozdzielność mnożenia względem dodawania.
Czasem spotkać się można również z pojęciem podciała. Podciałem ciała A nazywamy dowolny podzbiór B zbioru A, który sam spełnia właściwości ciała ze względu na działania zdefiniowane w ciele A. Ciało A nazywamy wówczas rozszerzeniem ciała B. Dla przykładu: zbiór liczb rzeczywistych jest ciałem. Jego podciałem jest zbiór liczb wymiernych, natomiast jego rozszerzeniem jest zbiór liczb zespolonych.
2.1.12. Izomorfizmy Teraz jeszcze kilka słów o tym, czym są przekształcenia izomorficzne. Pojęcie to pojawia się dość często w kryptografii, zwłaszcza w odniesieniu do niektórych protokołów. Wcześniej jednak warto przypomnieć pojęcia funkcji różnowartościowej oraz surjekcji. Potrzebne one będą do dokładnego zdefiniowania pojęcia izomorfizmu.
2.1.12.1. Funkcja różnowartościowa Funkcją różnowartościową nazywamy funkcję, która dla każdego argumentu x przyjmuje inną wartość y. Zapisujemy to w następujący sposób: x1 , x2 X ( x1 x2 f ( x1 ) f ( x2 ))
Funkcja taka nazywana jest również injekcją lub funkcją 1–1. Funkcją różnowartościową jest na przykład y = 2x. Wartości tej funkcji różnią się od siebie, jeśli tylko różnią się podstawione do jej wzoru argumenty x.
62
Podstawy kryptografii
2.1.12.2. Surjekcja Surjekcją nazywamy funkcję, która przyjmuje jako wartości wszystkie elementy zbioru Y. Innymi słowy, każdy element tego zbioru ma przypisany element ze zbioru X taki, że: f(x) = y. Zapisujemy to za pomocą wzoru: ( y Y )( x X )( f ( x) y )
Surjekcja bywa również określana jako funkcja na. Jako przykład posłuży tu funkcja y = x+1. Każdy element zbioru Y ma odpowiadający mu x, który wynosi y–1. Omawiana funkcja jest jednocześnie różnowartościowa. O takiej funkcji mówimy, że jest bijekcją lub funkcją wzajemnie jednoznaczną.
2.1.12.3. Przekształcenie izomorficzne Teraz można już zdefiniować pojęcie przekształcenia izomorficznego. Otóż jest to takie przekształcenie jednego systemu algebraicznego na drugi, które: zachowuje zdefiniowane działania, jest funkcją wzajemnie jednoznaczną.
Drugi punkt oznacza, iż przekształcenie takie musi być jednocześnie funkcją różnowartościową i surjekcją. Przekształcenie izomorficzne jest pojęciem ściśle związanym z algebrą ciał liczbowych. Mówimy, iż dwa ciała są izomorficzne, jeśli istnieje funkcja podstawiająca elementy jednego z nich w miejsce elementów drugiego przy zachowaniu zdefiniowanych w nim działań. Przykładowo: jeśli mamy ciało A składające się z elementów a i b z działaniami zdefiniowanymi następująco: +
a
b
a
a
b
b
b
a
a
b
a
a
a
b
a
b
*
oraz ciało B składające się z elementów 0 i 1, możemy dokonać przekształcenia izomorficznego za pomocą następującej funkcji I: I (a) 0, I (b) 1
W ten sposób przyporządkowaliśmy każdemu elementowi zbioru A dokładnie jeden element zbioru B, przy czym każdemu elementowi A odpowiada inny element B. Zachowano tu również zdefiniowane działania, a więc spełnione są oba warunki konieczne do uznania tego przekształcenia za izomorficzne. O funkcji I możemy powiedzieć, iż ustala izomorfizm ciał A i B.
Rozdział 2. Matematyczne podstawy kryptografii
63
2.2. Wzory w praktyce W tym rozdziale omawiam matematyczne aspekty rozwiązań kryptograficznych stosowanych w praktyce. Opisany tu zostanie algorytm szyfrowania asymetrycznego RSA oraz oparty na problemie logarytmu dyskretnego protokół Diffiego-Hellmana, służący do bezpiecznej wymiany kluczy szyfrujących. Poruszona będzie problematyka faktoryzacji liczb złożonych oraz generowania liczb pierwszych. Przedstawiam również przydatne w kryptoanalizie testy zgodności oraz wybrane zagadnienia z dziedziny teorii informacji.
2.2.1. Kryptosystem RSA Arytmetyka modulo i właściwości liczb pierwszych są podstawą szyfru RSA — techniki szyfrowania asymetrycznego z kluczem publicznym. Proces szyfrowania opisano poniżej. Użytkownik X wybiera dwie dowolne, duże liczby pierwsze p i q (im są większe, tym lepiej, gdyż od ich wielkości zależy bezpieczeństwo szyfru). Aby uprościć obliczenia, w poniższym przykładzie wybrane zostały liczby 11 i 17. Następnie X oblicza liczbę n będącą iloczynem tych dwóch liczb (n = 187). Trzeba jeszcze wybrać liczbę e, która wspólnie z iloczynem n stanowić będzie klucz szyfrujący. Liczby e oraz (p–1)×(q–1) powinny być względnie pierwsze. Załóżmy, że e = 7. Obie te liczby (n i e) podawane są do wiadomości wszystkich, którzy chcieliby wysłać zaszyfrowaną wiadomość do danego użytkownika. Aby to zrobić, należy w pierwszej kolejności przekształcić wysyłaną wiadomość do postaci liczbowej. Stosowany jest tu standard ASCII. Niech przesyłanym znakiem będzie litera A. W kodzie ASCII symbolowi temu odpowiada kombinacja 01000001. Po przeliczeniu na system dziesiętny przyjmuje ona wartość 65. Tekst jawny wynosi więc J = 65. Wartość tekstu tajnego obliczana jest według wzoru: S J e (mod n)
a zatem
S 657 (mod187) [65 4 (mod187) 65 2 (mod187) 65(mod187)] mod187 W celu usprawnienia obliczeń korzysta się tu z własności potęgowania: a nm a n a m
oraz z własności arytmetyki modulo: (a b) mod n ((a mod n) (b mod n)) mod n
czyli:
[17850625(mod187) 4225(mod187) 65]mod187 (166 111 65) mod187 [7215(mod187) 166(mod187)] mod187 109 166(mod187) 142 Wiadomość po zaszyfrowaniu ma zatem postać S = 142.
64
Podstawy kryptografii
Warto zauważyć, że dla kogoś, kto posiada tylko publiczne klucze, odwrócenie działania funkcji jest niemożliwe. Nawet jeśli zna on algorytm szyfrowania, nie jest w stanie powiedzieć, jakie były dane wejściowe, ponieważ 142 = 329 (mod 187) lub 471 (mod 187) lub 613 (mod 187) itd. Dopiero wartość 657 (mod 187) jest poprawna. Aby sprawdzić całą przestrzeń kluczy i dojść aż do tej wartości w rozsądnym czasie, potrzeba ogromnej mocy obliczeniowej. O tym za chwilę. Aby odwrócić działanie funkcji szyfrującej, należy uruchomić jej „zapadkę”, czyli tajny klucz deszyfrujący. Użytkownik X oblicza go ze wzoru: ke 1 mod( p 1)(q 1)
Tak więc: 7 k 10 16 1 161
stąd: k 161 / 7 23
Teraz użytkownik X używa swego tajnego klucza, aby odczytać wiadomość. Dekryptaż odbywa się według poniższego wzoru: J S k (mod n)
Wstępne obliczenia wyglądają następująco:
J 142 23 (mod187) [14216 (mod187) 142 4 (mod187) 142 2 (mod187) 1421 (mod187)] mod(187) 1421 mod187 142 142 2 mod187 155 142 4 mod187 (142 2 mod187) 2 mod187 155 2 mod187 89 1428 mod187 (142 4 mod187) 2 mod187 89 2 mod187 67 14216 mod187 (1428 mod187) 2 mod187 67 2 mod187 1 Ósma potęga liczby 142 nie występuje we wzorze obliczającym wartość tekstu jawnego, jej wyznaczenie ułatwia jednak obliczenie wartości 14216 mod 187. Wstawiamy teraz obliczone reszty modulo kolejnych potęg do wzoru głównego:
142 23 (mod187) (1 89 155 142) mod187 [(89 155 mod187) (142mod187)] mod187 (144 142) mod187 20448 mod187 65 Stosując tę metodę, można obliczać reszty modulo bardzo dużych potęg przy użyciu jedynie kieszonkowego kalkulatora. Na podstawie szesnastej potęgi obliczyć możemy trzydziestą drugą, potem sześćdziesiątą czwartą itd. Sposób ten ułatwia również implementowanie algorytmu RSA w rozmaitych językach programowania, w których zadeklarowane zmienne nie mogą przekroczyć określonej wartości zależnej od ich typu
Rozdział 2. Matematyczne podstawy kryptografii
65
(przykładowo nie mogą zajmować więcej niż 64 bity). Przeprowadzając obliczenia według zaprezentowanych wzorów, unikamy tworzenia „zbyt dużych” liczb w trakcie pracy programu. Uzyskaliśmy więc wartość tekstu jawnego i możemy odczytać wiadomość. Analizując algorytm szyfrowania, można jednak dojść do wniosku, że tajny klucz łatwo uzyskać dzięki analizie kluczy jawnych. Wzór, według którego oblicza się wartość tajnego klucza, składa się z trzech zmiennych: e, p oraz q. Klucz e jest podany do wiadomości publicznej, natomiast o zmiennych p i q wiadomo, że ich iloczyn wynosi n. Teoretycznie wystarczy więc rozłożyć liczbę n na czynniki pierwsze, aby złamać szyfr. W praktyce bywa to jednak bardzo trudne albo wręcz niemożliwe. Bezpieczeństwo kryptosystemu RSA zależy od wielkości wybranych liczb p i q. Im są one większe, tym większy ich iloczyn, a więc trudniejsze jest rozłożenie go na czynniki pierwsze (każdy stosowany do tego algorytm sprowadza się zasadniczo do sprawdzania liczb mniejszych niż testowana). Jeśli więc liczba jest dostatecznie duża, przeszkodą w złamaniu szyfru omawianego algorytmu będzie zbyt mała moc obliczeniowa komputera. Oczywiście mówimy tutaj o łamaniu poprzez faktoryzację iloczynu liczb p i q. Na razie nie udowodniono bowiem, że nie istnieje inna metoda zagrożenia bezpieczeństwu RSA. Warto tu nadmienić, że wraz z upływem czasu bezpieczeństwo RSA opiera się na coraz dłuższych kluczach, co powoduje zwiększenie nakładu obliczeniowego koniecznego nie tylko do złamania szyfru, ale i do jego „normalnego” wykorzystywania. W rezultacie poszukuje się alternatywnej metody szyfrowania asymetrycznego, pozwalającej osiągnąć to samo bezpieczeństwo mniejszym kosztem obliczeniowym. Aktualnie bardzo obiecująca wydaje się kryptografia krzywych eliptycznych (ECC — ang. Elliptic Curve Cryptography). Pojawiły się już nawet pierwsze produkty wykorzystujące ją w swoich zabezpieczeniach oraz, co za tym idzie, pierwsze opracowania dotyczące jej podatności na kryptoanalizę. Matematyczne podstawy ECC znacznie wykraczają poza ramy tej książki i są znacznie bardziej złożone od fundamentów RSA — zainteresowanych czytelników odsyłam do książki Kryptografia i bezpieczeństwo sieci komputerowych [31, 32], gdzie zagadnienie to jest wyjaśnione od podstaw.
2.2.2. Problem faktoryzacji dużych liczb Co to znaczy, że liczba jest „dostatecznie duża”? Pojęcie to zmienia się, gdyż w związku z postępem technicznym coraz większe liczby są rozkładane na czynniki pierwsze. RSA ogłosiła konkurs na faktoryzowanie wytypowanych liczb. Dotychczas największą rozłożoną liczbą jest RSA-232 (numer oznacza liczbę cyfr potrzebnych do zapisu liczby). W nowej edycji konkursu numery przyporządkowane liczbom oznaczają liczbę bitów konieczną do ich zapisu. Spośród liczb opublikowanych na konkursowej liście sfaktoryzowano do tej pory trzy — RSA 576, RSA 640 oraz RSA 768. Do zapisu największej z nich potrzeba 232 cyfr (w „starej” numeracji oznaczona byłaby zatem jako RSA-232). Została ona sfaktoryzowana w grudniu 2009 roku. Co ciekawe, na chwilę obecną nadal niesfaktoryzowana pozostaje RSA 704. Na rozłożenie nadal czekają również RSA-896, RSA-1024, RSA-1536 oraz RSA-2048 i choć sam konkurs oficjalnie już zamknięto, wciąż można spróbować swoich sił w ich faktoryzacji. Więcej informacji na ten temat znaleźć można pod adresem http://www.rsa.com/ rsalabs/node.asp?id=2092.
66
Podstawy kryptografii
Podstawowym problemem, który pojawia się przy faktoryzacji dużych liczb, jest znalezienie odpowiedniego algorytmu. Bez tego nawet najnowocześniejszy sprzęt komputerowy okaże się niewystarczający. Dlatego też naukowcy zajmujący się obecnie tym problemem koncentrują swe wysiłki na poszukiwaniach coraz szybszych sposobów faktoryzacji. Najstarszym znanym algorytmem tego typu jest dzielenie próbne. Polega ono na dzieleniu faktoryzowanej liczby przez wszystkie liczby pierwsze mniejsze od pierwiastka z tej liczby. Algorytm ten gwarantuje znalezienie czynników pierwszych liczby, lecz jest zbyt powolny, aby można go było z powodzeniem stosować przeciwko współczesnym liczbom-gigantom, takim jak te zaproponowane przez RSA. Aby wytłumaczyć, dlaczego tak się dzieje, posłużę się przykładem. Załóżmy, że musimy sfaktoryzować liczbę, która ma „zaledwie” 80 cyfr. W takim przypadku, stosując metodę dzielenia próbnego, trzeba sprawdzić, czy liczba ta jest podzielna przez którąkolwiek z liczb mniejszych od 1040 (mniej więcej). Przy założeniu (dość optymistycznym), że tylko jedna liczba na dziesięć tysięcy z tego przedziału jest pierwsza, mamy do wykonania 1036 operacji dzielenia. Jeśli przyjmiemy teraz (znowu dość optymistycznie), że sprzęt, którym dysponujemy, jest w stanie wykonać 1 000 000 000 000 000 000 000 000 = 1024 operacji dzielenia na sekundę, na przeszukanie całego zakresu będziemy czekać 1 000 000 000 000 = 1012 sekund, czyli mniej więcej 31 tysięcy lat. Oczywiście możliwe jest natrafienie na właściwy dzielnik wcześniej, jednak nawet gdyby nastąpiło to po przeszukaniu zaledwie 1% liczb pierwszych z zadanego zakresu, i tak okres oczekiwania wielokrotnie przekroczyłby długość życia człowieka. Z tego względu do faktoryzacji większych liczb opracowuje się bardziej wydajne algorytmy. Najbardziej znane to: Metoda krzywej eliptycznej (ECM — skrót od ang. Elliptic Curve Method)
— metoda stosowana do faktoryzacji liczb o maksymalnej długości do 43 cyfr. Sito kwadratowe (ang. Quadratic Sieve) — metoda stosowana do liczb
poniżej 110 cyfr. Kolejnymi, szybszymi odmianami tego algorytmu są wielokrotne wielomianowe sito kwadratowe (ang. Multiple Polynomial Quadratic Sieve) oraz wielokrotne wielomianowe sito kwadratowe dla podwójnie dużych liczb (ang. Double Large Prime Variation of the Multiple Polynomial Quadratic Sieve). Uogólnione sito ciała liczbowego (GNFS — skrót od ang. General Number
Field Sieve) — stosowane jest przy faktoryzacji liczb powyżej 110 cyfr. Przy jego użyciu rozłożono na czynniki pierwsze liczby RSA-140, RSA-155, RSA-160, RSA-576 oraz RSA 640, a także dziewiątą liczbę Fermata. Odmianą tej metody jest SNFS (ang. Specialized Number Field Sieve), która radzi sobie znacznie wydajniej z faktoryzacją liczb o określonej postaci. Nie będziemy się zagłębiać w matematyczne aspekty tych algorytmów, ponieważ są one dość zawiłe i zdecydowanie wykraczają poza zakres tej książki. Warto jednak wiedzieć, iż takie metody istnieją i że na polu faktoryzacji dużych liczb dokonuje się ciągły postęp.
Rozdział 2. Matematyczne podstawy kryptografii
67
2.2.3. Mocne liczby pierwsze Pojawianie się kolejnych algorytmów służących do rozłożenia liczby n na jej czynniki pierwsze p i q doprowadziło do powstania zagadnienia mocnych liczb pierwszych. Są to takie liczby, które generują iloczyn wyjątkowo trudny do faktoryzacji za pomocą stosowanych powszechnie algorytmów. Uważa się, iż liczby takie powinny spełniać następujące warunki: (p–1)/2 oraz (q–1)/2 powinny być liczbami pierwszymi; p+1 oraz q+1 powinny mieć duże czynniki pierwsze; p`–1 oraz q`–1 powinny mieć duże czynniki pierwsze, przy czym p` i q`
oznaczają czynniki pierwsze odpowiednio p–1 i q–1; p` oraz q` powinny być jak największe; największy wspólny dzielnik p–1 i q–1 powinien być jak najmniejszy.
Ostatnie dwa warunki są spełnione, jeśli spełniony jest warunek pierwszy. Mocne liczby pierwsze generują iloczyny trudniejsze do faktoryzacji, a mimo to ich stosowanie stanowi przedmiot sporu. Dzieje się tak, ponieważ stosowanie tego typu zasad przy tworzeniu liczb p i q narzuca pewne ograniczenia na algorytm losowy, co prowadzi do powstania tzw. negatywnego wzorca. Więcej informacji na ten temat zawarłem w dalszej części książki, teraz wystarczy zauważyć, iż zasady dotyczące tworzenia mocnych liczb pierwszych zmniejszają liczbę liczb możliwych do zastosowania w charakterze p i q, a więc również ich losowość. Z tego względu wielu ekspertów odradza stosowanie algorytmów generujących mocne liczby pierwsze. Sytuacja ta może ulec zmianie, jeśli pojawi się nowy, wyjątkowo szybki algorytm faktoryzacji, na który takie liczby będą znacznie odporniejsze niż inne. Wówczas ich mała losowość stanie się cechą drugorzędną, a mocne liczby pierwsze powrócą do łask. Czytelnikom bardziej zainteresowanym tematem polecam opracowanie Strong Primes are Easy to Find Johna Gordona. W książce tej opisano metodykę generowania mocnych liczb pierwszych, można tam znaleźć również przykłady takich liczb.
2.2.4. Generowanie liczb pierwszych Zupełnie innym problemem jest wyszukiwanie liczb pierwszych, które mogłyby zostać użyte podczas szyfrowania z kluczem publicznym. Wydawałoby się, iż generowanie liczb pierwszych będzie równie trudne jak faktoryzacja. Trzeba przecież wybrać dużą liczbę, a następnie dokonać próby rozłożenia jej na czynniki pierwsze. Jeśli próba się nie powiedzie, mamy do czynienia z liczbą pierwszą. Istnieje jednak szereg testów pierwszości, które nie opierają się na faktoryzacji. Pozwalają one stwierdzić, czy n jest liczbą pierwszą, czy złożoną, z pominięciem prób znalezienia ewentualnych czynników pierwszych n. Właśnie na tych testach oparte są współczesne algorytmy generowania liczb pierwszych. Istotne jest to, że mają one probabilistyczny charakter. Pozwalają bowiem określić pierwszość liczby jedynie z pewnym prawdopodobieństwem. W związku z tym dla uzyskania większej pewności należy wykonać test wielokrotnie (im więcej
68
Podstawy kryptografii
prób, tym większe prawdopodobieństwo otrzymania poprawnego wyniku). Dodatkowo przed ich przeprowadzeniem warto wykonać kilka dodatkowych operacji usprawniających cały proces. Całość podzielić można na trzy etapy: Po wygenerowaniu testowanej liczby p należy ustawić jej najmniej znaczący
bit na 1. Dzięki temu unikniemy niepotrzebnego testowania liczb parzystych. Należy sprawdzić podzielność p przez najmniejsze liczby pierwsze. Im więcej
liczb przetestujemy, tym większe prawdopodobieństwo „wyłapania” liczby złożonej już na tym etapie. Na przykład testując wszystkie liczby pierwsze mniejsze niż 200, uzyskamy 76% pewności, że p jest liczbą pierwszą (oczywiście pod warunkiem, że któraś z liczb nie okaże się dzielnikiem p). Wybrany test pierwszości należy wykonać kilkukrotnie.
W każdym z testów używana jest losowo wybrana liczba a. Jeśli przy jej użyciu stwierdzona zostanie złożoność liczby p, to a jest świadkiem złożoności p. W celu przyspieszenia obliczeń wybierać możemy małe wielkości a.
2.2.4.1. Test Lehmana Po wylosowaniu dużej liczby p wybieramy drugą liczbę losową a mniejszą od p. Następnie określamy wartość b, posługując się następującym wzorem: b a ( p1) / 2 (mod p)
Jeśli: b 1(mod p ) lub b 1(mod p)
to p jest liczbą pierwszą z prawdopodobieństwem nie mniejszym niż 50%. W przeciwnym wypadku p jest na pewno liczbą złożoną.
2.2.4.2. Test Rabina-Millera Losujemy liczby a i p, a następnie wyznaczamy maksymalną liczbę podziałów przez 2 liczby p–1. Wartość tę oznaczymy tu jako b (2b jest więc największą potęgą 2, która dzieli p–1). Należy jeszcze wyznaczyć wartość m ze wzoru: p 1 2b m
Przystępujemy teraz do właściwego testu. Opiera się on m.in. na liczniku, którego wartość wyrażać będziemy jako c. Na początku jego wartość wynosi 0. W pierwszej kolejności obliczamy: z a m mod p
Jeśli z 0 z p 1 , to p przechodzi test, natomiast jeśli z = 1, to p jest liczbą złożoną. Wartość licznika zwiększamy o 1 i jeśli z p 1 , obliczamy: z z 2 mod p
Rozdział 2. Matematyczne podstawy kryptografii
69
Następnie dokonujemy kolejnego sprawdzenia pierwszości na podstawie wartości z. Test kończy się, kiedy c = b. Jeśli w tym momencie z = p–1, to p nie jest liczbą pierwszą. W przypadku tego testu prawdopodobieństwo znalezienia świadka złożoności p wynosi 75%. Innymi słowy, szybciej zyskujemy pewność co do pierwszości badanej liczby. t Szansa na to, iż liczba złożona przejdzie t testów, wynosi 1 / 4 .
2.2.4.3. Test Solovaya-Strassena Ponownie wybieramy losowo liczby p i a (a < p). W pierwszej kolejności sprawdzamy, czy spełniony jest warunek: NWD(a, p) 1
Jeśli nie, liczba na pewno jest złożona i test należy przerwać. W przeciwnym wypadku obliczamy wartość b ze wzoru zastosowanego w punkcie 2.2.4.1. Następnie obliczamy symbol Jacobiego J(a, b) i porównujemy ze sobą oba wyniki. Jeżeli są równe, p jest liczbą złożoną z prawdopodobieństwem co najwyżej 50%, natomiast w przypadku uzyskania innych wyników liczba p na pewno jest złożona. Test powtarzamy do uzyskania zadowalającego stopnia pewności co do pierwszości testowanej liczby. Dla t t powtórzeń testu prawdopodobieństwo uzyskania fałszywego wyniku wynosi 1 / 2 .
2.2.4.4. Test Fermata Wybieramy losowo liczbę całkowitą a zawierającą się w przedziale (2, n–2) i przeprowadzamy poniższy test t razy:
r a n1 mod n t Jeśli r jest równe 1, to wylosowana liczba jest pierwsza z prawdopodobieństwem 1 / 2 . Jeśli w dowolnym z testów r będzie różne od 1, testowana liczba jest złożona.
Inne znane testy to: test oparty na krzywych eliptycznych, test AKS (ang. Agrawal-Kayal-Saxena), test Baillie-PSW.
W poszukiwaniach liczb pierwszych wykorzystuje się również: algorytm Maurera, algorytm Gordona, algorytm PrimeInc.
Opisy tych ostatnich znaleźć można w książce Ochrona danych i zabezpieczenia w systemach teleinformatycznych [4].
70
Podstawy kryptografii
2.2.5. Chińskie twierdzenie o resztach Bardzo często w obliczeniach związanych z kryptografią z kluczem publicznym wykorzystywane jest chińskie twierdzenie o resztach. Służy ono zwłaszcza do sprawdzania poprawności szyfrowania przy użyciu RSA, pozwala bowiem zidentyfikować dowolną liczbę na podstawie reszt modulo liczby pierwsze przy założeniu, że jest ona mniejsza niż iloczyn tych liczb. I tak dla dwóch liczb pierwszych p i q mamy: x a mod p x b mod q
Wartość określanej liczby x obliczyć możemy ze wzoru: x (((a 1) * u ) mod p) * q b
przy czym: u * q 1 mod p
Wygląda skomplikowanie? Rozpatrzmy zatem przykład. Załóżmy, że mamy dwie liczby pierwsze równe 3 oraz 5. Ich iloczyn wynosi 15. Rozpatrywaną liczbą niech będzie 11. Reszty z 11 modulo 3 i 5 wynoszą odpowiednio a = 2 oraz b = 1. Obliczamy wartość u: u * 5 1 mod 3 u 2
i wstawiamy ją do wzoru: x (((2 1) * 2) mod 3) * 5 1 2 * 5 1 11
W ten sposób wyznaczyć można x, opierając się jedynie na resztach modulo liczby pierwsze z tej wartości.
2.2.6. Logarytm dyskretny Opisany poniżej problem logarytmu dyskretnego został wykorzystany przez Diffiego i Hellmana do stworzenia protokołu bezpiecznej wymiany klucza w komunikacji sieciowej. Dzięki jego zastosowaniu możliwe jest ustalenie klucza szyfrującego w sposób, który uniemożliwia jego przechwycenie lub podsłuchanie. Może jednak zacznę od podania odpowiedniej definicji. „Niech Fp* = (Z/pZ)* = {1, 2, …, p–1} będzie grupą multiplikatywną liczb całkowitych modulo liczba pierwsza p (…). Niech g Fp* będzie ustalonym elementem (naszą „podstawą”). Problemem logarytmu dyskretnego w Fp* przy podstawie g nazywamy zadanie wyznaczenia dla danego y Fp* takiej liczby naturalnej x, że y = gx mod p (o ile takie x istnieje — w przeciwnym wypadku powinniśmy otrzymać jako wynik stwierdzenie, że y nie należy do podgrupy generowanej przez g)”3. 3
Koblitz N., Algebraiczne aspekty kryptografii, Wydawnictwa Naukowo-Techniczne, Warszawa 2000.
Rozdział 2. Matematyczne podstawy kryptografii
71
Praktyczne zastosowanie logarytmu dyskretnego jest następujące. Załóżmy, że dwóch użytkowników (X i Y) chce zabezpieczyć swoją komunikację przy użyciu algorytmu Diffiego-Hellmana. Użytkownik Z próbuje złamać zabezpieczenia i podsłuchać rozmowę. Na początku X i Y ustalają dużą liczbę pierwszą p i bazę g. Dla ułatwienia obliczeń w tym przykładzie niech p = 11, a g = 4. Liczby te są ustalane publicznie, więc użytkownik Z również ma do nich dostęp. Następnie X i Y wybierają losowo jedną liczbę naturalną k mniejszą od p. W poniższym przykładzie kx = 2, a ky = 3. Kolejnym krokiem jest podstawienie wymyślonych liczb do wzoru gk mod p. A więc: g kx mod p 16 mod 11 5 g ky mod p 64 mod 11 9
Wynik ten jest przesyłany publicznym łączem do drugiego użytkownika, można zatem założyć, że osoba Z nie zna liczb kx i ky, a jedynie rezultat wykonanych za ich pomocą obliczeń. Teraz X i Y muszą już tylko obliczyć klucz szyfrujący zgodnie ze wzorem: g kxky Fp {1, 2, ..., p 1} *
Osoba X może to zrobić, podnosząc modulo 11 otrzymaną od Y liczbę do swojej tajnej potęgi, a Y — podnosząc modulo 11 liczbę otrzymaną od X do potęgi ky. Obie osoby otrzymają tę samą liczbę, gdyż: g kxky ( g kx ) ky ( g ky ) kx
Tak więc: 9 2 mod 11 81 mod 11 4 — dla użytkownika X 53 mod11 125 mod11 4 — dla użytkownika Y
Użytkownik Z staje natomiast przed problemem znanym jako problem Diffiego-Hellmana — musi znaleźć gkxky, mając dane g, gkx, gky Fp*. Aby złamać ten szyfr, musi więc rozwiązać problem logarytmu dyskretnego. Wyjątkiem jest sytuacja, w której atakujący przeprowadzi skuteczny atak Man in the Middle (patrz podrozdział 3.1.3). W tym przypadku osoba taka może uzgodnić klucze z obiema stronami i pośredniczyć w prowadzonej komunikacji. Rozwiązaniem jest tutaj potwierdzenie tożsamości właściciela danego gkx lub gky za pomocą cyfrowej książki telefonicznej lub certyfikatu wydanego przez niezależną instytucję. Takie rozwiązania zaproponowano na przykład w protokołach STS (skrót od ang. Station-to-Station) oraz MTI (od nazwisk twórców: Matsumoto, Takashima i Imai). Oba opierają się na modyfikacji protokołu DiffiegoHellmana wykluczającej wspomniany atak. W pierwszym z nich komunikujący się użytkownicy podpisują elektronicznie przesyłane wiadomości, natomiast w drugim dołączają do nich certyfikaty zawierające ich osobiste identyfikatory i podpisane przez cieszący się zaufaniem serwer. Oczywiście nie da się wykluczyć możliwości złamania systemu Diffiego-Hellmana z pominięciem rozwiązania problemu logarytmu dyskretnego. Innymi słowy, nie znaleziono dotąd dowodu na to, że jest to jedyny sposób złamania tego kryptosystemu.
72
Podstawy kryptografii
Mimo to można potraktować ten system jako bezpieczny, przynajmniej dopóki problem logarytmu dyskretnego pozostaje nierozwiązany. Logarytm dyskretny znalazł również inne zastosowania. Najpopularniejsze z nich to: System kryptograficzny Masseya-Omury. Umożliwia on zabezpieczanie
przesyłania informacji pod warunkiem zastosowania bezpiecznej techniki potwierdzania tożsamości. System kryptograficzny ElGamala. Asymetryczny algorytm szyfrowania
wiadomości. Tworzone za jego pomocą kryptogramy są dwukrotnie dłuższe niż odpowiadające im teksty jawne. Wady tej pozbawiony jest omówiony wcześniej algorytm RSA. Standard podpisów cyfrowych (ang. Digital Signature Standard — DSS).
Standard umożliwiający wykonywanie podpisów elektronicznych pod przesyłanymi wiadomościami. Opracowany w National Institute of Standards and Technology (NIST). Ich opisy znaleźć można w książkach Wykład z teorii liczb i kryptografii [19] oraz Kryptografia i bezpieczeństwo sieci komputerowych [31, 32].
2.2.7. XOR i AND Operację XOR oznaczamy symbolem lub ^. Nazywana jest ona również alternatywą wykluczającą lub sumowaniem modulo 2. Dla danej pary bitów definiujemy ją następująco: 00=0 01=1 10=1 11=0 Dla operacji XOR zachowane zostają również klasyczne właściwości dodawania, a więc prawo przemienności: ab ba
oraz łączności: a (b c) (a b) c
Operacja XOR z punktu widzenia kryptografii jest szyfrem Vigenere’a, natomiast pod względem matematycznym jest po prostu sumowaniem liczb binarnych modulo 2. Wykonuje się ją na parach bitów. Jeden bit pochodzi z wysyłanej wiadomości, a drugi z używanego do jej zaszyfrowania klucza. XOR należy do klasy szyfrów symetrycznych i jest łatwy w implementacji, gdyż zsumowanie szyfrogramu z kluczem daje tekst jawny, a więc nie jest konieczne tworzenie osobnego algorytmu deszyfrowania. Można go zastosować w metodzie szyfrowania z kluczem jednorazowym (ang. one-time pad), dodając do bitów tekstu jawnego kolejne bity losowo wygenerowanego klucza.
Rozdział 2. Matematyczne podstawy kryptografii
73
W zbiorze {0, 1} określono również mnożenie, które odpowiada koniunkcji logicznej AND i definiowane jest następująco: 0 0 0 1 1 0 0 1 1 1
Operacje XOR i AND są często stosowanymi w algorytmach szyfrujących narzędziami przekształcania bloków tekstu. Same w sobie nie gwarantują żadnego bezpieczeństwa, jednak w połączeniu z innymi technikami zmieniania ciągów bitów stanowią praktyczne narzędzia szyfrujące.
2.2.8. Testy zgodności Poniższe testy matematyczne opracowane zostały w celu ułatwienia kryptoanalizy szyfrów polialfabetycznych. Autorem pierwszego z nich (testu Kappa) jest William F. Friedman, pozostałe dwa natomiast (testy Fi i Chi) zostały opracowane przez jego asystenta, doktora Sallomona Kullbacka. Jak wiadomo, podstawowym problemem przy łamaniu szyfrów polialfabetycznych jest znalezienie partii tekstu szyfrowanych tą samą literą słowa kluczowego. Kiedy już zidentyfikuje się długość klucza, a następnie podzieli litery szyfrogramu na grupy odpowiadające jego poszczególnym literom, cała sprawa sprowadza się do złamania zwykłego szyfru monoalfabetycznego. Poniższe testy pozwalają stwierdzić, czy dwa teksty tajne są zaszyfrowane za pomocą tego samego klucza, a także umożliwiają pogrupowanie ich liter we wspomniany sposób. Wcześniej jednak należałoby wprowadzić kilka pomocniczych pojęć z dziedziny rachunku prawdopodobieństwa.
2.2.8.1. Zdarzenia i ich prawdopodobieństwo Doświadczeniem losowym nazywamy w matematyce eksperyment, w wyniku którego otrzymuje się określony rezultat. Rezultat ten nazywany jest zdarzeniem elementarnym i oznaczany jako . Mówimy również o przestrzeni zdarzeń elementarnych w odniesieniu do zbioru wszystkich możliwych rezultatów eksperymentu. Zapisujemy to następująco: {1 , 2 ,..., n }
Rozkładem prawdopodobieństwa zdarzeń elementarnych w zbiorze nazywamy zbiór P taki, że: P { p1 , p2 ,..., pn }
gdzie: pi 0,1
oraz: n
p i 1
i
1
74
Podstawy kryptografii
Liczba pi oznacza prawdopodobieństwo zdarzenia i (prawdopodobieństwo, iż zdarzenie to będzie wynikiem eksperymentu). Obliczana jest ona ze wzoru: pi 1 /
gdzie oznacza moc zbioru zdarzeń elementarnych, czyli innymi słowy liczbę wszystkich zdarzeń w tym zbiorze. Wzór ten stosujemy, gdy wszystkie zdarzenia mają takie samo prawdopodobieństwo i wzajemnie się wykluczają. Prawdopodobieństwo uzyskania tego samego rezultatu przy n próbach oblicza się, podnosząc prawdopodobieństwo zdarzenia do potęgi n. Zdaję sobie sprawę, iż to wszystko na pierwszy rzut oka wygląda nieco zawile, dlatego też zanim przejdziemy dalej, podam krótki przykład. Załóżmy, że rozpatrywanym doświadczeniem losowym jest rzut sześcienną kostką do gry. Zdarzeniami elementarnymi są kolejne możliwe wyniki rzutu, a więc: {1, 2, 3, 4, 5, 6}
Moc zbioru zdarzeń elementarnych wynosi w tym przypadku 6, a prawdopodobieństwo wyrzucenia dowolnej z liczb pi = 1/6. Aby obliczyć, jaka jest szansa na wyrzucenie trzy razy z rzędu danej liczby, należy podnieść prawdopodobieństwo tego zdarzenia elementarnego do trzeciej potęgi (wynik jest równy 1/216). Suma prawdopodobieństw wszystkich zdarzeń zgodnie z definicją wynosi 1. Kolejnym pojęciem istotnym w rachunku prawdopodobieństwa jest zdarzenie (nie mylić ze zdarzeniem elementarnym). Jest to dowolny podzbiór E zbioru , składający się z pewnej liczby zdarzeń elementarnych. Prawdopodobieństwo zdarzenia jest równe sumie prawdopodobieństw zdarzeń elementarnych wchodzących w jego skład. W tym przykładzie zdarzeniem mogłoby być wyrzucenie liczby parzystej. Mamy w tym przypadku do czynienia ze zbiorem zdarzeń składającym się z trzech elementów — może zostać wyrzucona liczba 2, 4 lub 6. Prawdopodobieństwo naszego E jest równe sumie prawdopodobieństw tych zdarzeń, a więc: P( E ) 1 / 6 1 / 6 1 / 6 1 / 2
Przedstawione pojęcia to zaledwie wstęp do teorii prawdopodobieństwa, niemniej jednak w zupełności wystarczą do zrozumienia testów zgodności.
2.2.8.2. Test zgodności Kappa Wyobraźmy sobie teraz, że zbiór zawiera wszystkie litery alfabetu. Jego moc uzależniona jest od liczby liter, co w przypadku polskiego alfabetu daje = 32. Prawdopodobieństwo zdarzenia elementarnego polegającego na wylosowaniu dowolnej z liter
Rozdział 2. Matematyczne podstawy kryptografii
75
wynosi 1/32, czyli 0,03125. Szansa na wylosowanie tej samej litery dwa razy z rzędu jest równa 0,0009765625 (0,031252), natomiast wylosowanie dowolnej pary liter charakteryzuje się prawdopodobieństwem równym 0,0009765625×32, a więc również 0,03125. Dlaczego podaję te wszystkie dane? Otóż szyfry polialfabetyczne dążą do takiego właśnie rozkładu częstości. Każda litera w szyfrogramie powinna pojawiać się z takim samym prawdopodobieństwem. Oczywiście poszczególne szyfry tego typu osiągają efekt równomiernego rozkładu w różnym stopniu, jednak dla celów praktycznych możemy założyć, iż warunek ten jest spełniony. Obliczony współczynnik 0,03125 (3,125%) oznaczany jest jako Kr. Jego znajomość pozwala odpowiedzieć na pytanie, ile par takich samych liter powstanie po umieszczeniu dwóch losowych ciągów tekstu jednego nad drugim. Należy jednak pamiętać, że w praktyce litery mają różną częstość występowania, w związku z czym ich współczynnik zbieżności będzie nieco inny niż w przypadku tekstu czysto losowego. Współczynnik ten oznaczany jest jako Kp i obliczany w podany poniżej sposób. W pierwszej kolejności należy ustalić, jaką częstotliwością występowania charakteryzują się litery w danym alfabecie. Charakterystykę tę dla języka polskiego przedstawia tabela 2.1. Następnym krokiem jest obliczenie prawdopodobieństwa wystąpienia pary liter z uwzględnieniem ich częstotliwości. Na przykład prawdopodobieństwo wystąpienia dwóch liter e wynosi 8,87/100×8,87/100, czyli 0,00786769. Na tej samej zasadzie obliczamy prawdopodobieństwo wystąpienia par pozostałych liter. W kolejnym kroku, podobnie jak w przypadku Kr, sumujemy ze sobą wszystkie prawdopodobieństwa, a uzyskany wynik mnożymy przez 100. Otrzymany współczynnik Kp wynosi 0,0512 (5,12%) i oznacza on procentowy odsetek takich samych par liter, które powstaną po umieszczeniu jeden pod drugim dwóch tekstów pisanych w języku polskim. Oczywiście podobnie jak w przypadku parametru Kr jest to jedynie wartość najbardziej prawdopodobna i w konkretnym przypadku może ona być nieco inna, jednak różnica między Kp i Kr jest wystarczająco duża, by wykorzystać ją w praktyce. Aby zademonstrować działanie testu zgodności, proponuję posłużyć się dwoma tekstami zaszyfrowanymi szyfrem Vigenere’a przy użyciu tego samego klucza (oba zdania pochodzą z dodatku C). Tekst 1. Bywają sytuacje, kiedy wiedza kryptologiczna służy do odszyfrowania wiadomości, które pierwotnie wcale nie miały być przed nikim ukryte. Tekst 2. Podczas licznych wykopalisk archeologicznych naukowcy często natrafiają na ślady po dawno upadłych i nieraz zapomnianych cywilizacjach. Za klucz posłuży tu wypowiedź Carla Friedricha Gaussa rozpoczynająca ten rozdział. Do szyfrowania wykorzystuję tablicę Vigenere’a dla polskiego alfabetu, przedstawioną w tabeli 2.2.
76
Podstawy kryptografii
Tabela 2.1. Częstość występowania liter w języku polskim Litery alfabetycznie
Litery według częstości występowania
Litera
Częstość
Litera
Częstość
A
8,61 %
E
8,87 %
Ą
1,11 %
I
8,65 %
B
1,49 %
A
8,61 %
C
3,82 %
O
7,34 %
Ć
0,56 %
Z
5,67 %
D
3,33 %
N
5,60 %
E
8,87 %
T
4,30 %
Ę
1,40 %
W
4,25 %
F
0,36 %
S
4,17 %
G
1,40 %
Y
3,85 %
H
0,93 %
C
3,82 %
I
8,65 %
R
3,72 %
J
2,81 %
M
3,35 %
K
2,95 %
D
3,33 %
L
2,19 %
K
2,95 %
Ł
1,36 %
J
2,81 %
M
3,35 %
P
2,74 %
N
5,60 %
L
2,19 %
Ń
0,12 %
U
2,05 %
O
7,34 %
B
1,49 %
Ó
0,79 %
Ę
1,40 %
P
2,74 %
G
1,40 %
R
3,72 %
Ł
1,36 %
S
4,17 %
Ż
1,24 %
Ś
0,84 %
Ą
1,11 %
T
4,30 %
H
0,93 %
U
2,05 %
Ś
0,84 %
W
4,25 %
Ó
0,79 %
Y
3,85 %
Ć
0,56 %
Z
5,67 %
F
0,36 %
Ź
0,06 %
Ń
0,12 %
Ż
1,24 %
Ź
0,06 %
Źródło: www.wikipedia.pl.
Rozdział 2. Matematyczne podstawy kryptografii
77
Tabela 2.2. Tablica Vigenere’a dla polskiego alfabetu A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A
Ą B C Ć D E Ę F G H I
J
B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą
C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B
Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C
D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D
E Ę F G H I
J
Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E
F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę
G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F
H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G
I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K
Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L
M N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł
N Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M
Ń O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N
O Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń
Ó P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O
P R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó
R S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P
S Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R
Ś T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S
T U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś
U W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T
W Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U
Y Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W
Z Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y
Ż Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z
Ź A Ą B C Ć D E Ę F G H I
J
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż
A Ą B C Ć D E Ę F G H I
K L Ł M N Ń O Ó P R S Ś T U W Y Z Ż Ź
J
Przyjmijmy, iż w tym systemie szyfrowania początek klucza przesuwany jest o 2 miejsca w prawo dla każdego kolejnego tekstu jawnego. Dla pierwszego tekstu będzie on miał pierwotną postać, natomiast dla drugiego rozpocznie się od trzeciej z kolei litery. W związku z tym pierwsza litera tekstu 2. jest szyfrowana tym samym kluczem, co trzecia litera tekstu 1. (druga tym samym co czwarta itd.). Jeśli ułożymy kryptogramy w taki sposób, aby litery szyfrowane tym samym kluczem znajdowały się bezpośrednio nad sobą, prawdopodobieństwo wystąpienia par takich samych liter będzie równe Kp.
78
Podstawy kryptografii
W przeciwnym wypadku szansa na to będzie taka sama jak w przypadku losowego doboru liter, a więc równa Kr. W rezultacie liczba zgodnych par w przypadku złego zestawienia wynosić będzie Kr×25 = 3,125%×25 = 0,78, a dla dobrze dopasowanych kryptogramów — Kp×25 = 5,12%×25 = 1,28. Oznacza to, że dla źle zestawionych kryptogramów wynikiem będzie jedna para takich samych liter bądź nie będzie jej wcale (szansa na dwie i więcej par jest minimalna), natomiast w przypadku dobrego zestawienia oczekiwać możemy co najmniej jednej lub dwóch par liter. Sprawdźmy to na przykładzie. Na początek trzeba ustawić kryptogramy bezpośrednio nad sobą: K1
S
Ń L
K2
F
P
B
U Ę
Ę
Ł
Ż
M Ó Ą Z
O G K O Y Ć
Ź
Ą L
Ś
N K Y D A E
Y Ó P
W E
Ś
R
L
C
Ę
Ń
I
O
Ń B
C
R
Z
C
Jak widać, nie pojawiła się ani jedna para takich samych liter. Spróbujmy więc przesunąć pierwszy kryptogram o jedno miejsce w lewo: K1
Ń L
B
K2
F
O G K O Y Ć
P
U Ę
Ę
Ł
Ż
M Ó Ą S
N K Y D A E
L
C
Ę
Ń
I
O
J
Ź
Y Ó P
R
Ń B
C
R
Z
C
Ą L
Ś
W E
Ś
To ustawienie również nie wydaje się poprawne. Dokonujemy więc kolejnego przesunięcia: K1
L
B
U Ę
Ę
Ł
Ż
M Ó Ą
K2
F
P
O G K O Y Ć
Ź
S
Ą L
N K Y D A E
L
C
Ę
Ń
I
O
J
S
Ś
Ś
R
Ń B
C
R
Z
C
Y Ó P
W E
Pojawiły się dwie pary liter (ą oraz e). Wynik sugeruje, iż znajdujące się nad sobą litery kryptogramów szyfrowane są przy użyciu tego samego klucza. Jest to zgodne z prawdą, ponieważ dla drugiego kryptogramu przesunęliśmy klucz o dwa miejsca w prawo. Dzięki testowi zgodności Kappa jesteśmy więc w stanie stwierdzić, czy dwa kryptogramy były szyfrowane tym samym kluczem. Możemy dobrać ich litery w pary odpowiadające tej samej literze klucza. W tym przypadku niewiele to jeszcze daje, jeśli jednak uda nam się wejść w posiadanie kilkudziesięciu lub kilkuset tekstów tajnych, możemy poustawiać je w analogiczny sposób i uzyskać kilkudziesięcio- lub kilkusetliterowe grupy odpowiadające tej samej literze klucza. Grupy te są zwykłym szyfrem monoalfabetycznym, łatwym do złamania przy większej ilości materiału badawczego. Dzięki temu możliwe jest zrekonstruowanie całego klucza i złamanie szyfru.
2.2.8.3. Test zgodności Fi Ten test również oparty jest na parametrach Kr oraz Kp. Pozwala on stwierdzić, czy dane szyfrowanie jest mono-, czy polialfabetyczne. Dzięki temu możliwe jest także sprawdzenie, czy wyznaczony przez nas okres szyfrowania w szyfrze polialfabetycznym jest poprawny. Na przykład po przeprowadzeniu opisanego w poprzednim podrozdziale testu Kappa dla kilkudziesięciu wiadomości możemy zweryfikować poprawność wyników za pomocą testu Fi. Wystarczy sprawdzić, czy uzyskane w pionie zestawienia liter tworzą szyfr monoalfabetyczny. Jeśli tak — szyfrowane są tą samą literą klucza,
Rozdział 2. Matematyczne podstawy kryptografii
79
a więc uzyskane zestawienie jest właściwe. Jeśli nie, oznacza to najprawdopodobniej, iż zbieżność par liter była przypadkowa. Najwyższy czas zabrać się za przetestowanie polialfabetyczności pierwszego z tekstów użytych w poprzednim przykładzie. Następnym krokiem będzie zaszyfrowanie go systemem monoalfabetycznym, by porównać wyniki dla obu przypadków. Podczas przeprowadzania testu Fi w pierwszej kolejności obliczyć musimy parametry r oraz p dla danego tekstu według następujących wzorów:
r N ( N 1) K r
p N ( N 1) K p gdzie: N — liczba znaków badanego szyfrogramu,
r — polialfabetyczne oczekiwane Fi, p — monoalfabetyczne oczekiwane Fi. Dla wykorzystywanego tutaj tekstu wartości te kształtują się następująco:
r 25 24 0,03125 18,75 p 25 24 0,0512 30,7 Kolejnym krokiem jest obliczenie częstości występowania liter w szyfrogramie. W naszym przypadku wyniki kształtują się następująco: Ę—3 Ń, L — 2 A, Ą, B, C, D, E, I, K, Ł, M, N, O, Ó, S, U, Y, Z, Ż — 1 Należy teraz pomnożyć częstość każdej z liter przez liczbę o jeden mniejszą od częstości jej występowania i zsumować otrzymane wyniki. W omawianym szyfrogramie istotną rolę odegrają jedynie litery Ę, Ń i L, ponieważ pozostałe częstości pomnożyć trzeba przez 0, a więc nie zwiększą one końcowej sumy: S 2 3 2 1 2 1 10
Otrzymany wynik porównujemy z oczekiwanymi Fi dla szyfrowania polialfabetycznego i monoalfabetycznego. W ten sposób określamy, jaki typ szyfrowania został wykorzystany w danym kryptogramie. W tym przypadku wynik świadczy o szyfrowaniu polialfabetycznym. Ten sam tekst można też zaszyfrować monoalfabetycznie. Aby nie komplikować zbytnio tej operacji, poprzestanę na przesunięciu każdej litery o jedno miejsce dalej w alfabecie. Pierwszych 25 liter kryptogramu układa się tak: CZYĄKBŚZUWĄĆKĘLJĘEZYJĘEŻĄL
80
Podstawy kryptografii
Ponownie zliczamy częstości występowania liter: Ą, Ę, Z — 3, E, J, K, L, Y — 2, C B Ś U W Ć Ż — 1, a potem obliczamy współczynnik S: S 3 2 3 2 3 2 2 1 2 1 2 1 2 1 2 1 28
Jak widać, jest on niemal trzykrotnie większy od otrzymanego w pierwszym przypadku; poza tym jego wartość jest zbliżona do wartości oczekiwanej Fi dla szyfru monoalfabetycznego.
2.2.8.4. Test zgodności Chi Test Chi stosujemy wówczas, gdy chcemy określić, czy dwa kryptogramy zostały zaszyfrowane tym samym kluczem. Jedyną wymaganą informacją jest to, czy szyfr jest poli-, czy monoalfabetyczny. Możemy to jednak określić za pomocą testu Fi. Podobnie jak w przypadku poprzedniego testu, tutaj również wyznaczyć trzeba pewną wartość oczekiwaną, do której porównywać będziemy wyniki obliczeń. Wartością tą jest tzw. oczekiwane Chi, wyznaczane z poniższego wzoru:
p N1 N 2 K p r N1 N 2 K r gdzie: N1, N2 — liczba znaków w porównywanych szyfrogramach,
p — Chi oczekiwane dla rozkładów (szyfrów) monoalfabetycznych, r — Chi oczekiwane dla rozkładów (szyfrów) polialfabetycznych. Jeśli szyfrogramy są monoalfabetyczne, stosujemy Kp, jeśli polialfabetyczne — Kr. Po wyznaczeniu oczekiwanego Chi zliczamy liczby poszczególnych liter w obu kryptogramach, po czym mnożymy te wartości przez siebie. Otrzymane wyniki sumujemy i porównujemy z oczekiwanym Chi dla danej pary kryptogramów. Dla tekstów zaszyfrowanych w taki sam sposób obie wartości powinny być podobne. W poprzednim podrozdziale jeden z przykładowych tekstów został zaszyfrowany monoalfabetycznie. Pora zająć się drugim w analogiczny sposób, po czym porównać kryptogramy przy użyciu testu Chi. Po przesunięciu o jedno miejsce dalej w alfabecie drugi z zastosowanych tekstów przekształca się w następujący kryptogram (ponownie przytaczam jedynie pierwszych 25 liter): RÓEĆŻĄŚŁJĆŻŃZĆIYZLÓRĄŁJŚL
Rozdział 2. Matematyczne podstawy kryptografii
81
Porównajmy go teraz z pierwszym tekstem zaszyfrowanym tą samą metodą. W tym celu obliczmy oczekiwane Chi:
p 25 25 0,0512 32 Następnie zliczamy częstości liter występujących w szyfrogramach i wyznaczamy ich iloczyny: L
Ą
B
C
Ć
E
Ę
I
J
K
L
Ł
Ń
Ó
R
Ś
U
Y
Z
Ż
K1
3
1
1
1
2
3
1
2
2
1
0
0
0
0
1
1
2
3
1
K2
2
0
0
3
1
0
1
2
0
2
2
1
2
2
2
0
1
2
2
×
6
0
0
3
2
0
1
4
0
2
0
0
0
0
2
0
2
6
2
Suma iloczynów wynosi 30. Jest bardzo zbliżona do wartości oczekiwanej Chi, co świadczy o tym, że szyfry stworzono przy użyciu tej samej metody. Dla porównania zaszyfrujemy teraz monoalfabetycznie początek kolejnego zdania z dodatku C. Tym razem przesuwamy każdą literę o dwa miejsca dalej w alfabecie. Tak więc: Tekst jawny: C Y W I L I Z A C J E T E W W I E L U P R Z Y P A Kryptogram: D Ż Z K M K Ź B D L F W F Z Z K F M Y S Ś Ź Ż S B …. Nowy kryptogram również zawiera 25 znaków, zatem oczekiwane Chi pozostaje takie samo. Przy porównaniu nowego tekstu z pozostałymi otrzymujemy: L
Ą
B
C
Ć
D
E
Ę
F
J
K
L
M
S
Ś
U
W
Y
Z
Ż
Ź
K1
3
1
1
1
0
2
3
0
2
2
2
0
0
1
1
1
2
3
1
0
K3
0
2
0
0
2
0
0
3
0
3
1
2
2
1
0
1
1
3
2
2
×
0
2
0
0
0
0
0
0
0
6
2
0
0
1
0
1
2
9
2
0
L
Ą
B
Ć
D
E
F
I
J
K
L
Ł
M
Ń
Ó
R
S
Ś
W
Y
Z
Ż
Ź
K2
2
0
3
0
1
0
1
2
0
2
2
0
1
2
2
0
2
0
1
2
2
0
K3
0
2
0
2
0
3
0
0
3
1
0
2
0
0
0
2
1
1
1
3
2
2
×
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
2
0
1
6
4
0
W pierwszym przypadku suma iloczynów wynosi 25, a więc o 25% mniej niż oczekiwane Chi. O ile ten wynik można jeszcze różnie interpretować, o tyle przy drugim tekście (suma iloczynów równa 15) różnica jest ewidentna. Niepewny rezultat w pierwszym przypadku jest efektem przypadkowej zbieżności, która znacznie zawyża sumę iloczynów. W pierwszym tekście jawnym trzy razy pojawia się litera Y, natomiast w drugim — W. Obie w swoich systemach zostają zaszyfrowane jako Z, czego rezultatem jest wysoka zbieżność tych liter. Dla większej próby statystycznej zmniejsza się prawdopodobieństwo wystąpienia podobnych sytuacji.
82
Podstawy kryptografii
Aby nie komplikować całego przykładu, przytoczona tabela częstości nie uwzględnia spacji, cyfr oraz innych znaków również występujących w tekstach. Dodatkowo dane statystyczne dotyczące częstości mogą się różnić nawet w obrębie jednego języka w zależności od rodzaju badanego tekstu. Na przykład w opracowaniach z dziedziny informatyki czy matematyki cyfry występować będą zdecydowanie częściej niż w przypadku prozy literackiej. Wszystko więc zależy od konkretnej sytuacji i posiadanej wiedzy na temat analizowanej wiadomości. W książce Ochrona danych i zabezpieczenia w systemach teleinformatycznych [4] podano dokładne dane dotyczące częstotliwości występowania różnych znaków w tekstach literackich oraz informatycznych dla języka polskiego i angielskiego.
2.2.9. Złożoność algorytmów Złożoność algorytmów jest częścią bardziej ogólnej teorii złożoności, która zajmuje się określaniem czasu potrzebnego do rozwiązania problemów obliczeniowych. W ramach tej teorii analizie poddawane są zarówno problemy, jak i potencjalne sposoby ich rozwiązania. Jest to bardzo istotne z punktu widzenia kryptografii, ponieważ pozwala ustalić, czy dany problem da się rozwiązać, a jeśli tak, to czy da się to zrobić w rozsądnym czasie. Dzięki temu można określić bezpieczeństwo kryptosystemu, nie zawsze bowiem możliwość przełamania jego zabezpieczeń oznacza bezużyteczność szyfru. Może się przecież okazać, iż złamanie szyfru wymaga czasu i nakładu środków nieproporcjonalnych do potencjalnych zysków. W takiej sytuacji można uznać zabezpieczenia za wystarczające. Złożoność obliczeniową algorytmów wyrażamy za pomocą tzw. notacji wielkiego O. Opisuje ona rząd wielkości złożoności obliczeniowej zależny od długości ciągu wejściowego danych oznaczanego jako n. Wielkość ta jest mierzona przy użyciu dwóch zmiennych: S — złożoność przestrzenna algorytmu, czyli inaczej ilość potrzebnej do jego
realizacji pamięci operacyjnej; T — złożoność czasowa.
Notacja wielkiego O odzwierciedla ten składnik złożoności, który rośnie najszybciej. Pozostałe składniki są pomijane. Dla przykładu: jeśli złożoność przestrzenna algorytmu wyrażana jest wzorem: S 3n 3 5n 2
to złożoność obliczeniowa w notacji wielkiego O wynosić będzie O(n3). Mówimy wówczas o złożoności rzędu n3. Co w praktyce oznacza rząd złożoności? Pokazuje on, w jaki sposób zmiana długości ciągu wejściowego wpłynie na czas lub pamięć potrzebne do przeprowadzenia zawartych w algorytmie operacji. Jeśli mamy do czynienia z algorytmem o złożoności przestrzennej rzędu n, to zależność ta jest liniowa. Innymi słowy, podwojenie ciągu wejściowego spowoduje podwojenie koniecznej do realizacji algorytmu pamięci. Wyjątkowo złożone są algorytmy rzędu O(mn), gdzie m jest stałą. Dodanie jednego bitu do n zwiększa
Rozdział 2. Matematyczne podstawy kryptografii
83
w ich przypadku złożoność m razy. Jeśli więc mamy algorytm o złożoności O(2n) i dodamy do ciągu wejściowego 2 bity, to złożoność wzrośnie czterokrotnie. Zapis O(1) oznacza, iż złożoność algorytmu jest niezależna od długości ciągu wejściowego. Spójrzmy na to od strony praktycznej. Załóżmy, że mamy za zadanie ocenić bezpieczeństwo kryptosystemu w zależności od długości klucza w przypadku ataku metodą pełnego przeglądu. Innymi słowy, musimy sprawdzić, jak długość klucza wpływa na złożoność obliczeniową algorytmu kryptoanalitycznego. Pozwala to ocenić, czy zastosowana długość wystarcza do zapewnienia bezpieczeństwa, poprzez porównanie ustalonej złożoności z możliwościami współczesnych komputerów. Zaczynamy od klucza o długości 2 bitów. W takim przypadku możliwe są tylko 4 klucze (00, 01, 10, 11). Po dodaniu jednego bitu możliwości będzie już 8 (000, 001, 010, 011, 100, 101, 110, 111). Kolejny bit zwiększa tę liczbę do 16. Jak widać, każdy dodany bit klucza podwaja złożoność obliczeniową algorytmu kryptoanalitycznego. Można ją zatem określić jako O(2n). Właśnie poprzez taką analizę skrócenie klucza algorytmu DES wzbudziło tyle kontrowersji w czasie, kiedy był on wprowadzany na rynek jako obowiązujący standard. Jak pamiętacie z rozdziału 1., NSA nalegała na skrócenie klucza ze 112 do 56 bitów. Klucz 56-bitowy wymagał przeprowadzenia około 72 biliardów operacji w celu złamania szyfru metodą pełnego przeglądu. Ta liczba leżała wówczas na granicy możliwości najnowocześniejszych komputerów. Warto jednak zwrócić uwagę, iż mówimy tu o dostępnych powszechnie komputerach, natomiast NSA najprawdopodobniej dysponowała znacznie bardziej zaawansowanym technicznie sprzętem. Opierając się na wyznaczonej przed chwilą złożoności obliczeniowej, możemy stwierdzić, iż pozostawienie pierwotnie proponowanej długości klucza zwiększyłoby potrzebną do złamania szyfru liczbę operacji około 72 biliardy razy. Zdecydowanie była to liczba przekraczająca nawet możliwości NSA. Wiele osób właśnie w tym upatruje przyczyn nacisków na skrócenie klucza ze strony agencji. Umożliwiło jej to bowiem (wedle wszelkiego prawdopodobieństwa) uzyskanie monopolu na łamanie kryptogramów sporządzonych za pomocą DES-a.
2.2.10. Teoria informacji Teoria informacji opracowana została przez Claude’a Elmwooda Shannona — doktora matematyki Massachusetts Institute of Technology. Opiera się ona na założeniu, iż język, którym się posługujemy, cechuje duża nadmiarowość. Innymi słowy, używamy więcej znaków i słów, niż jest to konieczne do przekazania danej treści. Większa nadmiarowość ułatwia kryptoanalizę tekstu oraz zwiększa ilość pamięci potrzebnej do zapisania danych. Zdefiniowane przez Shannona pojęcia i wzory pozwalają na ilościowe opisanie nadmiarowości języka, a także na teoretyczną analizę jego podatności na ataki kryptoanalityczne.
2.2.10.1. Entropia Zanim przejdę do opisywania i mierzenia nadmiarowości języka, muszę zdefiniować pojęcie entropii. Nie należy mylić tego pojęcia z entropią w sensie fizycznym (rozumianą jako stopień nieuporządkowania materii). W teorii informacji entropię wiadomości M rozumiemy jako miarę zawartej w niej liczby informacji i obliczamy ze wzoru:
84
Podstawy kryptografii
H ( M ) log 2 n ,
gdzie n jest liczbą możliwych znaczeń wiadomości przy założeniu, że każde znaczenie jest tak samo prawdopodobne. Wspomniana liczba informacji oznacza minimalną liczbę bitów potrzebnych do zapisania owych n znaczeń wiadomości. Wygląda na skomplikowane, prawda? Na szczęście to tylko pozory. Aby wytłumaczyć to zagadnienie, posłużę się poniższym przykładem. Załóżmy, że w bazie danych chcemy zapisać informację identyfikującą nazwę miesiąca. Każdej możliwej nazwie przypisujemy inną kombinację bitów i uzyskujemy wynik: 0000 = styczeń 0001 = luty 0010 = marzec 0011 = kwiecień 0100 = maj 0101 = czerwiec 0110 = lipiec 0111 = sierpień 1000 = wrzesień 1001 = październik 1010 = listopad 1011 = grudzień 1100, 1101, 1110, 1111 = kombinacje niewykorzystane. Liczba możliwych znaczeń wiadomości n wynosi zatem 12. Teraz trzeba podstawić tę wartość do wzoru na entropię:
H ( M ) log 2 12 3,6 Taka minimalnie liczba bitów jest nam potrzebna, aby przekazać wiadomość o numerze miesiąca. Oczywiście jest to czysto teoretyczna wielkość, gdyż bit jest wielkością niepodzielną, wystarczy jednak zaokrąglić otrzymaną liczbę w górę, by otrzymać wielkość bardziej praktyczną. A co jeśli zdarzeń nie cechuje równomierny rozkład prawdopodobieństwa? Wówczas posługujemy się następującym wzorem: H ( M ) P ( M x) log 2 P ( M x) , x
Rozdział 2. Matematyczne podstawy kryptografii
85
gdzie: P(M = x) jest prawdopodobieństwem zdarzenia polegającego na przybraniu przez wiadomość wartości x. Rozważmy następującą sytuację. Wiadomość ma postać słowa 2-bitowego. Teoretycznie ma więc 4 możliwe znaczenia, jednak z pewnych względów jedna z kombinacji nie pojawia się wcale, natomiast inna występuje dwa razy częściej niż dwie pozostałe. Mamy więc: x1 = 00 i P(M = x1) = 1/2 x2 = 01 i P(M = x2) = 1/4 x3 = 10 i P(M = x3) = 1/4 x4 = 11 i P(M = x4) = 0 Po podstawieniu do wzoru: H ( M ) [(1/ 2 log 2 1 / 2) (1 / 4 log 2 1 / 4) (1/ 4 log 2 1 / 4)] [(1 / 2 1) (1 / 4 2) (1 / 4 2)] (1 / 2 1 / 2 1 / 2) 1,5
Taka minimalnie liczba bitów jest nam potrzebna do zapisania wszelkich możliwych wariantów wiadomości. Po raz kolejny otrzymana wartość jest czysto teoretyczna i musimy zaokrąglić wynik (praktyczne wykorzystywanie entropii wyrażonej ułamkiem omówię za chwilę).
2.2.10.2. Nadmiarowość i zawartość informacyjna języka Nadmiarowość języka D oznacza liczbę nadmiarowych informacji przenoszonych przez wiadomość w danym języku. Obliczamy ją w następujący sposób: D Rr
gdzie: r — zawartość informacyjna języka, R — bezwzględna zawartość informacyjna języka. Wartości te określane są wzorami: r H (M ) / N
dla N oznaczającego długość wiadomości w bitach oraz R log 2 L
gdzie L oznacza liczbę znaków używanych w danym alfabecie. Dla przykładu język polski posiada bezwzględną nadmiarowość równą: log 2 32 5
co oznacza, że każdemu znakowi w naszym języku można przyporządkować maksymalnie 5 bitów.
86
Podstawy kryptografii
2.2.10.3. Odległość jednostkowa Dla systemów kryptografii symetrycznej odległość jednostkowa obliczana jest następująco: U H (K ) / D ,
gdzie H(K) jest miarą entropii kryptosystemu obliczaną z poniższego wzoru: H ( K ) log 2 K
K oznacza tutaj liczbę możliwych kluczy. Entropia kryptosystemu wynosi tyle, ile długość stosowanych kluczy, a więc przy długości 128 bitów wynosi 128, przy długości 256 bitów — 256 itd. Odległość jednostkowa oznacza minimalną długość szyfrogramu utworzonego w danym systemie kryptograficznym konieczną do jego jednoznacznego odszyfrowania. Innymi słowy, dla kryptogramów krótszych istnieje więcej niż jeden tekst jawny pasujący do danego szyfrogramu. W związku z tym nawet po przeprowadzeniu skutecznej kryptoanalizy (takiej, w wyniku której otrzymano sensowny tekst) nie mamy pewności, iż uzyskana wiadomość jest właściwym tekstem jawnym. Warunek ten spełnia jedynie kryptosystem z kluczem jednorazowym. Idealny kryptosystem powinien mieć nieskończoną odległość jednostkową, w praktyce jednak jest to nieosiągalne. Przyjmuje się zatem, iż odległość jednostkowa powinna być jak najdłuższa.
2.2.10.4. Jak to wygląda w praktyce? Jak zwykle, praktyka odbiega nieco od teorii. W tym przypadku również wszystko pięknie wygląda na papierze, a zupełnie inaczej w rzeczywistości. Miara odległości jednostkowej o niczym nie przesądza. Nawet jej bardzo duża wartość nie gwarantuje bezpieczeństwa. Poza tym jest ona jedynie pojęciem probabilistycznym, a więc wyznacza długość szyfrogramu, powyżej której jednoznaczne odszyfrowanie jest teoretycznie możliwe. W praktyce jednak może się to okazać niewykonalne. Podobnie ma się sprawa z nadmiarowością. Tu również obliczone wskaźniki o niczym nie przesądzają. Niemniej jednak na gruncie tej teorii prowadzić można dalsze rozważania i określać ogólne wytyczne dotyczące projektowania systemów bezpieczeństwa opartych na szyfrach. Dobrym przykładem może być określanie okresu czasu, po jakim należy dokonać zmiany klucza szyfrującego w używanym systemie. Również kryptoanalitycy wykorzystywać mogą dorobek teorii informacji podczas łamania zabezpieczeń. Przydatne są tutaj zwłaszcza informacje na temat nadmiarowości danego języka. Entropia z kolei może być wykorzystywana do pomiarów losowości słów bitowych, co jest przydatne przy ocenie generatorów liczb losowych. Idealny generator powinien generować każdą liczbę z zadanego przedziału z takim samym prawdopodobieństwem. Innymi słowy, wiadomość M o długości n przedstawiająca wartość wygenerowanej liczby powinna mieć entropię = n. W praktyce jednak bardzo trudno uzyskać pełną losowość generowanych liczb, gdyż do ich tworzenia niezbędne jest tzw. ziarno. Szerzej tym zagadnieniem zajmę się w następnym rozdziale, tu wystarczy zaznaczyć, że ziarno to tworzone jest na podstawie rozmaitych parametrów o charakterze losowym.
Rozdział 2. Matematyczne podstawy kryptografii
87
Typowym przykładem ziarna jest częstotliwość naciskania klawiszy przez użytkownika. Ponieważ jednak często generatory liczb losowych są do pewnego stopnia przewidywalne, możliwe jest wyeliminowanie pewnych wartości, a co za tym idzie — zmniejszenie entropii wiadomości M stanowiącej wynik ich działania. Dlatego częściej w terminologii informatycznej mówi się o generatorach liczb pseudolosowych. Pamiętacie przytoczony wcześniej przykład ze słowem 2-bitowym? Obliczona w nim entropia wynosiła 1,5. Pozornie ten wynik niewiele nam dawał, ponieważ i tak wymagał zaokrąglenia, aby można było otrzymać realną liczbę bitów potrzebnych do zapisu wiadomości. Gdyby jednak omawiane słowo 2-bitowe było efektem działania generatora liczb pseudolosowych, uzyskalibyśmy precyzyjną ocenę jego funkcjonalności. Optymalna entropia w tym przypadku wynosi 2 bity, a wynik odbiega od niej o 25%. W ten sposób dzięki wyznaczaniu entropii uzyskać można wymierną ocenę jakości naszego generatora.
2.2.10.5. Mieszanie i rozpraszanie W ramach teorii informacji Shannon wyodrębnił dwie techniki, dzięki którym można zmniejszyć nadmiarowość tekstu jawnego w procesie szyfrowania, co znacznie utrudnia kryptoanalizę. Techniki te znane są jako mieszanie i rozpraszanie. a) Mieszanie — podstawowa technika szyfrowania. Polega na maksymalnym zmniejszeniu związku między pierwotnym tekstem a jego szyfrogramem. Im mniej zależności da się wyodrębnić, tym lepiej. Samo mieszanie może jednak nie wystarczyć. Za przykład niech posłuży choćby przypadek Enigmy, gdzie metoda podstawienia zmieniana była z każdym znakiem szyfrogramu. Szyfr został mimo to złamany dzięki wykorzystaniu kilku jego słabych punktów (takich jak generowanie wzorca negatywnego). Nie bez znaczenia był tu również czynnik ludzki w postaci leniwych szyfrantów niemieckiej armii. b) Rozpraszanie — stosowane do zmniejszania nadmiarowości tekstu jawnego. Dzięki poprawnemu zastosowaniu tej techniki nadmiarowość zostaje rozproszona po całym szyfrogramie, co znacznie utrudnia zadanie kryptoanalitykowi. Przykładem zastosowania tej techniki są popularne w szyfrach blokowych S-bloki. Ogólniej mówiąc, dobrym sposobem na uzyskanie efektu rozproszenia jest zastosowanie permutacji (transpozycji) tekstu w czasie szyfrowania. W praktyce najlepszy efekt daje zastosowanie obu tych technik jednocześnie. W ten sposób konstruowane są szyfry blokowe, w których mieszanie uzyskuje się za pomocą operacji XOR, a za rozpraszanie odpowiedzialne są wspomniane S-bloki.
88
Podstawy kryptografii
Rozdział 3.
Kryptografia w teorii Rządy mają masę tajemnic przed swoim ludem […]. Dlaczego lud nie może mieć w rewanżu tajemnic przed rządem? Philip Zimmerman Kiedyś w wyniku złamania szyfru ginęli ludzie, dziś zostaną tylko wyczyszczone nasze konta bankowe. Reinhard Wobst Standard jest skończony wtedy, gdy wszyscy są w równym stopniu niezadowoleni z wyniku. Niels Ferguson
3.1. Ataki kryptoanalityczne i nie tylko Aby zaprojektować i zaimplementować bezpieczny system szyfrujący, należy poznać różne rodzaje ataków, na jakie system ten może być narażony. Dzięki temu można wprowadzić dodatkowe zabezpieczenia uniemożliwiające złamanie szyfru przy użyciu danej metody. Wiedza na temat potencjalnych metod ataku pozwala również lepiej ocenić bezpieczeństwo danego systemu zabezpieczeń.
3.1.1. Metody kryptoanalityczne Wyróżniamy następujące metody łamania zaszyfrowanych tekstów: łamanie metodą pełnego przeglądu, łamanie z szyfrogramami, łamanie ze znanym tekstem jawnym, łamanie z wybranym tekstem jawnym,
90
Podstawy kryptografii łamanie z wybranym szyfrogramem, łamanie z adaptacyjnie wybranym tekstem jawnym.
Łamanie metodą pełnego przeglądu (ang. brute-force attack) polega na wypróbowywaniu kolejnych kluczy z całej ich przestrzeni aż do natrafienia na sensowne rozwiązanie. Siła tej metody leży głównie w mocy obliczeniowej komputera. Im więcej kluczy w określonym czasie jesteśmy w stanie wypróbować, tym większa szansa powodzenia. Oczywiście ważna jest też liczba kluczy dostępnych w danej przestrzeni. W niektórych przypadkach jest ona bowiem zbyt duża, by metoda pełnego przeglądu miała szansę powodzenia. Łamanie z szyfrogramami (ang. ciphertext-only attack) polega na odtworzeniu tekstu jawnego jedynie na podstawie szyfrogramu. Kryptoanalityk dysponuje zbiorem wiadomości zaszyfrowanych tym samym algorytmem i na ich podstawie musi wydedukować klucz szyfrujący lub przynajmniej odszyfrować część wiadomości. Obok metody pełnego przeglądu jest to jedna z najczęściej stosowanych metod, ponieważ tekst tajny to bardzo często jedyny materiał do badań dostępny kryptoanalitykowi. W przypadku łamania ze znanym tekstem jawnym (ang. known-plaintext attack) deszyfrujący zna tekst jawny kilku wiadomości, a jego zadaniem jest odgadnięcie klucza lub algorytmu deszyfracji. Często nie chodzi tutaj o znajomość całej wiadomości, a jedynie jej fragmentu. Wiemy na przykład, że wiadomość zaczyna się od sformułowania „Z przykrością informujemy, że…” (bądź możemy to założyć z dużą dozą prawdopodobieństwa). Dzięki temu łatwiej jest wywnioskować, jaki klucz użyty został do szyfrowania. Łamanie z wybranym tekstem jawnym (ang. chosen-plaintext attack) polega na tym, że kryptoanalityk sam wybiera tekst jawny, który ma być zaszyfrowany przy użyciu łamanego algorytmu. Jest to dla deszyfrującego sytuacja wygodniejsza niż w metodzie łamania ze znanym tekstem jawnym, gdyż może on tak dobrać tekst jawny, aby zdradzał on więcej informacji o kluczu. Podobnie jak w łamaniu z tekstem jawnym celem ataku jest tu uzyskanie klucza bądź algorytmu deszyfrującego. Anglicy posługiwali się tą metodą podczas II wojny światowej przy łamaniu szyfrów Enigmy. Swoimi działaniami zmuszali niemieckie oddziały do wysyłania komunikatów o określonej treści, a następnie przechwytywali szyfrogramy. Współcześnie atak z wybranym tekstem jawnym często stosuje się przeciwko systemom baz danych — atakujący wprowadza określone informacje (rekordy) do bazy, a następnie porównuje je z powstałymi na ich podstawie szyfrogramami. Atak taki przeprowadza się po uzyskaniu dostępu do bazy danych, ale przed złamaniem chroniących ją szyfrów, które stanowią z reguły ostatnią linię obrony. Wprowadzenie danych do bazy na ogół nie jest trudne, zwłaszcza w przypadku baz obsługujących sklepy internetowe, w których każdy może się zarejestrować i wysłać dowolne zamówienie. Łamanie z wybranym szyfrogramem (ang. chosen-ciphertext attack) umożliwia atakującemu wybór konkretnych szyfrogramów i dostęp do ich tekstów jawnych. Zadanie kryptoanalityka polega na opracowaniu metody automatycznego dekryptażu, aby następnie za jej pomocą znaleźć klucz. Jest to metoda stosowana przede wszystkim w systemach z kluczem publicznym, ale może być także skuteczna w systemach opartych na szyfrowaniu symetrycznym.
Rozdział 3. Kryptografia w teorii
91
Łamanie z adaptacyjnie wybranym tekstem jawnym (ang. adaptive-chosen-plaintext attack) jest dość rzadko stosowaną metodą, w której deszyfrujący może kilkakrotnie wybierać tekst do zaszyfrowania w zależności od uzyskanych wcześniej wyników. Daje to duże możliwości w badaniach nad systemem szyfrującym, gdyż kryptoanalityk ma możliwość sprawdzenia, jak zmienia się szyfrogram wiadomości po wprowadzeniu w niej określonych zmian.
3.1.2. Kryptoanaliza liniowa i różnicowa Kryptoanaliza liniowa i różnicowa stanowią nowe metody łamania zaawansowanych algorytmów szyfrujących. Z ich wykorzystaniem złamano m.in. algorytm FEAL. Udowodniono również, że złamanie innych algorytmów w ten sposób rokuje większe nadzieje niż metoda pełnego przeglądu, nadal jednak wymaga zbyt dużej ilości materiału kryptoanalitycznego, by wyjść poza obszar rozważań teoretycznych.
3.1.2.1. Kryptoanaliza różnicowa Metoda kryptoanalizy różnicowej została wprowadzona w 1990 roku przez E. Bihama i A. Shamira. Należy ona do klasy ataków z wybranym tekstem jawnym. Kryptoanalityk wybiera do zaszyfrowania dwa teksty różniące się w ustalony sposób. To, w jaki sposób teksty te powinny się różnić, zależy do konkretnego algorytmu (na przykład w przypadku DES różnice opierają się na matematycznych właściwościach operacji XOR). Następnie podczas analizy szyfrogramów ogranicza się przestrzeń możliwych kluczy. W końcowej fazie, gdy badane są różnice między wybranymi szyfrogramami, przypisuje się prawdopodobieństwo poszczególnym kluczom. W trakcie analizowania kolejnych par szyfrogramów jeden z kluczy okazuje się najbardziej prawdopodobny. Jest to klucz zastosowany do szyfrowania. Wadą kryptoanalizy różnicowej jest to, że wymaga bardzo dużej liczby par tekstu do analizy. W kryptoanalizie różnicowej bardzo istotne są tzw. charakterystyki. Mówiąc najprościej, są to rozbieżności między szyfrogramami wynikające z różnic między tekstami jawnymi. Są one tym bardziej rozbudowane, im więcej cykli posiada algorytm. Dzięki temu oszacować można prawdopodobieństwa wystąpień poszczególnych bitów klucza. Ciekawą odmianą kryptoanalizy różnicowej jest atak metodą kluczy powiązanych. Polega on na analizowaniu różnic pomiędzy zastosowanymi do szyfrowania kluczami. Oczywiście kryptoanalityk nie wybiera samych kluczy. Ma jedynie wpływ na pewne relacje między nimi. Następnie dane szyfrowane są tymi kluczami, a tekst jawny uzyskiwany jest na podstawie posiadanych informacji o różnicach między kluczami. Jest to kolejny przykład ataku mającego wartość głównie teoretyczną. Interesujące przykłady praktycznych ataków na kryptogramy przy użyciu kryptoanalizy różnicowej znaleźć można w publikacjach takich jak Kryptografia — teoria i praktyka zabezpieczania systemów komputerowych, Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C oraz Kryptologia — budowa i łamanie zabezpieczeń. W książce Ochrona danych i zabezpieczenia w systemach teleinformatycznych opisano szczegółowo kryptoanalizę różnicową algorytmu DES dla kolejnych liczb rund — od jednej do sześciu. Szczegółowe dane na temat powyższych pozycji można znaleźć w Bibliografii.
92
Podstawy kryptografii
3.1.2.2. Kryptoanaliza liniowa Kryptoanaliza liniowa została opracowana przez M. Matsui. Opiera się ona na założeniu, że nawet najbardziej skomplikowane funkcje szyfrujące można przedstawić jako aproksymację liniową (można je uprościć do postaci funkcji liniowej). Jak wiemy, wyrażenie liniowe oparte na argumentach x1,…, xn zapisuje się następująco: a1 x1 a2 x2 ...an xn
gdzie a1, …, an są wartościami stałymi. Operację taką można również zdefiniować dla ciągu bitów. Wykorzystywane są do tego operacje XOR i AND (a więc dodawanie i mnożenie w ciele dwuelementowym), omówione w rozdziale 2. Jest to bardzo interesujące spostrzeżenie, jeśli zwrócić uwagę na fakt, że dla blokowych algorytmów opartych wyłącznie na tego typu operacjach ułożyć można układ równań, którego rozwiązanie wyznaczy nam poszczególne bity klucza. Układ równań takiego algorytmu zapisać można w następujący sposób: c1 pi ,11 * s j ,11 pi , 21 * s j , 21 pi , 31 * s j , 31 ... ........ cn p... * s j ,1n pi , 2 n * s j , 2 n pi , 3 n * s j , 3 n ... i ,1n
gdzie: ci — bity kryptogramu dla i , pi — bity tekstu jawnego dla i , si — bity klucza dla i . Znając wartości indeksów ikl oraz jkl, można przeprowadzić skuteczny atak przy użyciu tekstu jawnego. Zwróćmy bowiem uwagę, iż w takiej sytuacji jedyną niewiadomą pozostają bity klucza si. Możemy ją obliczyć, podstawiając znane wartości do równania. Bardzo istotnym zabezpieczeniem przed kryptoanalizą liniową szyfrów blokowych są S-bloki lub inne macierze przekształceń, ponieważ wprowadzają one element nieliniowości do algorytmu. Niemniej jednak atak tego typu jest nadal możliwy. Ciekawy przykład liniowej kryptoanalizy algorytmu DES przedstawiony jest we wspomnianych już wcześniej książkach Ochrona danych i zabezpieczenia w systemach teleinformatycznych, Kryptologia — budowa i łamanie zabezpieczeń oraz Kryptografia — teoria i praktyka zabezpieczania systemów komputerowych.
3.1.3. Inne rodzaje ataków Istnieją również inne metody nielegalnego uzyskiwania dostępu do danych, o których warto wspomnieć. Są to: atak przez zablokowanie usługi, atak przez powtórzenie,
Rozdział 3. Kryptografia w teorii
93
atak słownikowy, atak bocznym kanałem, atak Man in the Middle, atak Meet in the Middle, atak urodzinowy, ataki algebraiczne, atak algorytmiczny, atak z wykorzystaniem wirusa, kleptografia, ataki na implementacje sprzętowe, socjotechnika.
Atak przez zablokowanie usługi (ang. denial-of-service attack) polega na zaburzeniu cyfrowej transmisji danych. Przykładem może być nieuprawniona zmiana klucza uniemożliwiająca dalszą komunikację posługującym się nim użytkownikom. Generalnie ataki typu DoS mogą przybrać kilka różnych form, takich jak: zablokowanie dostępu do danej usługi konkretnej osobie, zablokowanie połączenia między dwoma komputerami, zablokowanie ruchu w całej sieci.
Przykładowym atakiem tego typu jest popularny atak przez zalew SYN (ang. SYN flood) wykorzystujący mechanizm stosowany przy nawiązywaniu połączenia klient-serwer. Klient wysyła do serwera wiadomość o chęci nawiązania połączenia. Serwer potwierdza odebranie wiadomości, przygotowuje zasoby systemowe potrzebne do obsługi połączenia i czeka na potwierdzenie odebrania wiadomości przez klienta. W tym momencie połączenie jest nawiązane dopiero w połowie. Kiedy nastąpi odpowiedź klienta, rozpoczyna się właściwa wymiana danych. Atakujący wykorzystuje moment, kiedy serwer oczekuje na reakcję klienta. Stosując technikę IP Spoofing (tworzenia fałszywych adresów IP), nawiązuje on kolejne „półotwarte” połączenia. Serwer rezerwuje zasoby systemowe do ich obsługi, ale nie następuje odpowiedź klienta. Wkrótce zasoby systemowe zostają wyczerpane i nie ma już możliwości nawiązywania kolejnych połączeń. Nawet mechanizm wygasania półotwartych połączeń po określonym czasie niewiele pomaga, ponieważ atakujący może nawiązywać nowe połączenia szybciej, niż stare będą wygasać. Atak przez powtórzenie jest specjalnym rodzajem ataku kryptoanalitycznego. Deszyfrujący przechowuje tu wiadomość, której szyfru nie mógł złamać, do wykorzystania w przyszłości. Może na przykład przeprowadzić uwierzytelnienie pod cudzym nazwiskiem i dzięki tak uzyskanym uprawnieniom dokonać włamania do systemu lub zaburzyć jego działanie. Najlepszą metodą zabezpieczenia przed tym typem ataku jest wprowadzenie do wysyłanych wiadomości znacznika czasu. Dzięki temu nawet po przechwyceniu wiadomości atakujący nic nie zyska, gdyż jej późniejsze wysłanie zostanie wykryte przez system.
94
Podstawy kryptografii
Atak słownikowy określany jest także jako atak na zredukowaną przestrzeń kluczy, którą można opisać przy użyciu słownika kluczy podstawowych i ich modyfikacji (zmieniona wielkość liter, zapisanie hasła od tyłu, dodanie często używanej kombinacji cyfr itp.). Atak ten opiera się na założeniu, że użytkownik wybiera na ogół hasło łatwe do zapamiętania. Z tego względu faktyczna liczba stosowanych haseł jest tylko niewielką częścią zbioru wszystkich możliwych. Bardzo częste jest na przykład stosowanie jako hasła imienia żony lub córki bądź prostych kombinacji klawiszy, takich jak „1234” lub „abcd”. Atakujący dysponuje programem z bazą danych zawierającą najczęściej stosowane hasła. Aby ochronić się przed tego typu atakiem, należy używać nietypowych, trudnych do odgadnięcia haseł. Więcej na temat wybierania odpowiednich haseł napiszę w podrozdziale 4.1. Atak słownikowy można również zastosować przeciwko hasłom chronionym za pomocą funkcji skrótu. Jeśli atakujący uzyska dostęp do wartości skrótów haseł użytkowników, może porównać je z wartościami uzyskanymi w wyniku przekształcenia haseł zapisanych w słowniku z użyciem tego samego algorytmu. Dopasowanie oznacza, iż natrafiono na właściwe hasło lub nastąpiła kolizja funkcji skrótu. W obu wymienionych przypadkach agresor uzyskuje dostęp do systemu. Z tego względu wielu administratorów od czasu do czasu samodzielnie przeprowadza tego typu atak. Jeśli któreś z haseł okaże się zbyt słabe, posługujący się nim użytkownik jest informowany o konieczności jego zmiany. Ataki bocznym kanałem są możliwe, jeśli atakujący ma pewne dodatkowe informacje techniczne o systemie i procesie szyfrowania. Może on na przykład zmierzyć czas szyfrowania wiadomości lub interferencje z innymi kanałami danych. Wiedza o systemie może być również pożyteczna, jeśli wykorzystywany w kryptosystemie generator liczb losowych korzysta z parametrów danego komputera do tworzenia ziarna. Można wtedy z większym prawdopodobieństwem określić, jaka liczba została w danej chwili wygenerowana. Innym problemem jest promieniowanie elektromagnetyczne wydzielane przez kable, którymi płyną wysyłane przez nas sygnały. Promieniowanie to przy użyciu odpowiedniego sprzętu można odczytać z odległości nawet kilkuset metrów. Przed tego typu atakiem w programie PGP chroni opcja Secure Viewer (patrz podrozdział 4.3). Inną metodą zabezpieczenia jest ekranowanie kabli przesyłających dane w postaci niezaszyfrowanej wewnątrz komputera (na przykład kabla łączącego monitor, klawiaturę i urządzenia peryferyjne z jednostką centralną) lub umieszczenie komputera wewnątrz tzw. klatki Faradaya, która chroni przed przechwytywaniem informacji tą techniką. Można również wykorzystać kable światłowodowe, które nie wydzielają promieniowania elektromagnetycznego. Możliwe jest również odczytywanie danych poprzez analizę promieniowania emitowanego przez monitor (w tym przypadku większe bezpieczeństwo zapewniają monitory o płaskich ekranach) lub dźwięków wydawanych przez naciskane klawisze. Inny przykład tego typu ataku (znanego jako metoda akustyczna) zaproponowali Adi Shamir oraz Eran Tomer. Metoda ta polega na analizie związków między dźwiękami wydawanymi przez procesor a wykonywanymi przez niego operacjami. Również pobór mocy przez urządzenie szyfrujące może stanowić wskazówkę co do wykonywanych operacji — opracowana przez P. Kochera analiza różnicowa mocy opiera się na badaniu różnic w poborze mocy przez różne części urządzenia w trakcie procesu szyfrowania. Na ich podstawie możliwe jest uzyskanie informacji o niektórych bitach klucza
Rozdział 3. Kryptografia w teorii
95
szyfrującego. Bardzo interesująca jest też metoda różnicowej analizy błędów. Atakujący celowo zaburza pracę urządzenia szyfrującego, a następnie analizuje powstałe w ten sposób błędy w uzyskanych tekstach jawnych bądź kryptogramach. Różnice między tak uzyskanymi danymi a poprawnymi wynikami dla tych samych operacji stanowią podstawę dalszej kryptoanalizy algorytmu. Atak Man in the Middle, czasem określany jako atak z wnętrza systemu, polega na przechwytywaniu na bieżąco informacji przekazywanych między dwoma komputerami. Niekoniecznie musi on oznaczać utratę przesyłanych danych. Znacznie częściej atakujący obserwuje połączenie, zdobywając potrzebne mu dane. Może również zmieniać treść wiadomości, nim ta dotrze do adresata. Jest to szczególnie niebezpieczne w przypadku przesyłania tą drogą kluczy szyfrujących, a więc wszystkich protokołów niekorzystających z wcześniej ustalonych sekretów (jako przykład podać można protokół Diffiego-Hellmana). W przypadku PGP najprostszym sposobem sprawdzenia, czy otrzymaliśmy właściwy klucz, jest sprawdzenie jego „odcisku palca” (patrz podrozdział 4.3). Ogólnie rzecz biorąc, najlepszym sposobem obrony przed tego typu atakiem jest korzystanie z certyfikatów potwierdzających tożsamość stron w komunikacji. Atak Meet in the Middle jest stosowany przeciwko kryptosystemom podwójnego szyfrowania, a więc takim, w których wiadomość jest szyfrowana dwukrotnie tym samym algorytmem, ale z wykorzystaniem różnych kluczy. Jest to połączenie ataku na zasadzie pełnego przeglądu z kryptoanalizą ze znanym tekstem jawnym. Kryptoanalityk jednocześnie szyfruje tekst jawny i deszyfruje kryptogram wszystkimi możliwymi kluczami, zakładając, że wyniki obu operacji się pokryją. Dla przykładu: w przypadku podwójnego szyfrowania algorytmem o długości klucza 128 bitów teoretycznie konieczne jest wykonanie 21282128 operacji przy ataku metodą pełnego przeglądu. W przypadku ataku Meet in the Middle liczba ta spada do 2128+2128. Atak urodzinowy jest stosowany przeciwko funkcjom skrótu (patrz dodatek A). Opiera się na matematycznym „paradoksie urodzin”. Mówi on o tym, że w grupie 23 osób prawdopodobieństwo, iż dwie osoby będą miały urodziny tego samego dnia, jest większe niż 50%. Może się to z pozoru wydawać dziwne (mamy wszak 365 możliwości), jednak można to matematycznie uzasadnić. Otóż dla zbioru k elementów, z których każdy może przyjmować N wartości, prawdopodobieństwo wystąpienia pary elementów o tych samych wartościach wynosi: P(ki k j )
k (k 1) 2N
Liczba możliwych par w takim zbiorze wyraża się wzorem k(k–1)/2, a dla każdej pary prawdopodobieństwo przybrania takich samych wartości wynosi 1/N. Dla tak zapisanego wzoru zachodzi: k N P (ki k j ) 50%
Co prawda w tym konkretnym przypadku potrzeba 23, a nie 19 (jak wynikałoby z powyższego wzoru) osób, jest to jednak wystarczająco dobre przybliżenie.
96
Podstawy kryptografii
Do czego może służyć ten wzór w praktyce? Wyobraźmy sobie sytuację, w której ktoś składa elektroniczny podpis pod dokumentem potwierdzającym transakcję handlową. Druga strona występuje jako atakujący i ma zamiar sfałszować umowę tak, aby uzyskać korzyść finansową. Podpis elektroniczny składany jest przy użyciu klucza prywatnego pod skrótem wiadomości uzyskanym w wyniku działania funkcji skrótu (więcej informacji na temat podpisów elektronicznych znajduje się w podrozdziale 3.3). Jeśli więc udałoby się uzyskać parę umów, dla których wynik działania tej funkcji byłby taki sam, podpis również byłby ważny w obu przypadkach. Co za tym idzie, wystarczy spreparować dwie umowy: jedną oryginalną, a drugą fałszywą (która zapewnia atakującemu dużą korzyść finansową), a następnie przedstawić pierwszą do podpisu drugiej stronie. Następnie podpis ów atakujący podpina pod drugą umowę i mamy fałszerstwo doskonałe. Problem polega tylko na liczbie różnych par umów, które należy sporządzić, aby uzyskać realną szansę na uzyskanie pary o tej samej wartości funkcji skrótu. Jest ona tym większa, im krótszy skrót generuje stosowana funkcja. Aby obliczyć szansę powodzenia przy danej liczbie posiadanych par elementów (umów) i liczbie możliwych wartości funkcji generowanych przez funkcję skrótu dla każdego z nich, wystarczy skorzystać z przytoczonego wcześniej wzoru. Na przykład funkcja generująca skrót 80-bitowy daje w sumie 280 możliwych wartości. Jest to nasze N, natomiast k stanowi liczbę „spreparowanych umów”. W latach 2004 – 2006 skuteczne ataki urodzinowe przeprowadzono przeciw funkcjom MD5 oraz SHA-1. W związku z powyższym na ich miejsce wprowadzane są funkcje z rodziny SHA-2, generujące dłuższe skróty — od 224 do 512 bitów. Dodatkowo ogłoszono konkurs na nowy standard w tym zakresie. Ma on zostać rozstrzygnięty do 2012 roku. Przed wspomnianym atakiem można się dodatkowo zabezpieczyć, wstawiając do przygotowanej umowy kilka spacji na samym końcu lub zmieniając kilka wyrazów na ich synonimy. Kolizja — sytuacja, w której funkcja skrótu generuje dwie takie same wartości dla dwóch różnych argumentów. Z racji podstawowego założenia przyświecającego konstrukcji takich funkcji, jakim jest ich różnowartościowość, podstawowym parametrem każdej z nich jest odporność na kolizje. Odkrycie sposobu doprowadzania w krótkim czasie danej funkcji do kolizji oznacza, iż nie można jej w dalszym ciągu uznawać za bezpieczną.
Atak algebraiczny polega na sprowadzeniu algorytmu do zbioru równań algebraicznych, aby następnie je rozwiązać. Udowodniono, iż atak ten jest skuteczniejszy niż metoda pełnego przeglądu przeciwko takim algorytmom jak AES czy Serpent. Ponadto wykorzystywać go można zarówno przeciw symetrycznym algorytmom blokowym, jak i strumieniowym. Atak algorytmiczny jest skierowany przeciwko teorii leżącej u podstaw łamanego algorytmu szyfrującego. Innymi słowy, atakujący usiłuje znaleźć słaby punkt w matematycznych podstawach szyfru. Dla przykładu złamanie RSA metodą ataku algorytmicznego mogłoby polegać na znalezieniu szybkiej metody rozkładu dużych liczb na czynniki pierwsze (a więc na rozwiązaniu problemu faktoryzacji).
Rozdział 3. Kryptografia w teorii
97
Kolejną metodą ataku na tajne dane jest kleptografia. Polega ona na wykorzystaniu algorytmu szyfrowania lub urządzenia elektronicznego stosowanego do jego implementacji. Producent urządzenia instaluje w nim układ działający na zasadzie „tylnych drzwi”, pozwalający mu na poznanie jawnej treści komunikatów użytkownika. Przykładem może być tutaj urządzenie montowane pomiędzy klawiaturą a jednostką centralną. Urządzenie takie zapamiętuje przesyłane informacje i zachowuje je po wyłączeniu komputera dzięki niezależnemu źródłu zasilania. Możliwe jest też zmodyfikowanie urządzenia tak, by nie dało się tego zauważyć na zewnątrz, a więc bez instalacji żadnych dodatkowych układów. Podobne „tylne drzwi” można również zaimplementować programowo w samym algorytmie. Na przykład NSA była podejrzewana o zainstalowanie czegoś takiego w algorytmie DES. Dzięki temu uzyskałaby łatwy dostęp do szyfrowanych nim danych przy zachowaniu takiego samego bezpieczeństwa algorytmu w przypadku innych użytkowników. Atak z wykorzystaniem wirusa polega na zainfekowaniu jak największej liczby komputerów niewielkim programem, który wykorzystuje ich moc obliczeniową w celu złamania określonego szyfru. Przykładowo podczas bezczynności maszyny wirus korzysta z jej zasobów systemowych do poszukiwania klucza prywatnego pasującego do danego klucza publicznego. Program przerywa wykonywane obliczenia, kiedy użytkownik ponownie zaczyna korzystać z komputera. Dzięki temu może pozostać niewykryty przez długi czas. Rzecz jasna atak ten jest tym skuteczniejszy, im więcej maszyn uda się zarazić wykorzystywanym wirusem. Socjotechnika jest dość nietypową metodą zdobywania tajnych informacji. Mówiąc najprościej, polega ona na przekonaniu osób posiadających tajne informacje, aby je zdradziły. Niedorzeczne? Bynajmniej. Socjotechnika opiera się w dużej mierze na psychologii, a zwłaszcza na tych jej aspektach, które już od lat wykorzystują sprzedawcy i domokrążcy w celu nakłaniania innych osób do podjęcia „właściwej decyzji”. Metody te są zbyt liczne, by je tu wszystkie wymieniać. Zainteresowanych tą tematyką odsyłam do publikacji Wywieranie wpływu na ludzi — teoria i praktyka. Zastosowanie tych technik do uzyskiwania tajnych danych znakomicie opisuje Kevin Mitnick w Sztuce podstępu (szczegółowe dane na temat tych pozycji zawarto w Bibliografii). Polecam obie te książki, zwłaszcza jeśli ktoś uważa, że jest odporny na „psychologiczne sztuczki”. Cóż bowiem z tego, że nasze dane są zaszyfrowane i dostęp do nich jest możliwy jedynie dla wąskiego grona osób, jeśli jedna z tych osób poda tajne informacje „uprzejmemu panu z obsługi technicznej”? Socjotechnika jest idealnym przykładem na to, że kryptografia nie może istnieć w oderwaniu od innych technik ochrony informacji. Szerzej ten temat rozwinę w następnym rozdziale. Opisane powyżej techniki i metody ataków na tajne dane nie wyczerpują szerokich możliwości w tej dziedzinie. Nie należy ich również traktować jako metod indywidualnych, czyli niepowiązanych ze sobą nawzajem. W rzeczywistości atakujący z reguły łączy kilka różnych metod dla osiągnięcia swojego celu. Można na przykład odkryć 80% bitów klucza metodą kryptoanalizy liniowej, a pozostałe 20% metodą pełnego przeglądu. Innym przykładem może być wykonanie ataku denial of service przeciwko konkretnej osobie, by chwilę później zadzwonić do niej i przedstawić się jako rzekomy serwisant z zapytaniem, czy nie zauważyła jakichś problemów technicznych w ciągu ostatniej godziny. Dalej mamy już do czynienia z czystą socjotechniką. Przykłady można mnożyć, jednak najważniejsze jest to, aby zdać sobie sprawę z liczby potencjalnych zagrożeń.
98
Podstawy kryptografii
3.2. Rodzaje i tryby szyfrowania W tym rozdziale omówione zostaną podstawowe typy algorytmów szyfrujących oraz trybów pracy, w jakich są one stosowane. Jak się przekonacie, wybór dobrego algorytmu to dopiero połowa sukcesu. Bardzo istotne jest bowiem, by dostosować pracę tego algorytmu do środowiska, w jakim będzie działał. Tu właśnie z pomocą przychodzą nam tryby szyfrowania. Najważniejszy jest wybór odpowiedniej dla naszych potrzeb kombinacji algorytmu oraz trybu jego pracy.
3.2.1. Szyfry blokowe Jak sama nazwa wskazuje, algorytmy blokowe to takie, które operują na blokach danych. Bloki danych mogą mieć różną długość — w starszych algorytmach były to 64 bity, natomiast stosunkowo nowy AES pracuje na blokach do 256 bitów. Poszczególne bloki danych są w wyniku działania algorytmu przekształcane w bloki szyfrogramu. Deszyfrowanie przebiega analogicznie, z tą różnicą, że teraz bloki szyfrogramu stanowią dane wejściowe. Klucz pozostaje niezmieniony, stąd też algorytmy blokowe zaliczane są do klasy algorytmów symetrycznych.
3.2.1.1. Tryby szyfrów blokowych Podczas wybierania kryptosystemu do ochrony naszych danych napotkać możemy różne typy algorytmów blokowych. Oczywiście najlepiej oprzeć się na rozwiązaniach znanych i sprawdzonych, jednak w przypadku szyfru blokowego nie mniej istotnym parametrem jest tryb szyfrowania stosowany w połączeniu z algorytmem. Może się okazać, iż producent zaimplementował rozwiązanie znacznie obniżające jakość zabezpieczeń. Poniżej opisane zostały najpopularniejsze tryby szyfrowania blokowego. Cztery z nich (ECB, CBC, CFB oraz OFB) zostały zdefiniowane wraz z opracowaniem standardu DES.
3.2.1.1.1. ECB Nazwa tego trybu wywodzi się od angielskiego terminu Electronic Code Book (elektroniczna książka kodowa). Jest to najprostsza forma szyfru blokowego, polegająca na szyfrowaniu po kolei poszczególnych bloków danych. Matematycznie zapisujemy to następująco: Ck A( K , Pk ) dla k = 1, 2, …, n
gdzie: P, C — odpowiednio tekst jawny oraz tekst tajny, K — klucz szyfrowania, A — dowolny algorytm blokowy, n — liczba bloków wiadomości.
Rozdział 3. Kryptografia w teorii
99
Oznaczenia te będziemy stosować również w odniesieniu do pozostałych trybów szyfrowania. Stąd właśnie wzięła się nazwa trybu odzwierciedlająca jego podobieństwo do książek kodowych. Za pomocą tych książek szyfrowano pojedyncze wyrazy, tu natomiast szyfrowane są pojedyncze bloki. ECB jest najprostszym i zarazem najmniej bezpiecznym ze wszystkich trybów szyfrowania. Zastosowanie tej metody powoduje bowiem, iż takie same bloki tekstu jawnego mają identyczne odpowiedniki w tekście tajnym. Znacznie ułatwia to kryptoanalizę kryptogramów. Na przykład w tym rozdziale bardzo często powtarza się termin „tryb szyfrowania”. Gdyby takie powtórzenia ułożyły się identycznie w granicach bloku, nastąpiłoby powtórzenie tekstu jawnego, w związku z czym powtórzyłby się również fragment kryptogramu. Dodatkowo szyfrowanie w trybie ECB umożliwia niezauważone podmienianie bloków danych. Jeśli chcemy uzyskać naprawdę profesjonalną ochronę, to z powyższych względów nie powinniśmy stosować algorytmu blokowego w trybie ECB. Rodzaj stosowanego algorytmu ma w tym wypadku drugorzędne znaczenie.
3.2.1.1.2. CBC CBC, czyli Cipher Block Chaining (wiązanie bloków zaszyfrowanych) jest równie prosty jak ECB, a przy tym nieporównywalnie skuteczniejszy. W tym trybie każdy blok tekstu jawnego XOR-owany jest z poprzednio utworzonym kryptogramem, co obrazuje poniższy wzór: C A( K , Pk Ck 1 ) dla k = 1, 2, …, n
Być może niektórzy z Was zastanawiają się, skąd wziąć C0 w pierwszej rundzie algorytmu. Otóż za kryptogram ten służy blok danych zwany wektorem inicjującym (IV). O metodach jego tworzenia szerzej napiszę za chwilę, na razie przyjmijmy, iż jest to wartość losowa. Cały przebieg algorytmu A w trybie CBC przedstawia rysunek 3.1. Jak widać, w trybie CBC każdy wygenerowany blok kryptogramu zależy od wszystkich poprzednich. W rezultacie nawet jeśli powtórzy się blok tekstu jawnego, otrzymany blok kryptogramu będzie już inny niż przy pierwszym wystąpieniu tego tekstu. Niemożliwe jest również wstawienie jakiegoś bloku do kryptogramu, gdyż taka operacja wpłynęłaby na kształt wszystkich późniejszych bloków tekstu tajnego. Ewentualne próby modyfikacji kryptogramów można wyeliminować, dołączając do każdego z nich kod MAC. Również pierwszy blok szyfrowanych danych może mieć po zaszyfrowaniu różną postać, w zależności od zastosowanego wektora IV. Tylko algorytmy wyjątkowo wrażliwe na atak przy użyciu tekstu jawnego mogą być złamane tą metodą, jeśli szyfrowanie przebiega w trybie CBC. Kod MAC (ang. Message Authentication Code) — kod umożliwiający uwierzytelnienie danych. Stanowi on wartość wyjściową funkcji opartej na tajnym kluczu oraz uwierzytelnianej wiadomości. Można dzięki niemu potwierdzić źródło oraz sprawdzić integralność otrzymanych danych, ponieważ każda dokonana w nich zmiana spowoduje zmianę odpowiadającego im kodu MAC. Kod ten jest często wykorzystywany w bazach danych, gdzie integralność zapisanych informacji jest szczególnie istotna. Idealna funkcja generująca MAC powinna być odwzorowaniem losowym, w związku z czym często wykorzystuje się w nich funkcje mieszające (mówimy wtedy o funkcji HMAC).
100
Podstawy kryptografii
Rysunek 3.1. Szyfrowanie w trybie CBC
Dodatkową zaletą tego trybu jest fakt, iż pomimo zależności między blokiem tekstu tajnego a całą poprzednią częścią kryptogramu zagłuszenie jednego bloku kryptogramu powoduje nieczytelność zaledwie dwóch bloków tekstu jawnego. Umożliwia to odczytanie danych nawet w przypadku wystąpienia błędów w czasie ich przesyłania lub zapisywania. Obecnie, kiedy do kontroli poprawności danych stosuje się sumy kontrolne, a protokoły połączeń internetowych zgłaszają brakujące pakiety, nie jest to może zaleta aż tak istotna, niemniej jednak warto o niej wspomnieć. Potencjalnego wyłomu w bezpieczeństwie trybu CBC można dokonać, stosując atak urodzinowy. Jest on możliwy, jeśli pokryją się dwa bloki kryptogramu. Załóżmy, że są to bloki C5 oraz C7. Otrzymujemy wtedy: A( K , C4 P5 ) A( K , C6 P7 )
stąd wynika, że: C4 P5 C6 P7 C4 C6 ( P7 P5 ) C4 C6 P5 P7
Atakujący zna wartości poszczególnych bloków kryptogramu, może więc obliczyć wartość wyznaczonej sumy. Ta informacja wcale nie gwarantuje złamania szyfru, może jednak stanowić pierwszy krok na drodze do tego celu. Tak naprawdę jednak winy nie ponosi tutaj sam CBC, a jedynie długość stosowanego w danym szyfrze bloku. Im krótszy jest ten blok, tym większa szansa na wystąpienie identycznych kryptogramów. Mimo iż dla szyfrów od 64-bitowej długości bloku realna szansa na powtórzenie pojawia się,
Rozdział 3. Kryptografia w teorii
101
kiedy mamy do dyspozycji ponad 30 gigabajtów kryptogramów, w chwili obecnej wymagana dla zabezpieczenia przed tym atakiem długość bloku szacowana jest na 128 bitów. Jeśli chodzi o bezpieczeństwo, CBC zdecydowanie przewyższa ECB. Identyczne bloki kryptogramu można tutaj uzyskać tylko wówczas, jeśli dla dwóch identycznych wiadomości zastosujemy ten sam IV oraz klucz. Jeśli jednak (zgodnie z wcześniejszym założeniem) do uzyskania IV używać będziemy generatora liczb losowych, taka zbieżność kryptogramów nam nie grozi. Ponadto CBC poprzez uzależnienie każdego bloku kryptogramu od wszystkich poprzednich lepiej ukrywa właściwości tekstu jawnego. Jeżeli uwzględnimy także i to, iż wydajność szyfru blokowego w trybie ECB i CBC jest taka sama, wybór staje się oczywisty.
3.2.1.1.3. CFB Nazwa tego trybu (ang. Cipher Feedback — tryb sprzężenia zwrotnego szyfrogramu) pochodzi od jego właściwości polegającej na zwracaniu kryptogramów do ponownego szyfrowania. Umożliwia to przesyłanie zaszyfrowanych bloków danych o rozmiarze jednego znaku, nawet jeśli stosowany algorytm posiada o wiele większą długość bloku. Innymi słowy, tryb ten pozwala wykorzystać szyfr blokowy w charakterze strumieniowego. Czemu to służy? Otóż w systemach komputerowych wykorzystujących komunikację między komputerem centralnym a terminalami dane przesyłane są po jednym znaku, natomiast w trybie ECB lub CBC po naciśnięciu klawisza Enter dane nie zostałyby przesłane, chyba że znak ten stanowiłby ostatni we właśnie tworzonym bloku. Dzięki zastosowaniu trybu CFB możliwe jest zatem wykorzystanie szyfrów blokowych do zabezpieczenia komunikacji w systemie terminalowym. W razie potrzeby CFB można stosować nawet w oparciu o pojedyncze bity. Schemat szyfrowania w trybie CFB przedstawia poniższy rysunek 3.2. Rysunek 3.2. Szyfrowanie w trybie CFB
Praktyczna implementacja trybu CFB opiera się na zastosowaniu rejestru przesuwającego. Jest to blok danych równy długością blokowi stosowanemu w danym algorytmie. Na początku jest on wypełniony zgodnie ze stosowanymi w danym przypadku regułami tworzenia wektora inicjującego. Znajdujący się najbardziej po lewej bajt rejestru zostaje zaszyfrowany, a następnie dodany modulo 2 do pierwszego bajta tekstu jawnego. W ten sposób wygenerowany zostaje pierwszy bajt kryptogramu. Jego wartość można teraz przesłać, nie czekając na wypełnienie się bloku. Utworzony bajt kryptogramu
102
Podstawy kryptografii
zostaje również dopisany po prawej stronie rejestru. Następnie cały rejestr przesuwany jest w lewo o jeden bajt, przy czym bajt najbardziej znaczący (znajdujący się najbardziej po lewej) zostaje usunięty. Matematycznie cały proces zapisać możemy następująco: Ck 1 Pk 1 A(Ck ) dla k = 1, 2, …, n
Podobnie jak w przypadku trybu CBC, tutaj również ukryte zostają cechy charakterystyczne tekstu jawnego. Do wielu wiadomości, nawet identycznych, dzięki losowemu IV stosować możemy ten sam klucz. Możliwe jest pewne manipulowanie zawartością tekstu jawnego, ale jedynie na wartościach skrajnych. Zwłaszcza bity ostatniego bloku podatne są na tego typu ataki. Generalnie osiągnięte bezpieczeństwo porównywalne jest z trybem CBC przy dodatkowej możliwości szyfrowania danych w postaci pojedynczych bajtów, a nawet bitów. Dzieje się to kosztem zmniejszenia szybkości szyfrowania, która z reguły jest mniejsza niż szybkość stosowanego algorytmu (taką samą można osiągnąć jedynie w przypadku stosowania sprzężenia zwrotnego identycznej wielkości co w stosowanym algorytmie).
3.2.1.1.4. OFB Tryb OFB (skrót od ang. Output Feedback — tryb sprzężenia zwrotnego wyjściowego) jest bardzo podobny do CFB, z tą różnicą, że rezultat działania algorytmu jest podawany w postaci danych wejściowych kolejnej rundy przed operacją XOR-owania z tekstem jawnym (a nie po tej operacji, jak to miało miejsce w CFB). Pozwala to na obliczanie kolejnych ciągów wejściowych niezależnie od tekstu jawnego. Dzięki temu wszystkie bloki mogą być szybko obliczane lub nawet przechowywane na bieżąco w pamięci operacyjnej. Umożliwia to błyskawiczne odszyfrowywanie dowolnych bloków kryptogramu. Ta właściwość powoduje, iż OFB jest szczególnie przydatny w systemach, gdzie potrzebny jest szybki dostęp do danych (szyfrowane bazy danych, szybkie kanały wymiany informacji). Schematycznie tryb OFB przedstawić można tak, jak pokazuje rysunek 3.3. Jak widać, szyfr blokowy nie służy w tym trybie do szyfrowania wiadomości. Generuje on jedynie pseudolosowy strumień klucza używany do tworzenia właściwych kryptogramów przez operację XOR. Zapisujemy to następująco: Ck Pk K k
gdzie: K k A( K , K k 1 )
dla k = 1, 2, …, n
K 0 IV
Podstawową zaletą tego trybu jest prostota implementacji. Wynika to z faktu, iż proces szyfrowania i deszyfrowania przebiega dokładnie tak samo. Poza tym nie ma potrzeby dopełniania bloku danych przed zaszyfrowaniem. Podstawowe zagrożenie wiąże się z użyciem dwa razy tego samego IV. W takiej sytuacji utworzone zostaną identyczne strumienie klucza, w związku z czym obie wiadomości zostaną zaszyfrowane w identyczny sposób. Jest to zresztą jedno z niebezpieczeństw generalnie wiążących się ze stosowaniem szyfrów strumieniowych. Łatwiejszy jest też w takim przypadku atak przez wstawienie lub podmianę bloku danych.
Rozdział 3. Kryptografia w teorii
103
Rysunek 3.3. Szyfrowanie w trybie OFB
3.2.1.1.5. CTR Tryb ten, podobnie jak OFB, służy do generowania strumienia klucza szyfrującego. Tę operację przeprowadza się tu jednak na podstawie numeru jednorazowego wiadomości i licznika szyfrowanych bloków. Mamy więc: Ck Pk K k K k A( K , N k ) dla = 1, 2, …, n
gdzie: i — licznik szyfrowanych bloków, N — numer jednorazowy, określany również jako Nonce (od ang. Number used once), musi mieć wartość unikatową (licznik lub numer wiadomości) i, jak sama nazwa wskazuje, jest wykorzystywany tylko raz dla danego klucza; || — operator złączenia (konkatenacja). Numer jednorazowy zwykle tworzony jest na podstawie numeru wiadomości i danych zapewniających niepowtarzalność. N oraz k muszą pasować do stosowanego w danym algorytmie rozmiaru bloku. Ze względów bezpieczeństwa bardzo istotne jest, aby połączenie klucza oraz numeru jednorazowego było unikatowe dla danej wiadomości. W przeciwnym wypadku dojdzie do zaszyfrowania dwóch (lub więcej) wiadomości tym samym strumieniem klucza (sytuacja analogiczna do użycia ponownie tego samego IV w trybie OFB).
104
Podstawy kryptografii
CTR jest bardzo łatwy w implementacji, gdyż szyfrowanie i deszyfrowanie przebiegają tu identycznie. Dodatkowo tryb ten pozwala na równoległe przetwarzanie strumienia klucza, przez co znacznie zwiększa się szybkość dostępu do chronionych danych.
3.2.1.1.6. Inne tryby szyfrowania blokowego Wymienione tryby szyfrowania nie wyczerpują oczywiście wszystkich możliwości, które można stosować podczas pracy z szyframi blokowymi. Spośród pozostałych najpopularniejsze są: BC (skrót od ang. Block Chaining — tryb wiązania blokowego). Tryb ten polega
na obliczaniu sumy modulo 2 ciągu wejściowego z wszystkimi poprzednimi blokami kryptogramu. Tu również na początku stosowany jest wektor IV. Największym problemem jest rozprzestrzenianie (propagacja) błędów. Jeden błąd w szyfrogramie powoduje błędne odczytanie wszystkich kolejnych bloków wiadomości, ponieważ są one z nim związane w procesie szyfrowania. PCBC (skrót od ang. Propagating Cipher Block Chaining — tryb
propagującego wiązania bloków zaszyfrowanych). W tym przypadku kolejne bloki kryptogramu powstają przez dodanie do bloku wejściowego modulo 2 poprzedniego bloku kryptogramu i poprzedniego bloku tekstu jawnego, a następnie zaszyfrowanie wyniku. Tutaj również pojawienie się błędu w szyfrogramie powoduje błędne odczytanie następujących po nim bloków. CBCC (skrót od ang. Cipher Block Chaining with Checksum — tryb wiązania
bloków zaszyfrowanych z sumą kontrolną). Jest to odmiana trybu CBC upraszczająca sprawdzanie spójności zaszyfrowanego tekstu. Na bieżąco obliczana jest suma modulo 2 wszystkich bloków tekstu jawnego. Sumę tę dodaje się następnie do ostatniego bloku tekstu jawnego przed zaszyfrowaniem. W ten sposób dowolna zmiana kryptogramu spowoduje zmianę ostatniego bloku tekstu jawnego. W bloku tym umieszcza się dane umożliwiające kontrolę spójności tekstu, dzięki czemu modyfikacje takie mogą być łatwo wykryte. OFBNLF (skrót od ang. Output Feedback with a Nonlinear Function
— tryb sprzężenia zwrotnego wyjściowego z funkcją nieliniową). W tym trybie klucz szyfrujący zmienia się z każdym kolejnym blokiem szyfrowanych danych. Klucz dla danego bloku uzyskiwany jest przez zaszyfrowanie używanym szyfrem blokowym klucza zastosowanego w bloku poprzednim. Tutaj błąd w szyfrogramie wpływa tylko na jeden blok tekstu jawnego. PBC (skrót od ang. Plaintext Block Chaining — tryb wiązania bloków tekstu
jawnego). Działa podobnie jak CBC, jednak zamiast dodawać poprzedni blok tekstu jawnego do aktualnie tworzonego szyfrogramu, dodaje go do aktualnie szyfrowanego tekstu jawnego. PFB (skrót od ang. Plaintext Feedback — tryb sprzężenia zwrotnego tekstu
jawnego). Opiera się na tej samej zasadzie co CFB, ale przy sprzężeniu zwrotnym wykorzystuje tekst jawny. XTS-AES — opracowany przez grupę IEEE Security In Storage Workin
Group tryb blokowy do szyfrowania danych przechowywanych w pamięciach masowych o organizacji sektorowej. Dodatkowym założeniem jest potencjalnie
Rozdział 3. Kryptografia w teorii
105
nieograniczony dostęp do danych, nawet przez podmioty nieuprawnione. Tryb został oficjalnie zaaprobowany przez NIST w 2010 roku. XTS-AES jest oparty na koncepcji dostrajanego szyfru blokowego (tweakable-block-cipher). LRW (od nazwisk twórców — Liskov, Rivest, Wagner). Tryb utworzony
z myślą o szyfrowaniu dysków z wykorzystaniem szyfrów blokowych. Opracowany w związku z ujawnionymi słabościami konwencjonalnych trybów szyfrowania w tym zakresie (m.in. podatnością na atak typu watermark). Zastosowany został m.in. w opisanym w rozdziale 4. programie TrueCrypt. Inne tryby szyfrowania przeznaczone do szyfrowania dysków to XEX, CMC i EME.
3.2.1.2. Kilka słów o wektorach inicjujących Pozostaje jeszcze problem generowania wektora inicjującego. Najprostszym rozwiązaniem byłoby stosowanie stałego wektora dla wszystkich wiadomości. Jednak jak to zwykle bywa z prostymi rozwiązaniami, zmniejsza to bezpieczeństwo szyfru. Na przykład w trybie CBC dwa różne teksty jawne zaczynające się w ten sam sposób miałyby również taki sam początek po zaszyfrowaniu. Efekt jest taki jak przy szyfrowaniu w mniej bezpiecznym trybie ECB — i mimo iż dotyczy tylko pierwszych bloków, nie należy tego faktu lekceważyć. Powstały zatem różne metody generowania wektora IV mające na celu zwiększenie bezpieczeństwa szyfru.
3.2.1.2.1. IV jako licznik Po pierwsze, możemy zastosować IV w charakterze licznika. Dla pierwszej wiadomości przyjmuje on wartość 0, dla drugiej 1, dla trzeciej 2 itd. Jest to rozwiązanie lepsze, jednak nadal nie do końca satysfakcjonujące. Powody są podobne jak w przypadku stałego IV. Dla dwóch bloków wiadomości różniących się tylko nieznacznie (na przykład jednym bitem) istnieje możliwość zamazania tych różnic przez operację XOR z licznikiem. Może do tego dojść, jeśli wektory IV obu wiadomości różnią się między sobą na tym samym bicie. W ten sposób otrzymalibyśmy dwa identyczne kryptogramy dla dwóch różnych bloków tekstu jawnego. Dzięki temu kryptoanalityk może uzyskać informacje na temat różnic między danymi wiadomościami, co uznaje się za lukę w zabezpieczeniu.
3.2.1.2.2. Losowy IV O wiele bardziej popularne jest stosowanie IV o charakterze losowym. W takim przypadku należy jednak wygenerowany wektor przesłać do odbiorcy razem z wiadomością. W przeciwnym razie adresat nie będzie w stanie odszyfrować wiadomości. Losowy blok IV dołącza się więc przed pierwszym blokiem wiadomości. Takie rozwiązanie istotnie zwiększa bezpieczeństwo, ale nie jest pozbawione wad. Po pierwsze, wspomniane dołączanie bloku IV powoduje wydłużenie kryptogramu. Ma to istotne znaczenie zwłaszcza w przypadku wielu krótkich wiadomości. Po drugie, konieczne jest zastosowanie generatora losowości. Od jego jakości zależeć będzie bezpieczeństwo danych, a uzyskanie dobrego generatora liczb pseudolosowych nie jest wcale łatwym zadaniem.
106
Podstawy kryptografii
3.2.1.2.3. Jednorazowy IV Ostatnim i często najlepszym rozwiązaniem jest stosowanie jednorazowego IV. Można go wygenerować na podstawie numeru wiadomości i dodatkowych informacji o niej. Na przykład w trybie CBC każdej wiadomości przypisać możemy niepowtarzalny numer, ewentualnie uzupełniając go dodatkowymi informacjami. Następnie szyfrujemy go szyfrem blokowym, uzyskując IV. Po zaszyfrowaniu tekstu dołączamy do niego dane użyte do utworzenia wektora, aby adresat mógł odtworzyć wektor i odszyfrować wiadomość. Te dodatkowe dane zwykle zajmują mniej miejsca niż losowy IV, co stanowi dodatkowy atut tej metody. Poza tym w wielu systemach i tak stosuje się numerowanie wiadomości, można więc wykorzystać istniejące rozwiązania podczas implementacji zabezpieczeń.
3.2.1.3. Dopełnianie Długość wiadomości szyfrowanej algorytmem blokowym musi być wielokrotnością długości bloku. O wiele częstsze są jednak sytuacje, kiedy te dwie długości się nie pokrywają. Trudno w końcu wymagać od użytkowników, by pisali wiadomości o określonej liczbie znaków. Często zresztą nawet dla takich wiadomości konieczne jest wykonanie dopełniania, aby stosowana w algorytmie metoda mogła być odwracalna (aby można było oddzielić wiadomość od jej dopełnienia). Stąd też pojawia się konieczność zdefiniowania metody dopełnienia ostatniego bloku wiadomości. Teoretycznie moglibyśmy po prostu dopisać określoną liczbę zer i po kłopocie. Niestety, takie rozwiązanie nie zapewnia wspomnianej odwracalności. Tekst jawny z dopisanymi zerami nie da się odróżnić od tego samego tekstu bez zer. Najprostszą i najczęściej stosowaną metodą dopełniania jest dopisanie na końcu wiadomości jednego bajta o wartości 128, a następnie odpowiedniej liczby bajtów zerowych. Inną metodą jest wypełnienie ostatniego bloku bajtami o wartości n równej liczbie bajtów potrzebnych do wykonania dopełnienia. Można również dopełnić blok bajtami o dowolnej wartości, a ich liczbę zapisać w ostatnim z nich. Po odszyfrowaniu algorytm sprawdza wartość ostatniego bajta i na jej podstawie usuwa odpowiednią liczbę znaków z końca wiadomości. Podstawową wadą dopełniania jest to, iż wydłuża ono szyfrowane dane. Kryptogramy zajmują więcej miejsca niż odpowiadające im teksty jawne, co jest niepożądane, jeśli mają one być umieszczane w bazie danych. Tryby CFB, OFB oraz CTR nie wymagają dopełniania, ponieważ operują na pojedynczych bajtach i długość stosowanego bloku w ich przypadku przestaje mieć znaczenie.
3.2.1.4. Który tryb jest „najlepszy”? Poprzez analizę wad i zalet trybów szyfrowania blokowego nie można wyróżnić jednego, uniwersalnego rozwiązania, które w każdym przypadku gwarantowałoby maksymalne bezpieczeństwo. Można natomiast stwierdzić, który tryb jest najlepszy w konkretnej sytuacji. I tak: Do szyfrowania plików najlepiej nadaje się tryb CBC. Do szyfrowania komunikacji w systemach terminalowych optymalny jest CFB.
Rozdział 3. Kryptografia w teorii
107
OFB najlepiej stosować w systemach o dużej wrażliwości na propagację błędów,
ponieważ pozwala on ją znacznie zredukować. Do szyfrowania prostego tekstu można stosować zarówno CBC, jak i OFB
lub CFB. W systemach baz danych najlepiej zastosować tryb CBC lub CTR. Ten
pierwszy jest bardziej rozpowszechniony, ma on jednak tę wadę, że zwiększa ilość przechowywanych danych poprzez operację dopełniania oraz konieczność przechowywania IV. Zainteresowanych bardziej wnikliwą analizą mocnych i słabych stron poszczególnych trybów szyfrowania odsyłam do wspomnianej już wcześniej książki Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C.
3.2.2. Szyfry strumieniowe Szyfry strumieniowe dokonują szyfrowania w oparciu o pojedyncze bity. Każdy bit z osobna jest przekształcany zgodnie z wyznaczonym algorytmem i w ten sposób powstaje kryptogram. Szyfry takie oparte są na generatorach strumienia klucza. Generator wytwarza kolejne bity klucza używane następnie do szyfrowania bitów tekstu jawnego. Jak łatwo się domyślić, bezpieczeństwo danego algorytmu opiera się w głównej mierze na jakości generatora. Jest ono tym większe, im bardziej losowy charakter ma wytwarzany strumień bitów klucza. Cały problem sprowadza się zatem do stworzenia dobrego generatora liczb losowych, a to bardzo trudne zadanie. Strumień klucza powinien być nieprzewidywalny i nieokresowy, gdyż każda prawidłowość ułatwia złamanie szyfru. Dodatkowo po każdym uruchomieniu powinien być generowany inny strumień klucza. Niedopuszczalna jest sytuacja, w której dwie wiadomości zostają zaszyfrowane takimi samymi kluczami, choćby spełniały one wszelkie kryteria losowości.
3.2.2.1. Generowanie ciągów pseudolosowych Istnieje wiele różnych sposobów generowania strumieni danych, jednak o znacznej części z nich nie można powiedzieć, aby były naprawdę losowe. Opierają się one na funkcjach matematycznych, a te są do pewnego stopnia przewidywalne. Z tego względu w odniesieniu do nich używa się często terminu generatory pseudolosowe. Różnią się one w zależności od zastosowanych teorii matematycznych i konkretnych technik wykorzystanych do ich implementacji. Pokrótce omówię tu najważniejsze z nich.
3.2.2.1.1. Generatory kongruencyjne Są to proste generatory ciągów pseudolosowych oparte na arytmetyce modularnej. Pracują one w oparciu o tzw. wzór kongruencyjny o następującej postaci: X n (aX n1 b) mod m
Każdy wyraz ciągu powstaje przez pomnożenie poprzedniego wyrazu przez stałą a (zwaną mnożnikiem), dodanie stałej b (czasem określanej jako przyrost), a całość obliczana jest modulo liczba m. Okres powtarzania takiego generatora jest równy m. Istnieją również kwadratowe i sześcienne generatory kongruencyjne oparte na poniższych wzorach:
108
Podstawy kryptografii
X n (aX n21 bX n1 c) mod m X n (aX n31 bX n21 cX n1 d ) mod m
Można również stosować dowolny wielomianowy generator kongruencyjny. We wszystkich przypadkach ziarnem generatora jest wartość X0. Generatory kongruencyjne nie są już obecnie kryptograficznie bezpieczne. Liniowe zostały złamane przez Jima Reedsa, natomiast kwadratowe i sześcienne — przez Joan Boyar. Dalsze prace prowadzone w tym zakresie doprowadziły do uogólnienia metodologii łamania generatorów kongruencyjnych na odmiany wielomianowe.
3.2.2.1.2. Generatory oparte na rejestrze przesuwającym ze sprzężeniem zwrotnym Ten typ generatorów wykorzystuje funkcję sprzężenia zwrotnego opartą na rejestrze przesuwającym. Rejestr taki ma długość n bitów i jest przesuwany o jedno miejsce w prawo za każdym razem, kiedy generowany jest nowy bit. W utworzonym w ten sposób miejscu po lewej stronie wpisywany jest nowy bit obliczony przy użyciu funkcji sprzężenia zwrotnego. Wartością wyjściową jest najmniej znaczący (znajdujący się najbardziej po prawej stronie) bit rejestru. W wyniku kolejnych operacji przesuwania bitów w rejestrze i obliczania nowych przez funkcję powstaje ciąg wyjściowych bitów pseudolosowych. Całość przedstawia rysunek 3.4. Rysunek 3.4. Generator oparty na rejestrze przesuwającym ze sprzężeniem zwrotnym
Funkcja sprzężenia zwrotnego w charakterze argumentów pobiera wybrane bity znajdujące się w rejestrze. Niekoniecznie muszą to być wszystkie bity, jak na zaprezentowanym schemacie. Do przeprowadzenia obliczeń funkcja może pobierać tylko niektóre z nich. Listę wykorzystywanych przez nią bitów rejestru nazywamy sekwencją zaczepów. Sama funkcja również może mieć różną postać w zależności od konkretnego generatora. Dla przykładu: LSFR (skrót od ang. Linear Feedback Shift Register — liniowy rejestr przesuwający ze sprzężeniem zwrotnym) jako funkcję wykorzystuje dodawanie modulo 2 oparte na wybranych bitach rejestru. Ziarnem generatorów z rejestrem przesuwającym jest pierwotny stan tego rejestru, natomiast jego okresem — długość niepowtarzalnej sekwencji wyjściowej. Innymi słowy, jeśli do powtórzenia takiej sekwencji potrzeba 24 operacji — okres również wynosi 24. Innym często wykorzystywanym typem rejestrów przesuwających są FCSR (skrót od ang. Feedback with Carry Shift Register — rejestry przesuwające z przeniesieniem w sprzężeniu zwrotnym). Są one podobne do LSFR, ale wyposażone dodatkowo w tzw. rejestr przeniesienia. W celu obliczenia kolejnego bitu bity zaczepów są sumowane i dodawane do zawartości takiego rejestru. Uzyskana w ten sposób wartość modulo 2 jest
Rozdział 3. Kryptografia w teorii
109
nowym bitem przeniesienia. Następnie wspomniana suma jest dzielona przez 2, a wynik stanowi nową zawartość rejestru przeniesienia. Ogólny schemat FCSR przedstawia rysunek 3.5. Rysunek 3.5. Schemat rejestru przesuwającego FCSR
Wspomniane rejestry LSFR i FCSR są bardzo popularne w kryptografii. W oparciu o nie powstały liczne generatory liczb pseudolosowych. Niestety, dokładny opis wszystkich związanych z nimi zagadnień zająłby tu zbyt dużo miejsca. W książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C znaleźć można dokładną analizę tych rejestrów wraz ze wskazówkami dotyczącymi ich projektowania, a także opisem najpopularniejszych generatorów, w których je wykorzystano.
3.2.2.1.3. Generatory oparte na teorii złożoności Są to generatory oparte na problemach matematycznych znanych z kryptografii z kluczem publicznym. Wykorzystywane w nich skomplikowane problemy matematyczne powodują, iż generatory te wymagają większych nakładów mocy obliczeniowej niż inne (podobnie zresztą jak algorytmy szyfrujące oparte na tych samych teoriach i wzorach). Najpopularniejsze generatory tego typu to: Generator BBS (skrót od ang. Blum Blum Shub) — opierający się na poniższym
wzorze: xi xi21 mod n
gdzie n jest iloczynem dwóch liczb pierwszych p i q kongruentnych z 3mod 4. Ziarno generatora obliczane jest przez wstawienie do wzoru liczby względnie pierwszej z n. Ciąg wyjściowy tworzą najmniej znaczące bity kolejnych wartości x. Generator RSA — podobnie jak BBS wykorzystujący liczbę n będącą
iloczynem dwóch liczb pierwszych p i q, a dodatkowo liczbę e względnie pierwszą z (p–1)(q–1). Do obliczania kolejnych wyrazów losowych stosowany jest tu następujący wzór: xi1 xie mod n
przy czym pierwsza wartość (x0) wybierana jest losowo (musi być jednak mniejsza od n). Pseudolosowy ciąg wyjściowy tworzą najmniej znaczące bity kolejnych wyrazów losowych. Generator Bluma-Micaliego — wykorzystujący problem logarytmu
dyskretnego. Stosowany wzór przedstawia się następująco:
110
Podstawy kryptografii
xi g xi1 , mod p
gdzie g i p są liczbami pierwszymi. Bit wyjściowy zależny jest od wygenerowanej wartości x. Jeśli wartość ta jest mniejsza od (p–1)/2, bit przyjmuje wartość 1, natomiast jeśli jest większa lub równa (p–1)/2 — przyjmuje on wartość 0. Bezpieczeństwo opisanych generatorów określa się podobnie jak bezpieczeństwo algorytmów opartych na elementach teorii złożoności. I tak dla BBS opiera się ono na problemie faktoryzacji liczby n, dla RSA jest równoważne z problemem złamania algorytmu RSA, natomiast dla generatora Bluma-Micaliego sprowadza się do rozwiązania problemu logarytmu dyskretnego.
3.2.2.2. Generatory ciągów rzeczywiście losowych Opisane generatory liczb pseudolosowych, jakkolwiek bardzo przydatne, są do pewnego stopnia przewidywalne. Dla uzyskania większego bezpieczeństwa trzeba uzyskać ciągi liczb naprawdę losowych. W tym celu wykorzystuje się zjawiska losowe, które komputer może mierzyć. Dane z takich pomiarów są albo użytkowane na bieżąco, albo akumulowane w celu późniejszego wykorzystania. Wspomniane zjawiska losowe służą w charakterze ziarna dla wykorzystywanego algorytmu. Stosuje się tu wartości losowe, takie jak: ruchy wykonywane myszą przez użytkownika; częstotliwość naciskania przycisków myszy; aktualna pozycja myszy; częstotliwość naciskania klawiszy klawiatury; obraz aktualnie znajdujący się na monitorze; obciążenie procesora; parametry operacji dyskowych (czas wymagany do odczytu bloku, numer
przeszukiwanego sektora, zawartość poszczególnych obszarów dysku itp.); pomiar bitów rejestru zegara systemowego; sygnały urządzeń peryferyjnych.
Dobrym pomysłem jest używanie danych losowych pochodzących z różnych źródeł. Jeśli gromadzona w ten sposób ilość danych okaże się niewystarczająca, zawsze można wykorzystać wynik ich przekształcenia przez funkcję jednokierunkową. Bezpieczeństwo danych sprowadza się w tym momencie do bezpieczeństwa wykorzystanej funkcji. Działanie generatora liczb losowych zaimplementowanego w programie PGP oparte jest właśnie na pomiarze zdarzeń losowych. Do wygenerowania kluczy używa on ciągu losowego opartego na uderzeniach w klawiaturę i ruchach myszą wykonywanych przez użytkownika. Bufor, w którym znajdują się utworzone w ten sposób dane, jest wyposażony w moduł kontrolujący ich entropię.
Rozdział 3. Kryptografia w teorii
111
3.2.2.3. Najpopularniejsze algorytmy strumieniowe Istnieje wiele algorytmów strumieniowych. Najbardziej znane z nich to: A5 — oparty na trzech rejestrach LFSR o długości 19, 22, 23 bitów algorytm
strumieniowy. Jego ciągiem wynikowym jest suma modulo 2 danych wyjściowych tych rejestrów. Został zaprojektowany z myślą o szyfrowaniu danych w telefonii komórkowej GSM. W wyniku skutecznych ataków kryptoanalitycznych wycofany z użytku w 2007 roku. Rambutan — algorytm opracowany w brytyjskim GCHQ (skrót od ang.
Government Communication Headquarters — głównej rządowej kwaterze łączności), w związku z czym jego techniczne szczegóły są tajne. Wiadomo, iż wykorzystuje klucz o długości 112 bitów i pięć rejestrów LSFR. Używa się go głównie w implementacjach sprzętowych, które również nie są powszechnie dostępne. XPD/KPD — algorytm ten zaprojektowano w firmie Hughes Aircraft.
Początkowo był on tajny, ponieważ służyć miał do celów militarnych. Nosił wtedy nazwę XPD (skrót od ang. Exportable Protection Device). Po odtajnieniu zmieniono ją na KPD (skrót od ang. Kinetic Protection Device). Wyposażony jest w pojedynczy rejestr LSFR, do którego podłączone są tzw. filtry. Generują one bity łączone następnie w strumień klucza. RC4 — algorytm autorstwa Rona Rivesta. Pracuje w trybie OFB, opierając się
na 256 S-blokach. Zastosowany między innymi w programie Lotus Notes. W wyniku odkrytych luk w bezpieczeństwie RC4 opracowano zmodyfikowane wersje algorytmu - RC4+ i RC4A. WAKE — pracujący w trybie CFB algorytm autorstwa Davida Wheelera.
W pojedynczym cyklu wytwarza pojedyncze słowo 32-bitowe, które można następnie wykorzystać do sumowania modulo 2 z tekstem jawnym. Jego mocną stroną jest duża szybkość przeprowadzanych obliczeń, a słabą — wrażliwość na ataki ze znanym tekstem jawnym lub tajnym. Nanoteq — zaprojektowany w celu implementacji sprzętowej algorytm
wykorzystujący 127-bitowy rejestr LSFR. Początkowy stan rejestru ustalany jest na podstawie klucza. Podczas każdego przebiegu na podstawie stanu rejestru generowany jest jeden bit strumienia klucza. Arcfour — algorytm wykorzystujący klucze o długości 40 lub 128 bitów.
Jest kompatybilny z algorytmem RC4. Wykorzystano go między innymi w protokołach SSh, TLS oraz Ipsec. Helix — zaprojektowany przez Nielsa Fergusona szyfr strumieniowy
z wbudowaną obsługą kodu MAC. Może być używany zarówno do szyfrowania, jak i przeprowadzania uwierzytelniania. Jego działanie jest oparte głównie na operacjach dodawania modulo 232. SEAL — szyfr opracowany w firmie IBM. Używa ośmiu rejestrów 32-bitowych.
Jest to jeden z najszybszych dostępnych obecnie algorytmów.
112
Podstawy kryptografii SOBER-128 — algorytm umożliwiający zarówno szyfrowanie, jak
i przeprowadzanie operacji uwierzytelniania opartej na kodzie MAC. Wykorzystuje 128-bitowy klucz. Na wyjściu podaje klucz w postaci bloków o długości 32 bitów. Jego autorami są Philip Hawkes, Michael Paddon oraz Gregory G. Rose. E0 — szyfr strumieniowy stosowany w protokole Bluetooth. Wykorzystuje
cztery rejestry przesuwające o długościach 25, 31, 35 i 39 bitów. Wytworzony strumień klucza jest XOR-owany z tekstem jawnym. Najczęściej stosowany z kluczem o długości 128 bitów. VMPC — polski szyfr strumieniowy, który zyskał sobie już duże uznanie
w ogólnoświatowych środowiskach kryptologicznych. Został m.in. zaprezentowany na konferencji kryptograficznej organizowanej przez Międzynarodowe Stowarzyszenie Badań Kryptologicznych. Jego autorem jest Bartosz Żółtak. Achterbahn 128/80 — niemiecki szyfr strumieniowy obsługujący klucze
o długości 128 i 80 bitów, opracowany z myślą o zastosowaniach sprzętowych. Jego autorami są Berndt Gammel, Rainer Göttfert i Oliver Kniffler. ISAAC — opracowany przez Roberta J. Jenkinsa jr. generator liczb
pseudolosowych i szyfr strumieniowy w jednym. Wyjątkowo szybki, wykorzystywany między innymi w systemie Unix w ramach narzędzia shred służącego do bezpiecznego usuwania danych. HC-256/128 — dostępny w dwóch wersjach (dla klucza 256- i 128-bitowego)
algorytm szyfrujący o dużej szybkości. Jego autorem jest Hongjun Wu. Rabbit — algorytm opracowany z myślą o implementacji w oprogramowaniu.
Wykorzystuje klucze o długości 128 bitów i 64-bitowy wektor IV. Dostępny za darmo również dla zastosowań komercyjnych. MUGI — kolejny generator liczb pseudolosowych zaprojektowany również
jako algorytm szyfrowania strumieniowego. Bazuje na 128-bitowym kluczu i wektorze inicjującym o takiej samej długości, na wyjściu generując 64-bitowe ciągi znaków. Wykorzystuje S-boxy znane z algorytmu AES. Dokładny opis większości z tych algorytmów znaleźć można we wspomnianej już wcześniej książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C.
3.2.3. Szyfr blokowy czy strumieniowy? Szyfry blokowe mają bardziej uniwersalny charakter niż szyfry strumieniowe. Można je zastosować w dowolnym z wymienionych w tym rozdziale trybów, a także sprowadzać do postaci strumieniowej. Możliwe jest również odwrotne przekształcenie, a więc sprowadzenie szyfru strumieniowego do postaci blokowej. Szyfry strumieniowe są łatwiejsze do analizy matematycznej. Dzięki temu łatwiej je projektować, ale z drugiej strony łatwiej również dokonać ich kryptoanalizy.
Rozdział 3. Kryptografia w teorii
113
Algorytmy blokowe lepiej nadają się do implementacji programowej, natomiast strumieniowe — do implementacji sprzętowej. Wynika to z ilości danych, na których operują oba typy algorytmów. Szyfry strumieniowe wykonują wszystkie obliczenia na pojedynczych bitach lub bajtach, co jest dość czasochłonne. Szyfrowanie oparte na wygodnych dla obliczeń blokach danych zmniejsza potrzebny na to czas. Wszystko jest więc kwestią konkretnego przypadku i wymagań, jakie stawiamy przed wybieranym do zabezpieczania danych algorytmem.
3.3. Protokoły kryptograficzne Opracowanie dobrego algorytmu szyfrującego to dopiero początek. Do jego zastosowania w praktyce konieczna jest jeszcze odpowiednia implementacja. Algorytm musi być stosowany zgodnie z jego przeznaczeniem i przy zachowaniu odpowiedniej procedury, w przeciwnym bowiem wypadku może dojść do znacznego obniżenia bezpieczeństwa. Protokoły kryptograficzne tworzone są z myślą o praktycznym zastosowaniu algorytmów szyfrujących. Określają one zasady, na jakich odbywa się kryptograficznie zabezpieczana komunikacja dwóch lub więcej osób. Umożliwiają każdej ze stron realizację własnych celów i zapobiegają ewentualnym próbom oszustwa. Innymi słowy zmniejszają do niezbędnego minimum poziom zaufania konieczny do rozpoczęcia komunikacji. Przy ich konstruowaniu zakłada się bowiem, iż każda ze stron będzie próbowała oszukiwać, a protokół ma zadbać, by do tego nie doszło. Podobnie jak algorytmy szyfrujące, również protokoły mogą zostać złamane. Podczas ich tworzenia projektanci starają się przewidzieć jak najwięcej możliwych sposobów obejścia obowiązujących zasad, a następnie uniemożliwić takie działanie przez zastosowanie odpowiednich procedur. Jeśli jednak przeoczą jakąś możliwość, pojawi się luka w bezpieczeństwie. Stosowane i opracowywane protokoły prezentują różny stopień złożoności. W tym rozdziale zaprezentowane zostały prostsze z nich. Nie oznacza to, iż są one mniej bezpieczne. Po prostu pewne zadania wymagają mniej złożonej procedury niż inne. Na przykład uzgadnianie klucza sesji jest prostą czynnością w porównaniu z przeprowadzaniem elektronicznych wyborów (badania nad takim protokołem są już prowadzone).
3.3.1. Protokoły wymiany kluczy Jednym z podstawowych problemów związanych z tworzeniem bezpiecznego kanału komunikacji jest ustalenie wspólnego klucza szyfrującego. Poniższe protokoły umożliwiają użytkownikom tworzenie kluczy sesji w tajemnicy przed osobami postronnymi.
3.3.1.1. Protokół Diffiego-Hellmana W rozdziale 2. przy okazji omawiania logarytmu dyskretnego zapoznaliśmy się z protokołem Diffiego-Hellmana. Jest to najpowszechniej stosowany protokół wymiany klucza. Posiada on tę niewątpliwą zaletę, iż używać go można bez stosowania tajnych kluczy prywatnych. Można mu jednak wytknąć pewne wady, na przykład to, że do
114
Podstawy kryptografii
przekazania danych potrzebni są obaj użytkownicy. Jeśli jeden z nich jest nieobecny, ustalenie klucza sesji staje się niemożliwe i drugi użytkownik nie będzie mógł wysłać zaszyfrowanej wiadomości. Innym problemem jest udział większej liczby osób w procesie komunikacji. Ustalanie odrębnego klucza dla każdej możliwej pary może się okazać bardzo wymagające pod względem obliczeniowym. Jednym z proponowanych rozwiązań powyższych problemów jest utworzenie publicznej bazy danych, w której użytkownicy zapisywać będą swoje klucze publiczne w systemie Diffiego-Hellmana. Klucze te nie są niczym innym, jak resztą z gx mod p, przy czym każdy użytkownik wybiera własne x. Wówczas dowolna osoba może pobrać taki klucz publiczny z bazy i ustalić klucz sesji bez udziału użytkownika, do którego chce wysłać wiadomość. Mamy tu do czynienia z modyfikacją protokołu dostosowaną do konkretnych potrzeb użytkowników. Niestety, nie ma nic za darmo. Takie rozwiązanie powoduje konieczność przechowywania w sekrecie liczby x służącej do tworzenia klucza publicznego.
3.3.1.2. KEA Innym wariantem protokołu Diffiego-Hellmana jest KEA (skrót od ang. Key Exchange Algorithm). Został on opracowany w NSA w ramach badań na układem Clipper. Wykorzystywana jest tu 1024-bitowa liczba p, baza g (tej samej długości) oraz klucze prywatne x długości 160 bitów. Początkowo wszystko przebiega identycznie jak w „klasycznym” protokole Diffiego-Hellmana: ustalana jest liczba p, baza g oraz tajne liczby x poszczególnych osób biorących udział w komunikacji. Następnie użytkownicy przesyłają sobie reszty modulo p obliczone na podstawie ich tajnych liczb zgodnie ze wzorem: Yi g xi mod p
Od tego punktu protokół przebiega już nieco inaczej. Obie strony generują 160-bitowe liczby losowe r1 i r2. Następnie każda z nich oblicza: Ri g ri mod p
podstawiając własną wartość r. Otrzymany wynik wysyłany jest do drugiego użytkownika protokołu. Teraz pierwszy użytkownik oblicza wartości t oraz u w oparciu o poniższe wzory: t1 (Y2 ) r1 mod p g x 2 r1 mod p u1 ( R2 ) x1 mod p g r 2 x1 mod p
Drugi postępuje analogicznie, obliczając: t2 ( R1 ) x 2 mod p g r1 x 2 mod p u2 (Y1 ) r 2 mod p g x1r 2 mod p
Rozdział 3. Kryptografia w teorii
115
Uzyskane wyniki są identyczne i pozwalają każdemu użytkownikowi z osobna obliczyć tajną liczbę s w następujący sposób: s (ti ui ) mod p
Liczba ta jest wykorzystywana do utworzenia tajnego klucza sesji poprzez zastosowanie skomplikowanej procedury z użyciem algorytmu Skipjack. Procedura ta przebiega następująco: a) Pierwszych 80 bitów s tworzy liczbę v1, a kolejne — liczbę v2. b) v1 XOR-owane jest ze zdefiniowaną stałą równą 0x72f1a87e92824198ab0b
i w rezultacie tworzy klucz k.
c) Klucz ten jest wykorzystywany do dwukrotnego zaszyfrowania pierwszych
64 bitów liczby v2 algorytmem Skipjack. W ten sposób tworzone są 64 najbardziej znaczące bity klucza sesji. d) Pozostałych 16 bitów powstaje przez operację XOR-owania 16 najmniej
znaczących bitów v2 z 16 bitami wyniku pierwszego szyfrowania algorytmem Skipjack. Algorytm Skipjack — opracowany w NSA algorytm szyfrujący o długości bloku wynoszącej 64 bity. Może być stosowany w trybach ECB, CFB, OFB oraz CBC. Wykorzystywany klucz ma długość 80 bitów. Skipjacka wykorzystano w układach scalonych Capstone oraz Clipper, które opisałem w rozdziale 1.
Jak widać, wszystko to jest nieco zawiłe, jednak pozwala na tworzenie naprawdę losowych kluczy sesji. Podstawową wadą KEA jest znaczne w porównaniu z protokołem Diffiego-Hellmana wydłużenie obliczeń.
3.3.1.3. Wide-mouth frog Protokół wide-mouth frog pozwala na scentralizowane zarządzanie bezpieczeństwem komunikacji. Każdy klucz sesji ustalany jest za pośrednictwem serwera przechowującego klucze użytkowników. Nawiązanie bezpiecznego połączenia przebiega w następujących etapach: Dwaj użytkownicy (A i B) osobno generują swoje tajne klucze (ka i kb), po czym
przesyłają je na serwer. Każdemu kluczowi przypisywana jest nazwa użytkownika.
W celu nawiązania połączenia użytkownik A generuje klucz sesji ks, dołącza do
niego nazwę użytkownika B oraz znacznik czasowy, po czym szyfruje całość swoim kluczem ka. Wynik wraz z własną nazwą użytkownika przesyła na serwer.
Serwer odszyfrowuje wiadomość, uzyskując klucz ks. Dołącza do niego nazwę
użytkownika A oraz nowy znacznik czasu, a następnie szyfruje wiadomość kluczem użytkownika kb. Całość przesyłana jest do użytkownika B.
116
Podstawy kryptografii Po odszyfrowaniu wiadomości użytkownik B otrzymuje klucz sesji ks oraz
nazwę użytkownika A. W ten sposób utworzony zostaje bezpieczny kanał komunikacyjny.
Nie trzeba chyba tłumaczyć, dlaczego serwer powinien być dobrze zabezpieczony przed niepowołanym dostępem. Bezpieczeństwo wszystkich użytkowników protokołu skupia się w tym właśnie punkcie. Z drugiej strony takie rozwiązanie pozwala na znaczne uproszczenie komunikacji między wieloma osobami. Wprowadzony do protokołu znacznik czasu służy ochronie przed atakami przez powtórzenie, warto jednak dodać, iż nie jest to zabezpieczenie w 100% pewne. Aby tak było, zegary wszystkich biorących udział w protokole komputerów musiałyby być zsynchronizowane. Nie jest to zresztą jedyny przypadek znaczenia zegara w kryptografii. Dokładne odmierzanie czasu wymagane jest na przykład przy realizacji transakcji finansowych lub przy przeprowadzaniu aukcji internetowych. Niepowołana manipulacja czasem systemowym może doprowadzić do poważnych konsekwencji. Problem jest dość istotny, jednak jego dokładne omówienie wybiega poza ramy tej książki. Zainteresowanych odsyłam do Kryptografii w praktyce (patrz Bibliografia), gdzie poświęcono mu osobny rozdział. Wykorzystanie serwera jest bardzo popularnym rozwiązaniem problemu zarządzania kluczami. Innym przykładem protokołu bazującego na serwerze jest opracowany w Massachusetts Institute of Technology Kerberos. To dość skomplikowany protokół, generalnie jednak opiera się on na podobnej zasadzie co wide-mouth frog — użytkownicy kierują do serwera zapytania, podając nazwę użytkownika, z którym chcą się połączyć. Klucz sesji generowany jest na serwerze i szyfrowany tajnymi kluczami przed przesłaniem do użytkowników. Dostęp do poszczególnych elementów systemu kontrolowany jest za pomocą specjalnych biletów wydawanych przez osobny serwer. Ich ważność jest ograniczona czasowo. Istnieje również szereg innych protokołów uzgadniania klucza. Najważniejsze z nich to: Protokół Otwaya-Reesa — wykorzystuje się w nim wyłącznie kryptografię
symetryczną. Każdy użytkownik współdzieli z serwerem tajny klucz szyfrujący. Serwer jest odpowiedzialny za wygenerowanie i przekazanie użytkownikom klucza sesji. Udowodniono, że istnieje możliwość zakłócenia jego działania za pomocą ataku Man in the Middle. Poprawiona wersja znana jest jako protokół Yahaloma (patrz niżej). Protokół Needhama-Schroedera — w którym wykorzystano kryptografię
symetryczną. Klucze sesji generowane są po stronie serwera. Cała procedura protokołu została zaprojektowana z myślą o zapobieganiu atakom przez powtórzenie. Przeciwko temu protokołowi również przeprowadzono skuteczne ataki Man in the Middle. Obecnie dostępna jest już poprawiona wersja, znana jako protokół Needhama-Schroedera-Lowe’a. Protokół Yahaloma — oparty na zaledwie jednym kluczu. Klucz ten jest
współdzielony przez użytkowników ustalających klucz sesji i serwer obsługujący całą procedurę. Kluczem tym szyfrowane są nazwy użytkowników oraz stosowane w protokole liczby losowe.
Rozdział 3. Kryptografia w teorii
117
Protokół DASS — jego nazwa pochodzi od angielskiego skrótu Distributed
Authentication Security Service (protokół bezpiecznego uwierzytelnienia rozproszonego). Przyjęto w nim rozwiązanie hybrydowe, tzn. wykorzystujące zarówno kryptografię symetryczną, jak i asymetryczną. Wykorzystuje się w tym celu serwer dysponujący kluczami publicznymi użytkowników. Protokół Neumana-Stubblebine’a — opracowany z myślą o przeciwdziałaniu
atakom wykorzystującym brak synchronizacji zegarów w komunikujących się komputerach. Również i on opiera się na wykorzystaniu zaufanej strony (serwera) ustalającej klucze sesji na podstawie identyfikatorów użytkowników i generowanych przez nich liczb losowych. Protokół Denning-Sacco — także oparty wyłącznie na kryptografii asymetrycznej.
Obsługujący protokół serwer zapewnia bezpieczną wymianę kluczy publicznych, przy użyciu których podpisywane są klucze sesji i znaczniki czasu. Ich szczegółowe opisy znaleźć można w książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C.
3.3.2. Podpis cyfrowy Podpisywanie się pod dokumentami jest nieodłączną częścią handlu. Wraz z rozwojem handlu elektronicznego narodziła się potrzeba opracowania elektronicznych odpowiedników podpisów. Protokoły podpisu elektronicznego są próbą rozwiązania tego problemu. W Polsce prace nad wprowadzeniem podpisu elektronicznego ruszyły na początku roku 2001. Odpowiednia ustawa została uchwalona 18 września tego samego roku. Kolejny rok zajęło wprowadzanie odpowiednich aktów wykonawczych, w wyniku czego oficjalnie w polskim prawie podpis elektroniczny funkcjonuje dopiero od 16 sierpnia 2002 roku. Powstało kilka centrów certyfikacji (szerzej opisanych w rozdziale 4.) pozwalających na wyrobienie certyfikatu niezbędnego do wykonywania podpisów elektronicznych. Podobnie jak w przypadku pozostałych protokołów najpierw trzeba się zastanowić, jakie warunki musi spełniać poprawnie wykonany podpis elektroniczny. Dopiero wtedy można zacząć myśleć nad zastosowaniem konkretnych mechanizmów kryptograficznych. Z pewnością podpis powinien jednoznacznie wskazywać na tożsamość podpisującego i musi być weryfikowalny przez osoby trzecie (niebiorące udziału w komunikacji) w celu rozstrzygania ewentualnych sporów. Ponadto powinien być niepodrabialny. Osoba podpisująca nie może później wyprzeć się złożonego podpisu, jak również zmienić treści podpisanego dokumentu. Wreszcie sam podpis nie może zostać użyty po raz drugi ani też przeniesiony na inny dokument. Dodatkowo powinien być łatwy do sporządzenia i zweryfikowania (w kontekście koniecznej mocy obliczeniowej). W protokołach podpisu cyfrowego powyższe zadania są realizowane przy użyciu kryptografii asymetrycznej oraz jednokierunkowych funkcji skrótu. Są to funkcje jednokierunkowe generujące jako wynik skrót o określonej długości. Innymi słowy, dla dowolnie długiej wiadomości (nieprzekraczającej limitu wyznaczonego dla danego algorytmu) wynik będzie miał zawsze ten sam rozmiar (na przykład 160 bitów). Jest to bardzo
118
Podstawy kryptografii
przydatna właściwość, ponieważ często podpisywane dokumenty mają dość spore rozmiary. Bez funkcji skrótu obliczenia konieczne do wykonania podpisu znacznie by się wydłużały. Podpisywanie skrótu wiadomości trwa natomiast o wiele krócej. Opis popularnych funkcji skrótu (SHA-1, SHA-2, SHA-3 oraz MD5) znaleźć można w dodatku A. Wygenerowany skrót wiadomości podpisywany jest z wykorzystaniem klucza prywatnego użytkownika. Umożliwia to każdemu, kto ma dostęp do odpowiedniego klucza publicznego, zweryfikowanie tożsamości podpisującego. Zmiana treści dokumentu uniemożliwi weryfikację podpisującego, a samego podpisu nie można przenieść na inny dokument. Opisana procedura to „klasyczny” protokół podpisu cyfrowego. W zależności od potrzeb tworzone są również inne rozwiązania. Poniżej podaję niektóre z nich.
3.3.2.1. Niezaprzeczalne podpisy cyfrowe Nazwa tego typu protokołów może być nieco myląca, ponieważ protokoły niezaprzeczalne (oprócz tradycyjnej funkcji podpisywania dokumentów) uniemożliwiają weryfikację podpisu bez zgody podpisującego. Wiąże się ona jednak z tym, iż podpisujący nie może się również wyprzeć swojego podpisu. Protokół tego typu przebiega w następujący sposób: Użytkownik A przedstawia użytkownikowi B dokument wraz z wykonanym
przez siebie podpisem. Użytkownik B generuje liczbę losową i przesyła ją do użytkownika A. Użytkownik A dokonuje przekształcenia otrzymanej liczby w oparciu
o swój klucz prywatny. Przekształcenie to jest dosyć zawiłe matematycznie, najważniejszy jednak jest fakt, iż uzyskanie poprawnego (pasującego do podpisu) wyniku jest możliwe tylko przy wykorzystaniu klucza prywatnego osoby podpisującej. Użytkownik A wysyła wynik obliczeń do użytkownika B. Następuje weryfikacja podpisu.
Mimo wrażliwości na ataki typu Man in the Middle protokoły tego typu znajdują liczne zastosowania ze względu na możliwość kontrolowania procesu weryfikacji przez osobę podpisującą dokument. Dodatkowe podprotokoły pozwalają na dowodzenie autentyczności podpisów lub uniemożliwiają wypieranie się ich. Przykładowe algorytmy realizujące protokół podpisu niezaprzeczalnego to: Algorytm Chauma — oparty na potęgowaniu modulo liczba pierwsza p. Algorytm Boyar-Damagarda — oparty na algorytmie podpisu cyfrowego ElGamala. Algorytm Harna-Yanga — dla niezaprzeczalnych podpisów grupowych.
Informacje na temat tych algorytmów znaleźć można we wspomnianej już kilkakrotnie książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C.
Rozdział 3. Kryptografia w teorii
119
3.3.2.2. Niepodrabialne podpisy cyfrowe Najpierw wypada się zastanowić, jakie cechy musiałby posiadać podpis niepodrabialny. Ponieważ technologia podpisu opiera się na wykorzystaniu par kluczy publiczny i prywatny, ewentualne fałszerstwo wymagałoby znalezienia (lub odtworzenia) odpowiedniego klucza prywatnego. Taka operacja wymaga ogromnej mocy obliczeniowej, porównywalnej ze złamaniem szyfru asymetrycznego. Niemniej jednak nie można wykluczyć tego typu ataków. Jak im przeciwdziałać? Otóż jest to niemożliwe. Fałszerstwu nie da się zapobiec, można je jednak wykryć. Służą temu protokoły podpisów niepodrabialnych. Dla każdego klucza publicznego istnieje wiele pasujących kluczy prywatnych. Aby dokonać fałszerstwa, atakujący musiałby znaleźć ten właściwy, będący w posiadaniu osoby wykonującej podpis. Tymczasem o wiele większe jest prawdopodobieństwo uzyskania innego klucza prywatnego pasującego do badanych podpisów i klucza publicznego. Podpisy wykonane tym kluczem faktycznie będą weryfikowane jako należące do osoby, której podpis jest podrabiany. Niemniej jednak jeśli zajdzie taka konieczność, łatwo będzie udowodnić, że doszło do fałszerstwa, ponieważ wykonano je przy użyciu innego klucza prywatnego. Podpisy są w takim przypadku odmienne, chociaż pasują do tego samego klucza publicznego. W ten sposób zniwelowane zostaje ryzyko skutecznego ataku ze strony przeciwnika dysponującego dużą mocą obliczeniową, nadal jednak istnieje możliwość podrobienia podpisu poprzez kradzież właściwego klucza prywatnego.
3.3.2.3. Podpisy ślepe Ślepe podpisy cyfrowe opracowano z myślą o sytuacjach, w których podpisujący nie powinien poznać treści podpisywanego dokumentu. Być może wydaje się to niedorzeczne, jednak w pewnych okolicznościach może okazać się przydatne. Wyobraźmy sobie sytuację, w której jeden z uczestników protokołu występuje w charakterze notariusza. Potwierdza swoim podpisem dostarczenie pewnego dokumentu przez innego użytkownika. Jednocześnie dostarczyciel chciałby mieć pewność, iż notariusz nie pozna informacji zawartych we wspomnianym dokumencie. Najprostszym rozwiązaniem w takiej sytuacji jest wykorzystanie tzw. czynnika zaciemniającego. Jest to wybrana losowo zmienna, przez którą użytkownik A mnoży wysyłane do podpisu dane. Użytkownik B (notariusz) składa podpis pod tak przekształconym dokumentem, nie mając możliwości uzyskania żadnych informacji co do jego treści (o ile zmienna wybrana była w sposób naprawdę losowy), a następnie odsyła go użytkownikowi A. Ten usuwa zaciemnienie i otrzymuje pierwotny dokument wraz z podpisem. Być może zorientowaliście się już, jaką wadę ma takie rozwiązanie. Użytkownik B nie ma żadnej możliwości sprawdzenia, czy tak naprawdę nie podpisuje zobowiązania wpłaty sporej sumy na konto użytkownika A. Aby temu zapobiec, udoskonalono całą procedurę w poniżej opisany sposób.
120
Podstawy kryptografii
Użytkownik A przygotowuje dokument do podpisu, po czym wykonuje n jego kopii. Wszystkie kopie, każda po przemnożeniu przez inny czynnik zaciemniający, przesyłane są do użytkownika B. Ten prosi użytkownika A o dostarczenie czynników zaciemniających dla n–1 dokumentów. Wszystkie te dokumenty sprawdzane są pod kątem potencjalnego oszustwa. Jeśli okażą się formalnie poprawne, podpis jest składany pod jedynym nieodszyfrowanym plikiem. Aby móc oszukać tak skonstruowany protokół, użytkownik A musiałby przewidzieć (a raczej zgadnąć), o które czynniki zaciemniające poprosi go użytkownik B. Prawdopodobieństwo takiego wydarzenia wynosi 1/n. Innymi słowy, im większe n, tym większe prawdopodobieństwo wykrycia złych zamiarów ze strony wysyłającego dokument. Jeśli dodamy do tego surową karę za wszelkie próby oszustwa, protokół powinien zapewnić duże bezpieczeństwo.
3.3.2.4. Inne warianty podpisu cyfrowego Oprócz powyższych wymienić można również inne protokoły dokonywania podpisów cyfrowych, opierające się na podobnych rozwiązaniach: Podpisy pośrednie (ang. proxy signatures) pozwalają na wstawianie podpisów
przez użytkownika B w imieniu użytkownika A bez znajomości jego klucza prywatnego. Podpisy z wyznaczonym potwierdzającym (ang. designated confirmer
signatures) umożliwiają weryfikację podpisu przez osobę trzecią. Dzięki temu potwierdzenie poprawności podpisu jest możliwe nawet w sytuacji, kiedy osoba podpisująca jest niedostępna (na przykład ze względu na chorobę lub wyjazd), a także w przypadku utraty przez nią klucza prywatnego. Podpisy grupowe (ang. group signatures) służą nie tyle sprawdzeniu
tożsamości podpisującego, ile jego przynależności do danej grupy. Innymi słowy, protokół obsługuje przyznawanie uprawnień w obrębie określonego zbioru użytkowników. Podpisy sprawdzane są jedynie pod kątem przynależności danego użytkownika do wspomnianego zbioru. Jego tożsamość może być jednak ujawniona, jeśli zachodzą wątpliwości co do autentyczności podpisu. Więcej informacji na temat podpisów cyfrowych znaleźć można w publikacjach takich jak Podpis elektroniczny, klucz publiczny, Ochrona danych i zabezpieczenia w systemach teleinformatycznych, Podpis elektroniczny, Kryptografia w praktyce, Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C, Kryptografia w teorii i praktyce (szczegółowe dane na temat tych pozycji znajdują się w Bibliografii).
3.3.3. Dzielenie sekretów Wyobraźmy sobie sytuację, w której dostęp do tajnych informacji mogą mieć tylko nieliczne osoby, a dodatkowo żadna z nich nie powinna tego dostępu uzyskać bez autoryzacji pozostałych. Innymi słowy, informacja może być ujawniona tylko za zgodą wszystkich członków grupy lub ich określonej liczby. Do realizacji tego typu zadań służą protokoły dzielenia sekretów — secret splitting oraz secret sharing.
Rozdział 3. Kryptografia w teorii
121
3.3.3.1. Secret splitting Protokoły secret splitting (rozdzielanie sekretu) umożliwiają prosty podział odpowiedzialności za tajne dane między określoną liczbę osób. Dla każdej z nich generuje się osobny klucz si. Następnie klucze są ze sobą XOR-owane, w wyniku czego powstaje klucz S, którym szyfrowane są tajne informacje. Klucz można odtworzyć poprzez ponowne XOR-owanie kluczy wszystkich osób. Dzięki temu ujawnienie informacji nie jest możliwe, jeśli choć jedna osoba jest temu przeciwna. Podstawową wadą tego protokołu jest ryzyko związane z utratą jednego z kluczy osobistych. W takim przypadku odtworzenie wiadomości będzie niemożliwe. Innym sposobem na podzielenie sekretu jest zaszyfrowanie wiadomości kluczem jednorazowym, a następnie przekazanie kryptogramu jednej osobie, a klucza drugiej. Jeśli osób jest więcej, można dokonać podziału klucza lub kryptogramu, jednak w tym pierwszym przypadku musimy zadbać, aby klucz był odpowiednio długi. Secret splitting jest dość prostym protokołem i posiada wiele ograniczeń. O wiele więcej możliwości oferuje technika secret sharing.
3.3.3.2. Secret sharing Protokoły secret sharing (współdzielenie sekretu) likwidują problem utraty podkluczy, umożliwiając dekryptaż wiadomości przy użyciu ich określonego podzbioru. Innymi słowy, do ujawnienia informacji konieczna jest zgoda tylko części osób biorących udział w protokole. Rozwiązania tego typu tworzyć można w oparciu o układy równań wielomianowych stopnia n. Jak wiadomo, do jednoznacznego wyznaczenia rozwiązania takiego wielomianu potrzeba n+1 wartości spełniających jego równanie. Najlepiej widać to podczas rysowania wykresów. Dla wielomianu stopnia pierwszego wykresem jest prosta. Aby ją narysować, potrzebujemy dwóch punktów spełniających równanie. W przypadku równania kwadratowego (tu wykresem jest parabola) musimy już wyznaczyć trzy punkty. W przeciwnym wypadku liczba możliwych wykresów byłaby nieskończona. Protokół secret sharing oprzeć można na powyższej właściwości funkcji. Jeśli mamy tajną wiadomość S, wstawiamy ją jako parametr do równania funkcji szyfrującej. Stopień używanego wielomianu dobieramy w zależności od liczby osób wymaganej do odczytania wiadomości. Następnie dla każdego uczestnika wyznaczamy inny argument funkcji i obliczamy jej wartość. Po usunięciu parametrów funkcji jej rozwiązanie będzie możliwe tylko przy udziale n+1 osób. Oto przykład. Dana jest funkcja kwadratowa określona wzorem: y 2 x 2 3x 4
przy czym 4 jest naszą tajną wiadomością.
122
Podstawy kryptografii
Załóżmy, że mamy pięciu użytkowników. Dla każdego z nich wybieramy inny argument funkcji (aby nie komplikować obliczeń, niech będzie to 1, 2, 3, 4, 5) i obliczamy wartość (odpowiednio 9, 18, 31, 48, 69). Tak obliczone pary liczb nazywamy cieniami. Każdy użytkownik otrzymuje swój cień, a parametry równania są usuwane z pamięci. Aby teraz obliczyć ich wartości, konieczne jest ułożenie przynajmniej trzech układów równań opartych na parach liczb należących do różnych uczestników protokołu. Można również konstruować modele pozwalające na uczestnictwo większej liczby osób. W tym celu wystarczy użyć funkcji większego stopnia. Do rozwiązania równania stopnia trzeciego konieczne są cztery punkty, stopnia czwartego — pięć punktów itd. Dzięki temu możliwe jest nadawanie zwiększonych uprawnień wybranemu użytkownikowi przez powierzenie mu więcej niż jednej pary liczb spełniających równanie. W praktyce stosuje się różne odmiany secret sharing w zależności od potrzeb. Można na przykład przyznać jednej z osób specjalne uprawnienia, dzięki którym jej udział będzie konieczny do odszyfrowania wiadomości. Wykorzystuje się także różne typy algorytmów pozwalających na dokonanie podziału sekretu. Najbardziej znane spośród nich to: Algorytm wielomianu interpolacyjnego Lagrange’a — podobny do
przytoczonego w powyższym przykładzie, udoskonalony o obliczanie reszt modulo liczba pierwsza p. Jego bezpieczeństwo jest porównywalne z bezpieczeństwem szyfru opartego na kluczu jednorazowym. Algorytm Karnina-Greene’a-Hellmana — wykorzystuje mnożenie macierzy
rzędu m składających się z wektorów V. Cienie tworzy się, mnożąc wektory V przez wektor wierszowy U. Odtworzenie sekretu jest możliwe jedynie przy użyciu m lub więcej cieni. Algorytm wektorowy — opiera się na wykorzystaniu współrzędnych
w przestrzeni n-wymiarowej. Tajną wiadomość określa punkt w przestrzeni, cienie natomiast są równaniami hiperpłaszczyzn (n–1)-wymiarowych. Liczba równań potrzebnych do wyznaczenia punktu zależy od liczby wymiarów przestrzeni. Jeśli na przykład chcemy, aby potrzebne do odszyfrowania były cztery cienie, powinniśmy wyznaczyć punkt w przestrzeni czterowymiarowej. Algorytm Asmutha-Blooma — wykorzystuje liczby pierwsze oraz chińskie
twierdzenie o resztach do wyznaczenia dowolnej liczby cieni. Wadą secret sharing jest możliwość dokonania oszustwa podczas odszyfrowywania informacji. Jedna z osób mogłaby podać złe parametry, wskutek czego niemożliwe byłoby otrzymanie właściwego tekstu jawnego. Co gorsza, w takiej sytuacji nie da się również stwierdzić, kto z uczestników dokonał sabotażu. Z tego względu tworzone są protokoły współdzielenia sekretów z oszukującymi. Protokoły te są dość zaawansowane, dlatego nie będę ich dokładnie omawiać. Dokładny ich opis znaleźć można w książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C.
Rozdział 3. Kryptografia w teorii
123
3.3.4. Inne protokoły Opisane powyżej protokoły są najczęściej spotykane w literaturze dotyczącej kryptografii i bezpieczeństwa danych. W tym rozdziale pokrótce omówię inne, nie mniej istotne metody pozwalające rozwiązywać problemy związane z bezpieczną wymianą i przechowywaniem informacji.
3.3.4.1. Znakowanie czasowe We wcześniejszej części tego rozdziału omówiłem rolę, jaką odgrywa odmierzanie czasu w operacjach związanych z ochroną danych. Zagadnienie to w bezpośredni sposób wiąże się z problematyką oznaczania dokumentów pod względem czasu ich sporządzenia. Po raz kolejny odwołam się tutaj do przykładu sporządzania aktów notarialnych. Bardzo często notariusze potwierdzają złożenie dokumentu przez daną osobę określonego dnia. Jak przeprowadzić taką operację w sposób elektroniczny? Na początek trzeba rozważyć, jakie warunki musiałby spełniać stosowny protokół. Przede wszystkim znacznik czasu musi być zgodny z rzeczywistą datą i godziną potwierdzenia dokumentu. Niebagatelną rolę odgrywa tu odpowiedni mechanizm odmierzania czasu. Znacznik ów musi być również niezależny od nośnika fizycznego, na którym znajdują się dane. Ponadto protokół powinien uniemożliwiać modyfikację danych po ich oznakowaniu. Rozwiązaniem, które od razu przychodzi na myśl, byłoby zastosowanie serwera w roli cyfrowego notariusza. Użytkownicy wysyłają do niego pliki, a serwer zwraca je wraz ze swoim podpisem i stosownym znacznikiem czasu, zachowując dla siebie kopie. Pojawia się jednak problem z przechowywaniem tak dużej ilości danych oraz zachowaniem ich poufności. Dlatego ulepszone wersje tego typu protokołów zakładają stosowanie skrótów wiadomości uzyskanych za pomocą bezpiecznych funkcji skrótu. Dzięki temu likwiduje się również zagrożenia związane z występowaniem błędów w czasie transmisji danych. Pozostaje jednak jeszcze jedna kwestia — uczciwość osób odpowiedzialnych za serwer certyfikujący. Działając w zmowie z użytkownikami, mogą one preparować dokumenty ze stosownym znacznikiem czasu w celu uzyskania korzyści finansowych. Aby przeciwdziałać tego typu praktykom, opracowano kolejny protokół, zwany protokołem łączącym (poprzedni nazywany był protokołem arbitrażowym). Mówiąc najprościej, zakłada on łączenie znacznika każdego dokumentu ze znacznikami dokumentów poprzednich. Odbywa się to na następującej zasadzie: Użytkownik A przesyła do serwera swój identyfikator oraz skrót wiadomości. Serwer oblicza znacznik czasu zgodnie z następującym wzorem: Tn S k (n, A, H n , tn , I n1 , H n1 , Tn1 , Ln )
gdzie: Sk — przekształcenie przy użyciu klucza prywatnego serwera, n — numer porządkowy podpisywanego dokumentu,
124
Podstawy kryptografii
A — identyfikator użytkownika A, Hn — skrót podpisywanego dokumentu, tn — data i godzina podpisania dokumentu, In–1 — identyfikator poprzedniego dokumentu, Ln — zmienna wiążąca bieżący dokument z poprzednim poprzez obliczenie następującego skrótu: Ln H ( I n1 , H n1 , Tn1 , Ln1 )
Po oznakowaniu kolejnego dokumentu serwer powiadamia o tym użytkownika A, przesyłając mu jednocześnie identyfikator tego dokumentu. Dzięki temu każdy uczestnik protokołu może dowieść autentyczności daty znajdującej się pod jego danymi poprzez porównanie z dokumentami oznaczonymi wcześniej i później. Uniemożliwia to dokonanie opisanego powyżej fałszerstwa, ponieważ każdy dokument osadzony jest w „łańcuchu” innych dokumentów, którego nie można przerwać. Wystawianie znaczników z datą przyszłą wymaga z kolei dokładnego przewidzenia, jakie dokumenty zostaną złożone do podpisu w międzyczasie. Protokół łączący również nie jest pozbawiony wad. Wystarczy bowiem, aby jeden z poprzednich znaczników został z jakichkolwiek przyczyn utracony, a niemożliwe stanie się potwierdzenie autentyczności kolejnego dokumentu. Problem ten rozwiązano w ramach tzw. protokołu dystrybucyjnego. Każdy uczestnik tego protokołu wysyła swój dokument do dziesięciu innych uczestników, ci zaś podpisują go swoimi kluczami prywatnymi i opatrują stosownym znacznikiem czasu. Aby mieć pewność, iż użytkownicy nie będą działać w zmowie, osoby te mogą być również wybierane losowo. Stosowny generator liczb losowych mógłby pobierać skrót wiadomości w charakterze ziarna i generować na tej podstawie n numerów traktowanych jako identyfikatory poszczególnych osób.
3.3.4.2. Dowody z wiedzą zerową Wyobraźcie sobie taką oto sytuację. Firma A opracowała rozwiązanie techniczne pewnego trudnego problemu. Firma B jest zainteresowana kupnem owego rozwiązania, chce jednak mieć pewność, iż firma A faktycznie je posiada. W jaki sposób firma A ma udowodnić swoją wiedzę, nie zdradzając jednocześnie szczegółów nowej technologii? Służą do tego protokoły dowodu z wiedzą zerową (ang. zero-knowledge proofs). Dzięki nim strona A może udowodnić, iż posiada jakąś informację, nie zdradzając żadnych jej szczegółów. Z pozoru wydaje się to nieprawdopodobne, a jednak podczas czytania tej książki zdążyliście już poznać jeden praktyczny przykład wykorzystania tego typu protokołu — szyfrowanie z zastosowaniem RSA. Podczas tworzenia pary kluczy generowane są dwie duże liczby pierwsze, a następnie w obliczeniach wykorzystywany jest ich iloczyn. Osoba podpisująca dokument kluczem prywatnym udowadnia każdej osobie mającej dostęp do klucza publicznego, iż zna oba czynniki pierwsze wspomnianego iloczynu, nie zdradzając jednocześnie ani jednego bitu żadnego z nich.
Rozdział 3. Kryptografia w teorii
125
Dowód z wiedzą zerową wykorzystuje się również w protokole SSH. Użytkownik otrzymuje liczbę losową zaszyfrowaną jego kluczem publicznym. Po odszyfrowaniu generuje jej skrót i przesyła do serwera. W ten sposób udowadnia swoją wiedzę, nie zdradzając wartości liczby przed ewentualnymi podsłuchującymi. Z matematycznej strony dowody z wiedzą zerową powiązane są w istotny sposób z pojęciem izomorfizmu (patrz rozdział 2.). Całościowe objaśnienie tego zagadnienia wykracza poza ramy tej książki. W książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C opisano dokładnie całą tę problematykę wraz z przykładowymi algorytmami.
3.3.4.3. Kanały podprogowe Najogólniej mówiąc, kanał podprogowy (ang. subliminal channel) jest nowoczesną odmianą steganografii. Umożliwia on prowadzenie tajnej korespondencji na oczach przeciwników. Zakłada się, iż mają oni dostęp do wymienianych informacji, dlatego też sekretny przekaz musi być ukrywany w pozornie niewinnej treści. Współcześnie popularną formą realizacji tego zadania jest protokół wykorzystujący podpis cyfrowy. Przebiega to w sposób opisany poniżej. Po napisaniu wiadomości użytkownik A podpisuje ją tajnym kluczem wykorzystywanym do komunikacji z użytkownikiem B. Protokół podpisu zawiera specjalny algorytm nazywany jądrem protokołu kanału podprogowego. Umożliwia on umieszczenie tajnej wiadomości w wykonywanym podpisie. Inni użytkownicy mogą przeczytać wiadomość, a nawet sprawdzić podpis. Weryfikacja przebiegnie w standardowy sposób, nie ujawniając niczego podejrzanego. Tymczasem użytkownik B po sprawdzeniu podpisu (aby upewnić się co do źródła, z którego pochodzi wiadomość) używa tajnego klucza do wydobycia z niego informacji podprogowej. Jak widać, jest to technika doskonalsza od klasycznej steganografii. Tam bowiem całe bezpieczeństwo opierało się na utajnieniu faktu istnienia wiadomości. Tutaj natomiast chroniona jest ona dodatkowo przy użyciu tajnego klucza. Nawet gdyby osoba kontrolująca korespondencję dowiedziała się o zawartych w niej tajnych przekazach, pozostanie problem ich wydobycia. W tym celu należałoby załamać zastosowany szyfr. Problematyka kanału podprogowego w podpisach cyfrowych stała się na tyle głośna, iż opracowano specjalne algorytmy podpisów cyfrowych wolnych od informacji podprogowych. Jak łatwo się domyślić, umożliwiają one podpisywanie wiadomości, uniemożliwiając jednocześnie zawieranie tajnych danych w wykonywanych podpisach. Co ciekawe, w algorytmie DSA występuje możliwość implementacji kanału podprogowego i opracowano już sposób przeciwdziałania tego typu próbom. Całe zagadnienie opisane zostało we wspomnianej przed chwilą książce.
3.3.4.4. Protokoły uwierzytelniające Jak łatwo się domyślić, protokoły uwierzytelniające pozwalają na potwierdzenie tożsamości stron w trakcie komunikacji. Najpopularniejsze z nich to:
126
Podstawy kryptografii Protokół Fiata-Shamira. Opiera się on na problemie wyznaczania
pierwiastków kwadratowych modulo n, gdzie n jest iloczynem dwóch liczb pierwszych. W pierwszej kolejności generowane są klucze poszczególnych użytkowników (w procesie tym bierze udział niezależna instytucja obdarzana zaufaniem przez wszystkie strony biorące udział w komunikacji). Procedura uwierzytelniania ma charakter probabilistyczny (im więcej razy zostanie powtórzona, tym większa szansa na poprawne ustalenie tożsamości rozmówcy). Protokół Schnorra. Protokół ten oparty jest na problemie logarytmu
dyskretnego. Wykorzystuje certyfikaty tożsamości wydawane przez specjalny serwer. Protokół Guillou-Quisquartera. Jest on podobny do protokołu Schnorra,
ale oparty na algorytmie RSA. Także i ten protokół używa certyfikatów tożsamości wydawanych przez niezależny serwer, choć można go zmodyfikować tak, by udział zaufanej strony w komunikacji nie był konieczny. Dokładne opisy wymienionych protokołów znaleźć można w publikacji Kryptografia — teoria i praktyka zabezpieczania systemów komputerowych (patrz Bibliografia). W książkach i opracowaniach z dziedziny kryptologii spotkać można również następujące protokoły: Zobowiązania bitowe — dzięki nim użytkownik A może udowodnić
użytkownikowi B swoją wiedzę dotyczącą pewnego aspektu przyszłości, nie zdradzając jednocześnie samej informacji. Rzucanie monetą — pozwala na dokonywanie cyfrowych „rzutów monetą”,
czyli na generowanie losowych bitów. Przy ich użyciu można na przykład generować klucze sesyjne. Ujawnianie tajemnic — umożliwia jedno- lub wielostronną wymianę tajnych
informacji między użytkownikami. Warunki wymiany zależą od konkretnego protokołu. Jako przykłady wymienić można protokoły pokerowe czy protokół wszystko albo nic. Protokoły kryptograficzne bardzo szczegółowo opisane zostały w książce Kryptografia dla praktyków. Protokoły, algorytmy i programy źródłowe w języku C. Znajduje się tam również wiele cennych uwag dotyczących ich konstruowania, implementacji oraz oceny. Inne książki poruszające tę tematykę to Kryptografia w praktyce oraz Kryptologia — budowa i łamanie zabezpieczeń (szczegółowe informacje dotyczące tych pozycji zawarto w Bibliografii).
3.4. Infrastruktura klucza publicznego Skrót PKI oznacza infrastrukturę klucza publicznego (ang. Public Key Infrastructure) i odnosi się do rozwiązań mających na celu zarządzanie kluczami publicznymi użytkowników. O ile bowiem wymiana zaszyfrowanej korespondencji między znajomymi nie wymaga specjalnego systemu zarządzania kluczami szyfrującymi, o tyle w przypadku
Rozdział 3. Kryptografia w teorii
127
rozwiązań na większą skalę system taki jest konieczny. Wówczas bowiem mamy do czynienia z większą liczbą użytkowników i konieczne jest rozwiązanie problemu bezpiecznej dystrybucji kluczy. Jaką mamy bowiem gwarancję, że pobrany przez nas z serwera klucz publiczny faktycznie należy do danej osoby? Może mamy do czynienia z atakiem Man in the Middle? Konieczne staje się zatem utworzenie zaufanej instytucji, która potwierdzałaby przynależność kluczy do poszczególnych osób i organizacji. Tu pojawia się PKI.
3.4.1. PKI w teorii… PKI jest rozwiązaniem pozwalającym na przypisywanie użytkownikom kluczy i uniemożliwianie fałszerstw opartych na ich podmienianiu. Jak jednak miałoby to działać? Na początek przedstawię model teoretyczny. PKI zakłada istnienie centralnej instytucji obdarzonej powszechnym zaufaniem, której zadaniem byłoby wydawanie, przechowywanie i udostępnianie kluczy publicznych oraz udzielanie informacji o nich. Instytucję taką nazywamy centrum certyfikacji (stosuje się również skrót CA pochodzący od angielskiej nazwy certification authority). Każdy nadesłany klucz publiczny podlega procesowi certyfikacji — użytkownik, który go nadesłał, proszony jest o podanie swoich danych osobowych, a te są przez centrum weryfikowane. Jeśli podane informacje okażą się prawdziwe, do klucza zostaje przypisany odpowiedni certyfikat, w którym potwierdza się, iż klucz ten należy do danego użytkownika. Certyfikat zawiera podpis elektroniczny centrum certyfikacji, dzięki czemu każdy może zweryfikować jego autentyczność. Jedynym warunkiem jest tutaj ogólna dostępność klucza publicznego danego centrum. Klucze użytkowników są przechowywane w centrum certyfikacji i powszechnie udostępniane. W każdej chwili możliwe jest usunięcie własnego klucza z bazy danych (na przykład w przypadku kompromitacji klucza prywatnego). Przedstawione rozwiązanie wygląda elegancko i sprawia wrażenie bezpiecznego. Mamy oto zaufaną instytucję umożliwiającą wszystkim bezpieczną komunikację z użyciem kryptografii asymetrycznej. Rzeczywistość jak zwykle wygląda nieco inaczej.
3.4.2. …i w praktyce Opisany powyżej model PKI nie ma prawa zaistnieć w realnym świecie. Rozwiązania stosowane w praktyce znacznie różnią się od idealnego modelu. W tym rozdziale wskażę najważniejsze przeszkody stojące na drodze do jego konstrukcji oraz ich wpływ na kształt rzeczywistych struktur PKI.
3.4.2.1. Złożoność Nasz idealny model zakładał istnienie centralnego urzędu certyfikacji obsługującego wszystkich użytkowników. Jeśli weźmie się pod uwagę potencjalną liczbę tych użytkowników, od razu staje się jasne, dlaczego model taki nie ma prawa poprawnie działać. Szacuje się, że do internetu ma dostęp ponad miliard ludzi. Do tego doliczyć należy
128
Podstawy kryptografii
osoby prawne (przedsiębiorstwa, banki itp.). Być może nie każdy użytkownik będzie chciał korzystać z PKI, ale niektórzy będą potrzebować więcej niż jednego klucza. Takie centrum musiałoby przypisać każdemu z nich unikatową nazwę powiązaną z odpowiednim kluczem. Nazwa ta powinna umożliwiać innym użytkownikom jednoznaczną identyfikację właścicieli kluczy. Jest to problem praktycznie nierozwiązywalny. Wiele krajów wprowadziło numery identyfikacyjne dla swoich obywateli (przykładem może być PESEL), tu jednak mamy do czynienia z systemem identyfikacji w skali globalnej. Wykorzystanie numerów identyfikacyjnych nadanych w poszczególnych krajach nie wchodzi w rachubę z dwóch powodów — po pierwsze: rozwiązanie to nie funkcjonuje wszędzie, a po drugie: w niektórych krajach wykorzystywanie takich danych jest zabronione przez prawo o ochronie danych osobowych. Już ta jedna przeszkoda uniemożliwia powołanie ogólnoświatowego centrum certyfikacji. Na tym jednak nie koniec.
3.4.2.2. Zaufanie Kolejny problem wynika bezpośrednio z poprzedniego. W jaki sposób skłonić wszystkich użytkowników, aby zaufali naszemu centrum? Pamiętajcie, że mamy do czynienia z dziesiątkami albo nawet setkami milionów ludzi na całym świecie. Ustanowienie instytucji, której ufaliby wszyscy, jest po prostu niemożliwe. Jest to o tyle istotne, że w wielu przypadkach certyfikowane klucze służą do ochrony ważnych transakcji handlowych. Zaufanie i pewność co do tożsamości drugiej strony jest tutaj podstawową sprawą. Rozwiązaniem powyższych problemów jest odejście od koncepcji uniwersalnego PKI na rzecz struktury rozproszonej. Główne centra certyfikacji podpisują certyfikaty regionalnych, te z kolei mogą potwierdzać certyfikaty jeszcze niższego szczebla itd. W ten sposób powstaje tzw. ścieżka certyfikacji, a więc lista kolejnych centrów potwierdzających dany certyfikat. Na samej górze znajduje się centrum główne, poniżej zaś kolejne, aż do tego, które bezpośrednio podpisało nasz certyfikat. Takie rozwiązanie znacznie ułatwia organizację wydawania certyfikatów. Dzięki istnieniu centrów certyfikacji w poszczególnych krajach i regionach o wiele prostsza staje się obsługa większej liczby użytkowników, a przeszkody związane z brakiem zaufania zostają w znaczny sposób ograniczone. Istnieje jednak pewna wada takiego rozwiązania. Otóż struktura wielopoziomowa jest bardziej podatna na fałszerstwa niż struktura scentralizowana. Każdy punkt w ścieżce certyfikacji to potencjalne miejsce ataku. Złożoność zawsze źle wpływa na bezpieczeństwo i podobnie jest również w tym przypadku. Ciekawe rozwiązanie tego problemu podano we wspomnianej już wyżej książce Kryptografia w praktyce: regionalne centrum podpisuje certyfikat użytkownika, a następnie wysyła go do centrum głównego. Tam sprawdzana jest poprawność ścieżki certyfikacji i jeśli przebiegnie ona poprawnie, wystawiany jest nowy certyfikat, podpisany bezpośrednio przez tę instytucję. Takie rozwiązanie rokuje pewne nadzieje, jednak jak dotąd nie jest stosowane w praktyce.
Rozdział 3. Kryptografia w teorii
129
3.4.2.3. Cykl życia klucza Inny problem, przed jakim stają projektanci i użytkownicy PKI, związany jest z cyklem życia kluczy. Generalnie wyróżnić tu można sześć etapów: utworzenie, certyfikacja, rozprowadzanie, użytkowanie aktywne, użytkowanie pasywne, unieważnienie klucza.
Tworzenie klucza i jego certyfikacja do stosunkowo krótkie i proste etapy. Problemy związane z wystawianiem zaufanego certyfikatu przedstawiłem we wcześniejszej części tego rozdziału. Kolejnym etapem jest rozprowadzanie klucza zarówno przez jego właściciela, jak i przez centrum certyfikacji (klucz jest umieszczany na serwerze, skąd każdy może go pobrać). Użytkowanie aktywne oznacza etap, w którym użytkownik korzysta ze swojego klucza prywatnego do szyfrowania wiadomości, a pozostali deszyfrują je kluczem publicznym. Użytkowanie pasywne rozpoczyna się w momencie wycofania z użytku klucza prywatnego. Bywa to na ogół spowodowane jego zmniejszonym bezpieczeństwem. Może się ono wiązać z jego kompromitacją lub zbyt długim okresem użytkowania. Okres taki może trwać kilka miesięcy lub nawet kilka lat, w zależności od przypadku. Im cenniejsze informacje chroni klucz, tym częściej należy go zmieniać. Powszechną praktyką jest wyznaczanie limitu określającego ilość danych, które można bezpiecznie zaszyfrować danym kluczem. Po jego przekroczeniu pojawia się ryzyko wycieku chronionych informacji (sytuacja taka bywa również określana jako zmęczenie klucza). W związku z powyższym w systemach przetwarzających duże ilości tajnych danych stosuje się rozdzielanie kluczy. Polega ono na przypisywaniu osobnych kluczy do poszczególnych typów danych, osób czy zastosowań. Dzięki temu zmniejszana jest liczba informacji szyfrowanych pojedynczym kluczem, co wydłuża okres jego użytkowania. Dodatkową zaletą tego rozwiązania jest ograniczenie strat związanych z ewentualną kompromitacją klucza. Warto tu również zaznaczyć, iż decyzja w kwestii unieważnienia klucza niekoniecznie musi zależeć od właściciela klucza. Centra certyfikacji często wyznaczają okres ważności certyfikatu, po którym przypisany mu klucz publiczny przestaje być ważny. Również same centra muszą co jakiś czas zmieniać swoje klucze. Po wycofaniu klucza następuje z reguły kilkumiesięczny okres, w trakcie którego użytkownik nadal będzie odbierał zaszyfrowane nim wiadomości, jednak sam nie będzie już szyfrował niczego odpowiadającym mu kluczem prywatnym. Klucz jest nadal akceptowany, dzięki czemu można zakończyć wszelkie rozpoczęte wcześniej operacje. Po tym okresie klucz zostaje unieważniony. I w tym miejscu zaczynają się problemy. Unieważniony certyfikat umieszczony zostaje na specjalnej liście CRL (lista odwołań certyfikatów). Każdy użytkownik, który chce wykorzystać do szyfrowania pobrany wcześniej z serwera klucz publiczny, powinien najpierw sprawdzić, czy klucz ów nie
130
Podstawy kryptografii
znajduje się na tej liście. Teoretycznie jest to dobre rozwiązanie. W rzeczywistości może ono rodzić liczne problemy. Po pierwsze: zablokowanie dostępu do bazy CRL uniemożliwi sprawdzenie ważności kluczy. Może to nastąpić w wyniku awarii lub ataku typu DoS. W konsekwencji nieważny klucz publiczny będzie ponownie wykorzystywany. Tworzenie rozproszonej bazy CRL jest z kolei rozwiązaniem bardzo kosztownym. Po drugie: samo istnienie takiej bazy nie spowoduje, iż ludzie posiadający unieważniony certyfikat nagle zdadzą sobie sprawę z jego nieprzydatności. Pozostanie on nadal w użytku, ponieważ mało kto zadaje sobie trud regularnego sprawdzania ważności posiadanych certyfikatów. Mówiąc krótko, niemożliwe jest dostarczenie informacji o unieważnieniu certyfikatu do wszystkich jego posiadaczy. Pojawiają się również inne problemy związane z użytkowaniem certyfikatów. Liczne zarzuty są wysuwane na przykład wobec standardu x.509 (powszechnie używanego w Polsce). Więcej informacji na ten temat znajduje się w artykule X.509 Style Guide (patrz Bibliografia). Można wskazać tu również trudności związane ze strukturą certyfikatu i jego kompatybilnością z przeglądarkami internetowymi. W Polsce swego czasu pojawiły się problemy z certyfikatami niektórych banków internetowych, które były rozpoznawane jako nieważne przez przeglądarkę Internet Explorer. Winny wszystkiemu był błąd w przeglądarce. Opracowano stosowną aktualizację i certyfikaty znów są poprawnie weryfikowane. PKI jest świetnym przykładem na to, jak ważne jest odpowiednie zastosowanie opracowanych mechanizmów kryptograficznych. Złe rozwiązanie strukturalne może narazić na szwank teoretycznie solidny system bezpieczeństwa. Jest to jednak bardziej kwestia odpowiedniej organizacji niż kryptografii, dlatego nie będę się szerzej rozpisywać na ten temat.
3.5. Kryptografia alternatywna W tym rozdziale opiszę nieco inne rozwiązania dotyczące szyfrowania danych. Niektóre z nich prezentują zupełnie nowe podejście do kwestii przechowywania i ochrony danych, wykorzystując osiągnięcia z zupełnie innych dziedzin nauki. W wielu przypadkach wyniki prowadzonych na tym polu badań są bardzo obiecujące i już w chwili obecnej znajdują zastosowanie, dlatego warto się z nimi zapoznać.
3.5.1. Fizyka kwantowa w kryptografii „Jeśli kogoś nie szokuje teoria kwantów, to znaczy, że jej nie zrozumiał”. Słowa Nielsa Bohra najlepiej podsumowują rozważania i teorie zawarte w tym rozdziale. Faktycznie, zjawiska zachodzące na poziomie kwantów i wnioski płynące z badań nad nimi często po prostu nie mieszczą się w głowie. Jeśli dodamy do tego sporą liczbę wzorów i pojęć fizycznych, okaże się, że otrzymujemy solidną dawkę naprawdę trudnej do
Rozdział 3. Kryptografia w teorii
131
przyswojenia wiedzy. Tych, którzy właśnie zaczęli się zastanawiać nad pominięciem tego rozdziału, uspokajam — wzorów nie będzie, a fizyczną terminologię postaram się ograniczyć do niezbędnego minimum. Omówię tutaj jedynie to, co jest niezbędne do zrozumienia zagadnień związanych z zastosowaniem mechaniki kwantowej w kryptografii. A więc do dzieła.
3.5.1.1. Kilka słów o kwantach Czym w ogóle jest kwant? Najogólniejsza definicja mówi, iż jest to określona wielkość, o którą może zmienić się dany parametr (na przykład prędkość czy energia). O ile w fizyce klasycznej mogą to być dowolne wartości, o tyle na poziomie mikrocząstek (na przykład elektronów) istnieją już pewne ograniczenia. Po raz pierwszy zaobserwował je niemiecki fizyk Max Planck pracujący nad teorią promieniowania ciała doskonale czarnego. Odkrył on, iż energię badanych cząstek można wyznaczyć jako całkowitą wielokrotność iloczynu częstotliwości ich drgań i określonej stałej (nazwanej później stałą Plancka). Innymi słowy, energia cząstek nie zmieniała się liniowo, ale „skokowo”, o z góry określone wartości (kwanty), między którymi nie było stanów przejściowych. Można to porównać do sytuacji, w której samochód zmienia prędkość z 40 do 80 km na godzinę bez okresu przyspieszania. Po prostu w jednej chwili ma prędkość 40 km/h, a w następnej już 80. Kłóci się to ze zdrowym rozsądkiem, jednak takie właśnie zjawiska zaobserwować można na poziomie cząstek elementarnych. Swoje odkrycie Max Planck ogłosił 14 grudnia 1900 roku na zebraniu Niemieckiego Towarzystwa Fizycznego w Berlinie. Tym samym dał początek fizyce kwantowej. Jednym z najistotniejszych pojęć w tej dziedzinie jest dualizm korpuskularno-falowy. Jest to specyficzna cecha cząstek elementarnych, polegająca na tym, iż raz zachowują się one jak materialne cząsteczki, a w innych sytuacjach jak fale. W tym drugim przypadku zachowanie cząsteczki zależy od rozkładu prawdopodobieństwa odpowiadającej jej fali. Najlepszym tego przykładem są tzw. eksperymenty szczelinowe. Wykorzystuje się w nich źródło cząstek elementarnych (na przykład elektronów lub fotonów) umieszczone naprzeciwko ich detektora. Pomiędzy nimi znajduje się przesłona z dwiema szczelinami, przez które mogą przejść cząstki. Po wystrzeleniu pojedynczej cząstki w kierunku detektora otrzymujemy różne wyniki w zależności od tego, czy sprawdzimy, przez którą szczelinę cząsteczka przeniknęła. Jeśli nie będziemy tego sprawdzać, na ekranie pojawi się tzw. obraz interferencyjny, świadczący o tym, iż cząstka zachowała się jak fala, czyli przeszła przez obie szczeliny naraz. W drugim przypadku (kiedy przeprowadzamy detekcję) przechodzi ona przez jedną ze szczelin, jednak obraz interferencyjny zanika — znowu mamy do czynienia ze zwykłą materialną cząsteczką. Wynika stąd jedna z podstawowych zasad w mechanice kwantów — zasada nieoznaczoności Heisenberga. Mówi ona, iż tylko w nielicznych przypadkach jesteśmy w stanie dokonać obserwacji i pomiarów na układzie, jednocześnie nie wpływając na ten układ (nie wytrącając go ze stanu, w którym znajdował się w chwili rozpoczęcia pomiaru). Niemożliwe jest zatem jednoczesne i dokładne określenie pary wielkości charakteryzujących cząsteczkę (na przykład jej położenia i pędu). Taki pomiar zawsze będzie się charakteryzował określoną niepewnością. Potwierdzają to wyniki eksperymentów, w których detekcję rozpoczynano już po przejściu cząstek przez szczeliny. W tym przypadku obraz interferencyjny również się nie pojawiał. Zupełnie jakby cząsteczki „wiedziały”, iż są obserwowane.
132
Podstawy kryptografii
Można zatem powiedzieć, iż do momentu przeprowadzenia obserwacji cząsteczka znajduje się we wszystkich możliwych stanach naraz. W opisywanym przykładzie przechodzi ona przez obie szczeliny, ponieważ tak rozkłada się prawdopodobieństwo w opisującej ją fali. Sytuację taką określamy jako superpozycję stanów. Innym istotnym pojęciem jest tzw. splątanie kwantowe (ang. quantum entanglement). Polega ono na wzajemnej zależności i nachodzeniu na siebie cząsteczek. Powoduje to, iż zmiana stanu jednej z nich doprowadza do zmiany całego układu równocześnie i bez opóźnień. Warto jeszcze wspomnieć, czym jest polaryzacja i spin. Podczas rozchodzenia się w przestrzeni foton (cząsteczka światła) wytwarza falę elektromagnetyczną, która oscyluje prostopadle do kierunku ruchu. Fotony mogą się poruszać w tym samym kierunku, jednak kierunek drgań będzie dla każdego z nich inny. Kierunek tej oscylacji określamy jako polaryzację fotonu. Spin natomiast jest określany jako moment pędu cząstki, który można opisać jako kierunek jej wirowania. Jest to znaczne uproszczenie, jednak do opisania zagadnień zawartych w dalszej części tego rozdziału w zupełności wystarczy.
3.5.1.2. Kryptografia kwantowa Kryptografia kwantowa umożliwia przesyłanie wiadomości całkowicie bezpiecznym kanałem. Bezpieczeństwo opiera się jednak bardziej na pewności wychwycenia podsłuchu niż na szyfrowaniu. Wykorzystane tu zjawiska fizyczne powodują, iż każda próba śledzenia transmisji doprowadzi do modyfikacji przesyłanych danych. W związku z tym łatwo można zweryfikować, czy taka próba miała miejsce. Teoretyczne podstawy kryptografii kwantowej stworzył Stephen Wiesner, fizyk z uniwersytetu Columbia. Zaproponował on wykorzystanie polaryzacji fotonów do stworzenia niepodrabialnych banknotów. W jego modelu każdy banknot miał być wyposażony w pewną liczbę (im większą, tym większe bezpieczeństwo) „pojemników” zawierających fotony o określonej polaryzacji. Bank przechowywałby listę banknotów, z których każdy miałby przypisany numer seryjny oraz zawartą w nim sekwencję polaryzacji poszczególnych fotonów. Weryfikowanie autentyczności banknotu polegałoby na sprawdzeniu tych polaryzacji i porównaniu ich z przypisanym do danego numeru seryjnego wzorem. Można tego dokonać przy użyciu specjalnego filtra polaryzacyjnego ustawionego pod odpowiednim kątem. Filtr taki przepuszcza fotony o polaryzacji równoległej do jego własnego ustawienia, pochłania natomiast te o ustawieniu prostopadłym. W pozostałych przypadkach (fotony ustawione na ukos pod różnymi kątami w stosunku do polaryzatora) możemy mówić jedynie o pochłonięciu lub przepuszczeniu z pewnym prawdopodobieństwem. W stworzonym przez Wiesnera modelu bank był w komfortowej sytuacji. Znał polaryzację poszczególnych fotonów, mógł więc odpowiednio dobrać pozycje polaryzatora. Podczas próby każdy foton powinien przejść przez polaryzator. Jeśli którykolwiek z nich zostałby pochłonięty, oznaczałoby to, iż banknot jest sfałszowany. Sytuacja fałszerza z kolei była, delikatnie mówiąc, trudna. Aby podrobić banknot, musiał on poznać polaryzację zawartych w nim fotonów, a więc użyć polaryzatora. Jeśli jednak ustawił go pod niewłaściwym kątem, foton zostawał pochłonięty i nie wiadomo było,
Rozdział 3. Kryptografia w teorii
133
czy jego polaryzacja była prostopadła, czy też ukośna w stosunku do polaryzatora. Stworzone w ten sposób banknoty byłyby praktycznie niepodrabialne. Teoria Wiesnera nie spotkała się ze szczególnym zainteresowaniem. Naukowe czasopisma wzbraniały się przed jej opublikowaniem, a inni fizycy odnosili się do niej z niechęcią. Wynikało to prawdopodobnie z jej nazbyt futurystycznego charakteru. Powstała ona pod koniec lat sześćdziesiątych, a nawet obecnie nie istnieją środki techniczne pozwalające na produkcję „kwantowych banknotów”. Wiesner bezskutecznie zatem próbował zdobyć dla niej jakiekolwiek poparcie. Jedną z osób, które zapoznały się z pracą Wiesnera, był Charles Bennet, pracownik naukowy laboratorium im. Thomasa J. Watsona. Bardzo spodobała mu się idea wykorzystania właściwości fotonów zaprezentowana w pracy i zaczął się zastanawiać nad jej praktycznym wykorzystaniem. Przedstawił teorię kwantowych pieniędzy swojemu współpracownikowi, Gillesowi Brassardowi, i wspólnie wpadli na pomysł wykorzystania opracowanej przez Wiesnera teorii w kryptografii. W pierwszej wersji opracowanego przez nich systemu dane przesyłane były jako ciąg fotonów o różnych polaryzacjach odpowiadających zerom lub jedynkom. Ich odczytanie było możliwe dzięki znajomości kolejnych ustawień polaryzatora. Podsłuchujący nie znał tej sekwencji, nie mógł więc odczytać wiadomości na takiej samej zasadzie, jak fałszerz w modelu Wiesnera nie mógł podrobić pieniędzy. Dodatkowo każda próba podsłuchu powodowała zmianę polaryzacji przynajmniej niektórych fotonów, co łatwo mogło być wykryte przez adresata wiadomości. Podczas jej odczytywania niektóre fotony o zmienionej polaryzacji zostałyby pochłonięte, tym samym zdradzając, iż ktoś manipulował przy wiadomości. System ten miał jednak poważną wadę — konieczne było uprzednie ustalenie sekwencji ustawień polaryzatora, co w praktyce sprowadzało się do odwiecznego problemu dystrybucji klucza. Ostatecznie Bennet i Brassard rozwiązali ten problem, proponując następujący algorytm: Użytkownik A przesyła użytkownikowi B ciąg fotonów o różnych polaryzacjach. Użytkownik B dokonuje pomiarów polaryzacji, wybierając ustawienie
filtra według własnego uznania. W związku z tym niektóre odczyty byłyby błędne. Następnie informuje użytkownika A, jakie ustawienie wybrał dla poszczególnych fotonów. Użytkownik A przekazuje użytkownikowi B numery poprawnie odczytanych
fotonów. Stanowią one bezpiecznie przekazany ciąg danych, które można następnie wykorzystać do dalszego szyfrowania (na przykład w charakterze klucza sesji). Rozważmy całą sytuację z punktu widzenia atakującego. Może on przechwycić wysłany ciąg fotonów i zbadać ich polaryzację. Już na tym etapie wiele ryzykuje, ponieważ każda próba pomiaru może wpłynąć na postać przesyłanych danych i doprowadzić do wykrycia podsłuchu (co w przypadku długiego ciągu fotonów jest niemal pewne). Załóżmy jednak, iż do tego nie doszło i atakujący przeprowadził pomiar. Podobnie jak użytkownik B w niektórych przypadkach ustawił filtr poprawnie, a w innych nie. Następnie za pomocą dalszego podsłuchiwania komunikacji może się dowiedzieć, jakie ustawienia filtra wybierał użytkownik B, jednak ta informacja kompletnie nic mu nie
134
Podstawy kryptografii
daje. Chwilę później dowiaduje się, które ustawienia wybrane przez użytkownika B były poprawne. Ta wiedza również nie dostarcza mu żadnych korzyści, ponieważ nie wie, czy w poprawnym ustawieniu odczytana została jedynka, czy zero. Oczywiście w niektórych przypadkach pomiary atakującego i użytkownika B pokryją się, jednak umożliwi to atakującemu uzyskanie jedynie niewielkiej części klucza. No i nie należy zapominać o bardzo dużym ryzyku wykrycia podsłuchu. Protokół zaproponowany przez Benneta i Brassarda doczekał się już pierwszych praktycznych implementacji. W roku 1999 udało się przesłać tym sposobem dane na odległość 48 kilometrów. Jednym z podstawowych problemów było jednak opracowanie urządzenia, które mogłoby emitować pojedyncze fotony. Wykorzystywane lasery bardzo często generowały całe wiązki identycznie spolaryzowanych fotonów. Teoretycznie umożliwiało to podsłuchującemu przechwycenie niektórych z nich i sprawdzenie polaryzacji bez ryzyka wykrycia. W roku 2002 udało się dokonać transmisji kluczy kryptograficznych zakodowanych za pomocą fotonów na odległość 60 km, z użyciem światłowodów. W tym samym roku w Wielkiej Brytanii przesłano spolaryzowane fotony drogą powietrzną na dystansie 23 kilometrów. W czerwcu 2003 roku grupa naukowców z centrum badawczego firmy Toshiba zlokalizowanego w Cambridge przedstawiła nowy model detektora fotonów, który znacznie redukował szum towarzyszący przesyłaniu kluczy kryptograficznych za pośrednictwem światłowodów. Dzięki niemu odległość, na którą możliwe było nawiązanie komunikacji zabezpieczanej kwantową kryptografią, wydłużyła się do 100 kilometrów. Rok później w Austrii przeprowadzono pierwszą elektroniczną transakcję pieniężną chronioną z użyciem omawianej technologii. Pierwsza sieć komputerowa wykorzystująca kwantową kryptografię do ochrony transmitowanych danych powstała wkrótce potem w Cambridge. W maju 2005 roku naukowcy ze wspomnianego wcześniej laboratorium badawczego firmy Toshiba przedstawili swój kolejny wynalazek: diodę elektroluminescencyjną pozwalającą na emitowanie pojedynczych fotonów. W roku 2006 dokonano kolejnej zabezpieczonej kwantowo transmisji — tym razem na odległość 144 kilometrów. Wkrótce powstały pierwsze komercyjne systemy wykorzystujące tę technologię, a niedługo potem dokonano pierwszego skutecznego ataku na taki system. W 2010 roku Feihu Xu, Bing Qi i Hoi-Kwong Lo z uniwersytetu w Toronto złamali bezpieczeństwo systemu ID 500 szwajcarskiej firmy ID Quantine. Po raz kolejny drogę do skutecznego ataku stworzyły różnice między teorią a praktyką stosowania kryptosystemu. W praktyce bowiem niezmiernie trudno jest uniknąć błędów w transmisji wynikających z interferencji między transmitowanymi kwantami a zewnętrznym światem. W rezultacie część cząsteczek dociera do adresata w zmienionym stanie, generując błędy odczytu. Osoba odbierająca transmisję nie może w żaden sposób stwierdzić, czy błędy te wynikają z próby podsłuchu, czy wspomnianej interferencji. We wspomnianym systemie przyjęto zatem, że bezpieczny odsetek błędnych odczytów to 20%. Tę właśnie „praktyczną” zasadę wykorzystał zespół z Toronto — naukowcy podsłuchali bity klucza, mieszcząc się jednocześnie wewnątrz progu 19,7%. Na obronę szwajcarskiej firmy, która wyprodukowała wspomniany system, należy dodać, że był to system dość stary (z 2004 roku). Warto też wspomnieć, że w jej nowych systemach próg bezpieczeństwa wynosi już 8%.
Rozdział 3. Kryptografia w teorii
135
3.5.1.3. Komputer kwantowy Pomysł skonstruowania komputera opartego na fizyce kwantowej narodził się około roku 1980. Początkowo był to jedynie model teoretyczny, jednak wszystko zmieniło się po opracowaniu przez Shora algorytmu pozwalającego na błyskawiczne rozkładanie dużych liczb na czynniki pierwsze z wykorzystaniem takiego komputera. Nie będę się tu zagłębiać w szczegóły tego algorytmu — dość powiedzieć, że jego zastosowanie umożliwiłoby złamanie szyfru RSA i podważenie bezpieczeństwa wszelkich szyfrów asymetrycznych. Nic więc dziwnego, iż badania nad skonstruowaniem komputera kwantowego gwałtownie ruszyły do przodu. Kilka lat temu osiągnięto pierwszy przełom, jednak o tym za chwilę. Na początek należy skupić się na teoretycznych podstawach działania komputera kwantowego. Najistotniejszym pojęciem związanym z komputerem kwantowym jest kubit (ang. qubit). Jest to kwantowy odpowiednik bitów w komputerach konwencjonalnych. Do reprezentacji kubitów wykorzystać można cząsteczki elementarne o dwóch różnych spinach. Jeden spin odpowiadałby logicznemu zeru, a drugi — jedynce. Szereg takich cząstek pozwalałby na zapisywanie ciągów zer i jedynek, a więc na programowanie komputera kwantowego. Spin cząstek można zmieniać za pomocą silnych impulsów energetycznych, tym samym modyfikując zawarte w komputerze informacje. Prawdziwa moc drzemie jednak w wykorzystaniu efektu superpozycji. Superpozycję możemy uzyskać, dostarczając mniejszy impuls energii do cząstek. W tym przypadku ich spin może się zmienić lub nie. Innymi słowy, istnieje jedynie określone prawdopodobieństwo, iż nastąpi zmiana spinu. W takiej sytuacji w myśl zasad fizyki kwantów cząsteczka znajduje się w obu stanach naraz, przyjmując jednocześnie wartości zero i jeden (tak naprawdę kubit może przyjmować nieskończoną liczbę stanów w zależności od rozkładu prawdopodobieństwa, tu jednak przyjmujemy uproszczony model). Dopiero dokonanie obserwacji ustala jej stan. Jak to wykorzystać? Załóżmy, że mamy komputer kwantowy składający się z dwustu kubitów. Na początku mają one przypisane określone spiny, a więc zawartość pamięci komputera jest ustalona. Stosujemy teraz niewielki impuls, który z pewnym prawdopodobieństwem może zmienić ich spiny. Osiągamy w ten sposób superpozycję dwustu cząstek, a więc 2200 możliwych stanów jednocześnie. Wykorzystanie tego zjawiska opierałoby się na opracowaniu odpowiednich operacji logicznych odpowiadających operacjom OR, AND oraz NOT stosowanym w zwykłych komputerach. Polegałyby one na manipulowaniu prawdopodobieństwem w taki sposób, aby na koniec uzyskać rozwiązanie problemu o prawdopodobieństwie równym jeden. Dopiero wtedy dokonać można odczytu systemu kubitów, jednocześnie niszcząc ich splecenie kwantowe. Moc obliczeniowa uzyskana tym sposobem jest niewiarygodna. Pozwala bowiem sprawdzić 2200 (lub więcej, w zależności od liczby zastosowanych kubitów) możliwości jednocześnie! Jest to poziom absolutnie nieosiągalny dla współczesnych komputerów. Komputery kwantowe można by wykorzystać do błyskawicznego łamania szyfrów asymetrycznych lub (po opracowaniu odpowiednich algorytmów) symetrycznych, a także wszelkich zadań wymagających mocy obliczeniowej, która dotąd była dla nas niedostępna. Na przykład dzięki opracowanemu w roku 1996 przez Lova Grovera algorytmowi możliwe jest przeszukiwanie baz danych z prędkością 500 tysięcy razy większą niż w przypadku konwencjonalnego komputera.
136
Podstawy kryptografii
Przeszkody na drodze do skonstruowania komputera kwantowego są niezliczone. Udało się jednak pokonać niektóre z nich. Przykładem może być opracowany w roku 1995 algorytm pozwalający na korekcję błędów w systemach opartych na kubitach. W roku 2000 udało się nawet skonstruować pierwszy, prymitywny komputer kwantowy. Posiadał on pięć kubitów i był pobudzany impulsami elektromagnetycznymi służącymi jednocześnie do odczytu danych wyjściowych. Potrafił również przetworzyć krótki algorytm. Rok później udało się już skonstruować komputer zawierający siedem kubitów, który dodatkowo przetworzył algorytm Shora (oczywiście dla małych liczb). W 2012 roku udało się przeprowadzić wykorzystującą kwantowe splątanie faktoryzację liczby 21. W maju 2011 roku kanadyjska firma D-Wave Systems Inc. ogłosiła, że udało jej się wyprodukować pierwszy kwantowy komputer, operujący na 128 kubitach. Oczywiście przyciągnęło to uwagę całego kryptologicznego (i nie tylko) świata i pojawiły się pytania, czy RSA nadal jest bezpieczne. Jak się wkrótce okazało, D-Wave One nie stanowił żadnego zagrożenia dla kryptografii asymetrycznej — operował co prawda na kubitach, ale z wykorzystaniem zjawiska znanego jako kwantowe wyżarzanie (ang. quantum annealing), co zawęża zakres jego zastosowań do zadań związanych z optymalizacją i projektowaniem sztucznej inteligencji. Pomimo licznych przejawów sceptycyzmu wobec osiągnięcia D-Wave Systems jej komputer został zakupiony przez amerykański koncern zbrojeniowy Lockheed Martin za 10 milionów dolarów. Pozwoliło to firmie kontynuować badania i już rok później światło dzienne ujrzał wykorzystujący 512 kubitów D-Wave Two. Przeprowadzone w maju 2013 roku testy porównawcze dowiodły, że w zadaniach optymalizacyjnych maszyna ta jest około 3600 razy szybsza od tradycyjnego komputera. Tym razem za kwotę 15 milionów dolarów komputer zakupiły NASA i Google. D-Wave Two stał się częścią wyposażenia NASA Ames Research Center, gdzie prowadzone są badania nad sztuczną inteligencją. Mimo to jego twórcy wciąż są krytykowani przez niektórych przedstawicieli świata naukowego, którzy zarzucają im, iż osiągnięcia maszyn D-Wave wynikają przede wszystkim z ich daleko posuniętej specjalizacji, a dedykowane „klasyczne” komputery mogłyby osiągnąć podobne rezultaty w rozwiązywaniu zadań optymalizacyjnych. Na razie D-Wave Systems nie rozwiązało też kluczowego problemu obserwacji cząstek znajdujących się w stanie splątania kwantowego bez jednoczesnego ustalania ich stanu. Udało mu się jednak osiągnąć efekt splątania kwantowego między pojedynczymi kubitami dzięki występującemu podczas wyżarzania efektowi tunelowania kwantowego. Nie da się więc zaprzeczyć, że kontrowersyjna firma z Kanady stworzyła solidne podstawy pod dalsze badania nad kwantową komputeryzacją, rozwiązując pierwsze praktyczne problemy z wykorzystaniem kubitów i popularyzując samą ideę kwantowego komputera.
Kryptografia postkwantowa Opinie ekspertów na temat komputerów kwantowych są podzielone. Jedni widzą w nich cudowne urządzenia, które pozwolą na dokonanie ogromnego postępu naukowego, inni zaś — zagrożenie dla światowego bezpieczeństwa (wystarczy zastanowić się nad możliwościami, jakie otworzy takie urządzenie przed rządem kraju, który wyprodukuje je jako pierwszy). Różne są również opinie co do samej możliwości jego skonstruowania. Część naukowców twierdzi, że teraz jest to jedynie kwestia czasu, inni zaś wciąż utrzymują, iż komputer taki nigdy nie powstanie lub że nie będzie miał takich możliwości, jak wynikałoby to z teoretycznych założeń.
Rozdział 3. Kryptografia w teorii
137
Mimo licznych sceptycznych głosów w 2006 roku zapoczątkowano cykl konferencji dotyczących kryptografii postkwantowej (ang. Post-quantum Cryptography), gdzie omawiane są kryptograficzne algorytmy i zabezpieczenia odporne na kryptoanalizę z wykorzystaniem komputera kwantowego. Wbrew pozorom twórcy tych rozwiązań nie są na straconej pozycji wobec ogromnej mocy obliczeniowej kryptoanalityków uzbrojonych w kwantową maszynę, okazuje się bowiem, że chociaż algorytm Shore’a jest śmiertelnym zagrożeniem dla kryptografii asymetrycznej opartej na problemie faktoryzacji dużych liczb, to przy łamaniu szyfrów symetrycznych nie na wiele się przyda. Na tym polu bardziej przydatny byłby algorytm Govera, ale on również może jedynie przyspieszyć kryptoanalizę, czemu z kolei przeciwdziałać można, zwiększając długość klucza. Co za tym idzie, na chwilę obecną badania nad postkwantową kryptografią skupiają się wokół nowych rozwiązań z zakresu kryptografii asymetrycznej. Do tej pory opracowano już następujące rozwiązania: Kryptografia oparta na kratach (ang. lattice based cryptography) — teoria
opisująca wykorzystanie algebraicznych struktur nazywanych kratami do implementacji kryptografii z kluczem publicznym i prywatnym. Przykładem jej wykorzystania jest kryptosystem NTRU, występujący w dwóch wersjach — NTRUSign i NTRUEncrypt. NTRU jest szybszy niż RSA i odporny na kryptoanalizę z wykorzystaniem współcześnie znanych algorytmów kwantowych. System podpisu elektronicznego oparty na skrótach — tu jako alternatywę dla
protokołów wykorzystujących liczby pierwsze proponowane jest między innymi drzewko Merkle’a i schemat podpisu jednorazowego Leslie Lamporta. Kryptografia oparta na kodach — mowa tu przede wszystkim o kryptosystemie
Roberta McElieca, wykorzystującym kody Goppy. Algorytm ten został opracowany w roku 1978 i nie przyjął się ze względu na zbyt dużą długość klucza. Teraz dzięki swojej odporności na potencjalne ataki z wykorzystaniem komputera kwantowego ponownie jest brany pod uwagę przy projektowaniu przyszłych kryptosystemów. Kryptografia wielu zmiennych wykorzystująca równania drugiego stopnia (ang.
Multivariate-quadratic-equations cryptography). Jak widać, w mechanice kwantów drzemie ogromny potencjał, nie tylko z punktu widzenia kryptografii. Można powiedzieć, iż jest to dziedzina równie obiecująca, co skomplikowana. Dla tych, którzy mieli problemy z „przetrawieniem” zagadnień zawartych w tym rozdziale, przytoczę na pocieszenie cytat autorstwa kolejnego wybitnego fizyka, Richarda Feynmanna: „Tak naprawdę nikt nie rozumie teorii kwantów”.
3.5.2. Kryptografia DNA Chyba każdy z nas zetknął się kiedyś z pojęciem DNA. Odkrycie zasad budowy tych cząsteczek przyniosło nagrodę Nobla Francisowi Crickowi, Jamesowi Watsonowi oraz Maurice’owi Wilkinsowi. Od tego czasu prowadzone są intensywne badania nad strukturą DNA (zwłaszcza DNA człowieka), dzięki czemu nasza wiedza na temat zasad działania żywych organizmów znacznie się pogłębiła. Okazuje się również, iż cząsteczki
138
Podstawy kryptografii
te można wykorzystać do przekazywania zaszyfrowanych informacji. Zanim bardziej zagłębię się w omawianie tego zagadnienia, muszę omówić podstawowe pojęcia dotyczące budowy DNA.
3.5.2.1. Struktura DNA Skrót DNA oznacza kwas dezoksyrybonukleinowy, który wraz z RNA (kwasem rybonukleinowym) stanowi podstawę kodowania informacji genetycznej organizmów żywych. Cząsteczka DNA składa się z dwóch spiralnie skręconych nici tworzących tzw. podwójną helisę (patrz rysunek 3.6). Rysunek 3.6. Podwójna helisa DNA
Każda nić składa się z nukleotydów stanowiących podstawowe cząsteczki DNA. Nukleotydy mają podobną budowę, różnią się jedynie tzw. pierścieniami. Są to cząsteczki chemiczne składające się z węgla i azotu, nazywane również zasadami. W DNA występują cztery takie zasady: adenina, guanina, cytozyna oraz tymina. Nukleotydy zawierające te zasady są oznaczane odpowiednio jako A, G, C oraz T. Wyodrębnione ciągi nukleotydów tworzą geny będące (w dużym uproszczeniu) nośnikiem dziedziczności cech. Połączenie genów rodziców determinuje cechy ich potomstwa. Wiązania widoczne między nićmi helisy wykształcają się jedynie pomiędzy nukleotydami A i T (podwójne wiązania) oraz G i C (potrójne wiązania). Na tej regule opiera się replikacja DNA w komórkach organizmów. Jeśli mamy jedną z nici DNA, możemy, korzystając ze wspomnianej zasady, dobudować drugą. W przykładowym zapisie wygląda to następująco (patrz rysunek 3.7): Rysunek 3.7. Przykładowy zapis łańcucha DNA
Oznaczenia 5’ oraz 3’ symbolizują grupy 5’-OH oraz 3’-OH, które znajdują się na przeciwległych końcach każdej z nici. Same nici są przeciwnie spolaryzowane, co reprezentują zamieszczone na rysunku strzałki.
Rozdział 3. Kryptografia w teorii
139
3.5.2.2. Informatyka molekularna Informatyka molekularna liczy sobie blisko 20 lat. Jej początki sięgają roku 1994, kiedy to Leonard Adelman (jeden z twórców algorytmu RSA) zaproponował wykorzystanie molekuł do rozwiązywania problemów matematycznych. Koncepcja Adelmana poparta obrazowym przykładem (wykorzystał on cząsteczki DNA do rozwiązania matematycznego problemu znanego jako ścieżka Hamiltona) zwróciła powszechną uwagę i nie trzeba było długo czekać na jego naśladowców. Pojawiły się kolejne doświadczenia obrazujące potencjał obliczeniowy drzemiący w molekułach. W lipcu 2001 skonstruowano pierwsze komputery wykorzystujące DNA (modele teoretyczne takich komputerów pojawiły się znacznie wcześniej, jednak nie było wówczas odpowiednich środków technicznych potrzebnych do ich konstrukcji). Rozwiązanie to było przełomowe, ponieważ wspomniane maszyny nie tylko wykorzystywały DNA w roli oprogramowania i sygnałów I/O, ale również w roli źródła zasilania. Dzięki temu komputery takie są wysoce energooszczędne, mają relatywnie dużą moc obliczeniową, a dodatkowo cechują je nieduże rozmiary. Jakby tego wszystkiego było mało, komputery DNA posiadają ogromną pojemność pamięci. Zaledwie 1 mm3 roztworu jest w stanie pomieścić 10 PB (petabajtów) informacji. W kwietniu 2004 roku skonstruowanie komputera DNA ogłosiła grupa naukowców z Instytutu Weizmanna. Nie jest on uniwersalny (potrafi wykonywać jedynie pewne rodzaje zadań), ale można go programować. W styczniu 2013 grupie naukowców z Europejskiego Instytutu Bioinformatyki pod kierownictwem Nicka Goldmana udało się zapisać obraz w formacie JPEG, zbiór sonetów Szekspira i słynną przemowę Martina Luthera Kinga „I have a dream” na nośniku danych DNA. W marcu tego samego roku kierowany przez Jeroma Bonneta zespół naukowców z uniwersytetu Stanforda stworzył pierwszy transkryptor, czyli biologiczny tranzystor, wykorzystujący grupę protein nazywanych inhibitorami (ang. Integrase) do sterowania przepływem polimeraz RNA wzdłuż nici DNA. W rezultacie możliwe stało się wykonywanie wewnątrz żywych komórek operacji logicznych, którymi w tradycyjnych komputerach zajmują się tranzystory. Wykorzystany mechanizm nazwany został logiką boolowską z wykorzystaniem inhibitorów (Boolean Integrase Logic), a biologiczne bramki logiczne — bramkami BIL (BIL gates). Mimo tak obiecujących wyników nie należy spodziewać się w najbliższym czasie jakiejś wielkiej komputerowej rewolucji. Jest mała szansa na to, aby tradycyjne komputery zostały wyparte przez komputery DNA. Tym niemniej badania nad tymi urządzeniami są stale prowadzone, także w Polsce. Z pewnością dostarczy to w przyszłości wielu nowych możliwości wspomagania obliczeń prowadzonych przy użyciu „tradycyjnych” metod. Ostatnim zagadnieniem, które przedstawię przed przejściem do zagadnień związanych z molekularną ochroną informacji, jest zapis danych przy użyciu nici nukleotydów. Ich odczyt jest możliwy dzięki wynalezionej w roku 1977 metodzie sekwencjonowania. Umożliwia ona wyodrębnienie fragmentów cząsteczki DNA i odczytanie układu (sekwencji) tworzących ją nukleotydów. Układ taki może zatem służyć do zapisywania i odczytywania informacji. Wiemy już, że w komputerach wszelkie dane zapisywane są w postaci ciągów zer i jedynek. Jedną z możliwości jest zatem potraktowanie nukleotydów G i C jako zer, a A i T jako jedynek. Można też oczywiście zastosować odwrotne przypisanie.
140
Podstawy kryptografii
Inny sposób to stworzenie specjalnego alfabetu szyfrowego wykorzystującego kombinacje nukleotydów do zapisu liter, cyfr i znaków specjalnych. Liczba możliwych do zapisania w ten sposób znaków zależy od liczby nukleotydów wykorzystywanych w pojedynczej kombinacji. W przypadku kombinacji podwójnych (AT, AC, AG, CT itd.) możliwe jest zapisanie szesnastu znaków, zanim wyczerpiemy wszystkie możliwości. Nie jest to zbyt praktyczne. O wiele lepiej wygląda sytuacja w przypadku kombinacji potrójnych. Tu mamy już możliwość zapisania 64 różnych znaków. Najlepszym jednak rozwiązaniem jest użycie czwórek nukleotydów. Uzyskujemy 256 możliwych konfiguracji, co pozwala zapisać wszelkie litery, cyfry i znaki specjalne. Oczywiście ustalony alfabet musi być znany obu stronom, zanim rozpoczęta zostanie wymiana zaszyfrowanych informacji.
3.5.2.3. Informacja ukryta w DNA Oprócz szyfrowania danych, o czym za chwilę, DNA można również wykorzystać do implementacji metod steganograficznych. W obu przypadkach używana jest tzw. reakcja łańcuchowa polimerazy, nazywana w skrócie PCR (skrót od ang. polymerases chain reaction). Została ona opracowana w roku 1993 przez K.B. Mullisa i M. Smitha. Odkrycie to zapewniło im nagrodę Nobla w dziedzinie chemii. PCR umożliwia powielanie określonego łańcucha nukleotydów. Składają się na nią trzy etapy: rozdzielenie nici DNA (tzw. denaturacja); dołączenie krótkiego łańcucha DNA (nazywanego primerem lub starterem)
do zakończeń 5’ każdej z wydzielonych nici; dobudowanie drugiego łańcucha do każdej z nici. Na tym etapie
wykorzystywany jest specjalny enzym, tzw. polimeraza DNA. Przy wykorzystaniu określonego primera możliwe jest powielanie zawierających go cząsteczek DNA. Każda taka reakcja PCR podwaja ich liczbę w roztworze. Umożliwia to zastosowanie primera w charakterze klucza szyfrowania lub czynnika pozwalającego odszukać tajną wiadomość pośród innych łańcuchów DNA. Na początek zajmę się tą drugą możliwością. Zaczynamy od ustalenia alfabetu, którym będziemy się posługiwać przy zapisie danych. Podczas jego konstruowania wykorzystać można zwiększające bezpieczeństwo zasady znane z poprzednich rozdziałów, na przykład takie, jak stosowanie homofonów. Następnie przy użyciu tego alfabetu zapisujemy naszą wiadomość oraz klucz, który posłuży do jej ukrycia. W ten sposób powstają dwa odrębne ciągi nukleotydów. Tu mała dygresja — klucz powinien być odpowiednio długi, aby uniemożliwić jego złamanie metodą pełnego przeglądu. Minimalna zalecana długość to 10 znaków, a więc 40 nukleotydów (dla alfabetu opartego na poczwórnych kombinacjach nukleotydów). Długość klucza jest ważna także podczas przeprowadzania reakcji PCR w trakcie deszyfrowania, ale o tym za chwilę. Teraz ukrywamy wiadomość w następujący sposób: Tworzymy dwa łańcuchy nukleotydów — wiadomość oraz klucz. Do łańcucha wiadomości dołączamy z obu stron ciąg nukleotydów stanowiący hasło.
Rozdział 3. Kryptografia w teorii
141
Utworzony ciąg hasło – wiadomość – hasło poddajemy reakcji polimerazy
z wykorzystaniem klucza w charakterze primera. W ten sposób otrzymujemy cząsteczkę DNA składającą się z dwóch nici. Na koniec ukrywamy naszą wiadomość pośród dużej liczby innych cząstek
DNA, tzw. dummies (czyli atrap). Odbiorca wiadomości wykorzystuje klucz w charakterze primera do przeprowadzenia reakcji PCR. Powtarzana jest ona wielokrotnie i za każdym razem podwaja się liczba cząsteczek zawierających tajny przekaz. Po wyselekcjonowaniu odpowiedniej cząsteczki tworzący ją ciąg nukleotydów jest odczytywany za pomocą operacji sekwencjonowania. Teraz pozostaje już tylko odczytać tekst jawny, korzystając z wcześniej ustalonego alfabetu szyfrowego.
3.5.2.4. Szyfrowanie i deszyfrowanie z wykorzystaniem nukleotydów I wreszcie docieramy do szyfrowania z użyciem cząsteczek DNA. Badania prowadzone w tej dziedzinie umożliwiły jak dotąd przeprowadzanie tylko podstawowych operacji szyfrowania, takich jak metoda podstawieniowa czy XOR-owanie, choć istnieją już teoretyczne podstawy dotyczące implementacji bardziej zaawansowanych algorytmów i mechanizmów szyfrowania asymetrycznego. W kryptografii molekularnej wykorzystuje się ciąg nukleotydów o określonej długości, traktowany jako klucz szyfrowania. Jest on podzielony na dwuczęściowe segmenty. Każdy z nich ograniczony jest tzw. stoperem. Jest to ciąg nukleotydów ograniczający działanie PCR. Tak skonstruowana nić DNA wykorzystywana jest jako tablica podstawieniowa w trakcie operacji szyfrowania. Zawiera ona wszelkie możliwe ciągi wejściowe. Szyfrowanie opiera się na przeprowadzeniu PCR z wykorzystaniem odpowiedniego ciągu komplementarnego do tekstu jawnego w charakterze primera. Deszyfrowanie odbywa się analogicznie — z tym że tutaj używamy ciągu komplementarnego do kryptogramu. Prowadzone są również badania nad przeprowadzeniem operacji szyfrowania asymetrycznego z wykorzystaniem DNA. Na razie są to czysto teoretyczne rozważania, niemniej jednak niewykluczone, iż w przyszłości doczekamy się nukleotydowych par kluczy publiczny i prywatny. W DNA drzemie ogromny potencjał zastosowań w dziedzinie ochrony informacji. Pomijając opisane powyżej metody kryptograficzne i steganograficzne, wymienić można tu również techniki biometryczne. Pozwalają one na identyfikację osoby na podstawie pobranej od niej próbki DNA. Komputery molekularne można również wykorzystać w kryptoanalizie, a samo DNA — w charakterze unikatowego znacznika pozwalającego na identyfikację przedmiotów. Ta ostatnia właściwość pozwoli być może w przyszłości zastąpić hologramy znacznikami biochemicznymi, o wiele trudniejszymi do podrobienia. Wszystko to razem powoduje, iż informatyka molekularna może się w przyszłości stać nieodłączną częścią systemów ochrony danych. Jednak w chwili obecnej znane są tylko nieliczne zastosowania praktyczne rozwiązań opisanych w tym rozdziale.
142
Podstawy kryptografii
3.5.3. Kryptografia wizualna Koncepcja kryptografii wizualnej narodziła się około 10 lat temu na konferencji Eurocrypt 94. Podczas swojej prelekcji Shamir i Naor zaproponowali nowy sposób graficznego kodowania informacji. Jego podstawą było wykorzystanie określonej liczby podobrazów zwanych udziałami. Ich nałożenie na siebie dawało obraz zawierający tajną wiadomość. W efekcie odszyfrowanie informacji byłoby możliwe jedynie przy użyciu wzroku — stąd nazwa metody. Ale po kolei.
3.5.3.1. Udziały Każdy obraz cyfrowy składa się z tzw. pikseli (ang. pixels). Są to malutkie kwadraty wypełnione jednolitym kolorem. Położone obok siebie w rzędach i kolumnach tworzą obraz, który widzimy na ekranie komputera. Koncepcja udziałów (ang. shares) zakłada podział pikseli na jeszcze mniejsze części, tzw. subpiksele. Piksele oryginalnego obrazu zawierającego tajną wiadomość są dzielone na subpiksele. Ich liczba zależy od liczby udziałów, które chcemy uzyskać. Na rysunku 3.8 znajduje się najprostszy możliwy schemat podziału oparty na obrazie czarno-białym. Jak widać, każdy udział składa się z dwóch subpikseli. W wyniku nałożenia na siebie udziałów piksela białego otrzymamy obraz składający się z białego i czarnego subpiksela, co da w efekcie wrażenie koloru szarego. Udziały piksela czarnego po nałożeniu dają obraz pierwotny. Obrazy składające się z udziałów nie dają żadnych informacji o zaszyfrowanej wiadomości, ponieważ każda kombinacja subpikseli pojawia się z prawdopodobieństwem 50%, co jest równoważne z rozkładem losowym. Kiedy oba obrazy zostaną na siebie nałożone, ukaże się obraz pierwotny (z tą różnicą, iż jego białe obszary będą teraz widoczne jako szare). Można oczywiście dzielić piksele na więcej części, tworząc tym samym więcej udziałów.
3.5.3.2. Schemat progowy Opisaną powyżej technikę wykorzystuje się do tworzenia tzw. schematów progowych. Jest to sposób dzielenia sekretów polegający na rozbiciu tajnej wiadomości na n udziałów. Odczytanie wiadomości jest możliwe przy użyciu określonej części z nich. Prosty schemat progowy dla dwóch udziałów przedstawiony został na rysunku 3.8. Schemat taki opisywany jest za pomocą macierzy. Każdy wiersz reprezentuje jeden udział składający się z m subpikseli. Poniżej znajdują się macierze reprezentujące schemat progowy z dwoma udziałami składającymi się z dwóch subpikseli: 0 1 1 0 M 0 0 1 1 0 1 0 0 1 M 1 0 1 1 0
Rozdział 3. Kryptografia w teorii
143
Rysunek 3.8. Podział pikseli na udziały
W zapisie tym 1 oznacza kolor czarny, natomiast 0 — biały. Dla zaszyfrowania białego piksela tajnej wiadomości wybieramy dowolną macierz zbioru M0, natomiast dla piksela czarnego — dowolną macierz ze zbioru M1. Rozdzielamy udziały (wiersze) między użytkowników, po czym usuwamy pierwotny obraz. Teraz jego odtworzenie będzie możliwe tylko za zgodą obydwu osób. Kodowanie obrazu przy użyciu dwóch subpikseli powoduje znaczne zniekształcenie tego obrazu, dlatego też zazwyczaj stosuje się schematy progowe opierające się na czterech subpikselach. W takim przypadku zbiór macierzy przedstawić można w następujący sposób. 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 M 0 , , , , , 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0
0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 M 1 , , , , , 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1
Za pomocą tak zbudowanych macierzy implementować można dowolne schematy progowe typu (n, r), gdzie n oznacza liczbę udziałów ogółem, natomiast r — liczbę udziałów potrzebnych do odszyfrowania wiadomości. Możliwe jest również tworzenie wszelkich innych wariantów, które wymieniłem w podrozdziale o protokołach dzielenia sekretów. Innym rozwiązaniem jest szyfrowanie obrazów w skali szarości. Piksele takiego obrazu mogłyby przyjmować wartości od 0 do 256 (0 oznacza kolor biały, a 256 — czarny). Tworzenie macierzy udziałów należałoby rozpocząć od podziału każdego piksela na 256 subpikseli. Ich wzajemne proporcje zależałyby od poziomu szarości danego piksela. Jeśli przyjmiemy, iż poziom ten wynosi p, to w macierzy udziałów powinno się znaleźć p białych pikseli i 256–p czarnych. Podstawowym problemem jest tutaj rozmiar tworzonych macierzy udziałów. Dla pojedynczego piksela wymagana jest macierz 16×16, co powoduje znaczny wzrost rozmiaru szyfrowanych obrazów.
144
Podstawy kryptografii
Aby temu zaradzić, powstało nowe rozwiązanie oparte na kodowaniu za pomocą półkoli. Rysunek 3.9 demonstruje wykorzystanie tej metody w celu zaszyfrowania piksela koloru szarego. Rysunek 3.9. Kodowanie obrazów w formie półkoli
Mimo iż kryptografia wizualna jest relatywnie młodą gałęzią kryptografii, ma duże szanse na szybkie znalezienie praktycznych zastosowań. Jest idealnym narzędziem do implementacji protokołów podziału sekretów, a sposób tworzenia udziałów na podstawie dzielenia pikseli gwarantuje ich w pełni losowy charakter. Jeśli dodamy do tego łatwość w implementacji (pojawiły się już pierwsze wykorzystujące kryptografię wizualną narzędzia szyfrujące), to całość wygląda bardzo obiecująco.
3.6. Współczesna steganografia Myli się ten, kto sądzi, że wraz z rozwojem kryptografii techniki steganograficzne przestały być komukolwiek potrzebne. Są one stosowane po dziś dzień w wielu dziedzinach związanych z bezpieczeństwem informacji.
3.6.1. Znaki wodne Jednym z podstawowych zastosowań steganografii jest opracowywanie cyfrowych znaków wodnych. Służą one do oznaczania i ochrony praw autorskich dotyczących plików graficznych audio i wideo. W teorii wyróżnia się następujące właściwości cyfrowego znaku wodnego: Jednoznaczność — informacje zapisane w znaku wodnym powinny pozwalać na
jednoznaczną identyfikację autora danego pliku oraz instytucji odpowiedzialnej za wprowadzenie znaku. Niewidoczność — znak nie może być zauważalny dla osób nielegalnie
wykorzystujących plik, jak również jego uprawnionych odbiorców. Odporność — oznacza, iż znak jest trudny do usunięcia w wyniku rozmaitych
operacji wykonywanych na pliku. Uniwersalność — metoda osadzania znaku wodnego w pliku powinna był łatwa
w implementacji.
3.6.1.1. Algorytm LSB Jedną z najprostszych metod tworzenia znaku wodnego jest algorytm LSB (skrót od ang. Least Significant Bit — algorytm najmniej znaczącego bitu). Umożliwia on znakowanie plików graficznych i, jak łatwo zgadnąć, opiera się na modyfikowaniu najmniej
Rozdział 3. Kryptografia w teorii
145
znaczących bitów w poszczególnych pikselach. Potencjał tej metody zależy od liczby bitów przeznaczonych do opisu pojedynczych pikseli — im jest ich więcej, tym więcej danych można ukryć w obrazie bez wprowadzania w nim widocznych zmian. Na przykład w obrazie 8-bitowym do ukrycia jednego znaku musielibyśmy użyć 8 pikseli (korzystamy z jednego bitu w każdym z nich, uzyskując jeden bajt), podczas gdy w obrazie 24-bitowym wystarczą już tylko 3 piksele. Oczywiście można skorzystać z większej liczby bitów w każdym pikselu, zwiększa to jednak prawdopodobieństwo wprowadzenia widocznych zmian w obrazie. Poza tym w niektórych odmianach metody najmniej znaczącego bitu stosuje się dodatkową kompresję, kody korekcyjne lub kryptografię (zabezpiecza ona treść tajnej informacji na wypadek odkrycia jej przez osoby niepowołane). Opisana metoda nie gwarantuje zbyt dużego bezpieczeństwa — zapisane w obrazie tajne dane można łatwo uszkodzić, dokonując zmiany formatu pliku, poddając go kompresji lub zmniejszając głębię koloru. Z tego względu odradza się wykorzystywanie jej w zastosowaniach profesjonalnych.
3.6.1.2. Algorytm Patchwork Algorytm Patchwork opiera się na generatorze liczb losowych inicjalizowanym za pomocą tajnego klucza. Jego pojedynczy cykl opisać można w następujący sposób: Za pomocą generatora losowego opartego na kluczu wybieramy dwa obszary
obrazu (A i B). Zwiększamy jasność punktów obszaru A o określoną wartość. W obszarze B jasność punktów zmniejszamy o tę samą wartość.
Algorytm ten zmienia postać statystyczną obrazu w oparciu o wybrany klucz generatora liczb pseudolosowych. Wspomniana w punktach 2. i 3. wartość zależna jest od liczby bitów przeznaczonych do opisu pojedynczego piksela. Podobnie jak w przypadku algorytmu LSB może ona być większa dla obrazów o większej głębi kolorów. Z racji swego pseudolosowego charakteru algorytm Patchwork jest odporny na ataki geometryczne polegające na przekształcaniu obrazu na płaszczyźnie (na przykład przez dokonywanie rotacji). Możliwe jest również ukrywanie danych po znaczniku EOF (ang. End of File — znacznik końca pliku). Aplikacje przetwarzające plik zakończą wykonywane na nim operacje po dotarciu do tego znacznika. Metoda wydaje się sprytna, ale jest dość łatwa do wykrycia za pomocą oprogramowania stegoanalitycznego i zwiększa rozmiar przetwarzanego pliku. Istnieją również inne metody znakowania, np. związane z częstotliwością występowania pikseli o określonych wartościach, ale ich omówienie wykracza poza ramy tej książki.
3.6.2. Oprogramowanie steganograficzne W internecie znaleźć można bardzo wiele programów umożliwiających ukrywanie danych. Niektóre z nich do zabezpieczania informacji wykorzystują wyłącznie techniki steganograficzne, inne natomiast traktują steganografię jako dodatek do zabezpieczeń kryptograficznych. Przykładem aplikacji drugiego typu jest opisany w kolejnym rozdziale
146
Podstawy kryptografii
program TrueCrypt, który oprócz szyfrowania wirtualnych dysków pozwala ukrywać je jeden wewnątrz drugiego. Inne popularne programy związane ze steganografią to: Steganos Security Suite — pakiet pozwalający na ochronę danych
z wykorzystaniem szyfrowania, jak również ukrywanie ich wewnątrz plików graficznych i muzycznych. Umożliwia również tworzenie szyfrowanych partycji chronionych za pomocą hasła, usuwanie szkodliwych programów szpiegujących i typu adware oraz bezpieczne kasowanie plików. Niestety, dostępna jest jedynie płatna wersja pakietu. StegoVideo — program służący do ukrywania informacji w plikach wideo.
Dostępny w postaci darmowego oprogramowania. StegoMagic — program pozwalający umieszczać tajne dane w dokumentach
tekstowych oraz plikach w formacie WAV i BMP. Rozprowadzany jako darmowe oprogramowanie. QuickStego — darmowy program pozwalający ukrywać wiadomości w plikach
graficznych. Xiao Steganography — program pozwalający ukrywać wiadomości w plikach
BMP lub WAV. Umożliwia również korzystanie z najpopularniejszych funkcji skrótu oraz algorytmów szyfrowania DES, 3DES i RC4. Nietrudno się domyślić, że oprócz narzędzi do steganografii powstały również programy do stegoanalizy. Wykorzystują one analizę statystyczną w celu wyszukania w analizowanych plikach wzorców odbiegających od normy, badają strukturę pliku i wyszukują charakterystyczne ślady pozostawiane przez oprogramowanie steganograficzne. Ostatnia z wymienionych technik (zwana również analizą sygnaturową) jest szczególnie interesująca, ponieważ nie wymaga materiału porównawczego i umożliwia zidentyfikowanie zastosowanego do ukrycia danych oprogramowania. Dzięki temu możemy poszukać informacji na temat słabości danej aplikacji i spróbować je wykorzystać na dalszym etapie stegoanalizy. Wadą analizy sygnaturowej jest konieczność posiadania i aktualizowania bazy wzorców steganograficznych. Popularne programy do stegoanalizy to: Stego Suite — bardzo zaawansowany i bardzo drogi pakiet programów
do stegoanalizy plików. Zawiera liczne narzędzia pozwalające wykrywać informacje ukryte w plikach graficznych i muzycznych, jak również program do łamania haseł. Stegdetect — darmowa aplikacja umożliwiająca identyfikowanie programów
steganograficznych, za pomocą których przetwarzany był dany plik. Daje również możliwość wyszukiwania ukrytych danych i łamania chroniących je haseł. StegSpy — program wykrywający operacje steganograficzne przeprowadzone
na pliku przez niektóre programy. Steganography Studio — napisana w języku Java aplikacja umożliwiająca
porównywanie różnych algorytmów steganograficznych oraz stegoanalizę plików graficznych. Lista dostępnych aplikacji do steganografii i stegoanalizy jest bardzo długa, zwłaszcza jeśli uwzględnimy także programy wykorzystujące inne techniki zabezpieczania danych.
Rozdział 4.
Kryptografia w praktyce W teorii nie ma różnicy między teorią a praktyką. W praktyce jest. Yogi Berra Niedostateczna współpraca podczas opracowywania procedur, niepoprawne tworzenie i rozprowadzanie tekstów kluczy, niekompletność procedur związanych z tworzeniem i rozprowadzaniem kluczy, przeoczenie możliwości kompromitacji podczas wprowadzania procedur eksploatacji kluczy i liczne inne czynniki będą sprzyjać nieautoryzowanemu deszyfrowaniu. Erich Huttenhain Użytkownik, któremu pozwolimy wybierać między bezpieczeństwem a możliwością zainstalowania programu wyświetlającego na ekranie tańczące świnki, niemal zawsze wybierze świnki. Bruce Schneier
4.1. Konstrukcja bezpiecznego systemu kryptograficznego Istnieje szereg zasad, o których należy pamiętać podczas zabezpieczania systemu komputerowego za pomocą technik kryptograficznych. Mają one głównie na celu zminimalizowanie zagrożenia związanego z błędami popełnianymi przez użytkowników w czasie implementacji oraz użytkowania systemu. Należy pamiętać, że nawet najlepszy system szyfrujący nie jest w stanie zapewnić bezpieczeństwa, jeśli nie przestrzega się zasad jego stosowania. W historii kryptografii są na to liczne przykłady, chociażby opisana w rozdziale 1. historia złamania szyfru Enigmy. Większość przypadków złamania systemu zabezpieczającego jest spowodowana błędem człowieka, a nie złymi rozwiązaniami kryptograficznymi. Dzieje się tak, ponieważ o wiele łatwiej jest znaleźć i wykorzystać lukę w implementacji, niż dokonywać kosztownej i pracochłonnej kryptoanalizy systemu.
148
Podstawy kryptografii
4.1.1. Wybór i implementacja kryptosystemu W procesie ochrony danych najważniejszy jest wybór odpowiedniego systemu zabezpieczającego. Zdecydowanie lepiej polegać na sprawdzonym już oprogramowaniu czy sprzęcie. Warto też sprawdzić, czy produkty te mają certyfikaty państwowych urzędów kontrolnych. Zawsze należy zapoznać się z techniczną stroną działania takiego systemu. Najlepiej, jeśli opiera się on na już sprawdzonych, skutecznych rozwiązaniach. Fakt utajnienia zastosowanych metod powinien budzić najwyższy niepokój, gdyż bezpieczeństwo systemu nie może być oparte na tajności zastosowanych w nim algorytmów. Jest to jedna z podstawowych zasad w kryptografii, określana często jako „zasada Kerckhoffa”. Na przykład schemat działania algorytmu DES był znany od samego początku, gdyż jego bezpieczeństwo opierało się na tajności klucza. Jeśli badany system jest nową propozycją na kryptograficznym rynku, należy sprawdzić, czy spotkał się on z zainteresowaniem i jakie opinie wystawili mu fachowcy w tej dziedzinie, a także inni użytkownicy. Najlepiej, gdy nad danym produktem prowadzone są badania kryptoanalityczne. Wtedy jeśli w ciągu kilku lat nie zanotowano postępów w złamaniu jego zabezpieczeń, można go uznać za względnie bezpieczny i zastosować we własnym systemie. Dodatkowym argumentem przemawiającym za oparciem bezpieczeństwa na tajności klucza jest mnogość wszelkiego rodzaju dekompilatorów, debugerów oraz innych narzędzi do odwrotnej inżynierii oprogramowania. Dzięki nim odkrycie zasad działania dowolnego tajnego algorytmu jest jedynie kwestią czasu. Konieczne jest również śledzenie na bieżąco rozwoju technologii zabezpieczeń kryptograficznych oraz metod kryptoanalitycznych. Pozwala to na wychwycenie nowych rozwiązań, które mogą okazać się skuteczniejsze niż stosowane w danej chwili. Dzięki temu można także stwierdzić, kiedy stosowany produkt przestał być bezpieczny. Przykładem może tu być RSA, w którym na przestrzeni ostatnich kilkunastu lat wielokrotnie zwiększano długość klucza — w miarę jak postęp technik kryptoanalitycznych i mocy obliczeniowej komputerów pozwalał łamać szyfry oparte na krótszych kluczach. Inny przykład to zastąpienie funkcji MD5 algorytmem SHA, a następnie SHA2, a także odchodzenie od stosowania „czystych” funkcji skrótu na rzecz bcrypt lub PBKDF2 w mechanizmie haszowania haseł w bazach danych. Po podjęciu decyzji o zakupie systemu zabezpieczającego należy go zaimplementować i użytkować zgodnie z załączoną specyfikacją. Nie należy dokonywać własnych „udoskonaleń” w programie. Doświadczenie pokazuje, że nawet dokonywane przez fachowców ulepszenia w cudzych programach powodowały powstawanie luk ułatwiających złamanie szyfru. Tym bardziej więc nie należy zezwalać na wprowadzanie zmian użytkownikom czy nawet administratorowi systemu. Warto też pamiętać o ustawicznym testowaniu oprogramowania zabezpieczającego, zwłaszcza jeśli jest to własny system szyfrujący. Nawet w przypadku zakupienia renomowanego produktu warto wynająć specjalistę, który sprawdzi, czy zabezpieczenia faktycznie są „szczelne”. Należy bowiem pamiętać, że w złamaniu zabezpieczeń może pomóc atakującemu nie tylko błąd w rozwiązaniach kryptograficznych, ale również niedopracowanie w systemie operacyjnym (wystarczy wspomnieć luki w zabezpieczeniach MS Windows XP), techniczna wiedza o stosowanym sprzęcie (atak bocznym kanałem) czy w końcu zwykła ludzka naiwność (hasło łatwe do odgadnięcia przez atak słownikowy). Zwłaszcza ten ostatni aspekt zabezpieczania systemu powinien być gruntownie przeanalizowany (poświęcam mu osobny podrozdział).
Rozdział 4. Kryptografia w praktyce
149
Bardzo ważnym parametrem programu kryptograficznego jest jego złożoność. Generalnie im program jest prostszy konstrukcyjnie, tym lepiej. Wynika to z faktu, że każda dodatkowa opcja lub udoskonalenie dla użytkownika może potencjalnie ułatwić włamanie do systemu. Aby zwiększyć prostotę i przejrzystość kodu, warto zastosować modularyzację. Przy projektowaniu systemu opartego na modułach należy zwrócić uwagę na to, aby poszczególne moduły działały tak odrębnie, jak to tylko możliwe, gdyż w przeciwnym wypadku tworząca się sieć połączeń może okazać się trudna do kontrolowania. Testowanie gotowego systemu zabezpieczającego jest trudniejsze od testowania typowego oprogramowania. Należy bowiem zwrócić uwagę na fakt, że o ile w przypadku zwykłych programów liczy się to, co użytkownik może zrobić, o tyle w systemach bezpieczeństwa liczy się to właśnie, czego użytkownik zrobić nie może. Innymi słowy, faza testów sprowadza się nie tyle do sprawdzenia funkcjonalności, ile jej braku. W tym przypadku nie ma zbioru procedur, według których należy postępować. Najrozsądniejszym wyjściem jest wówczas zlecenie przetestowania programu niezależnemu specjaliście, którego zadaniem będzie znalezienie luki w zabezpieczeniach systemu. Oprócz odpowiedniej strategii wdrażania i użytkowania systemu konieczne jest również opracowanie stosownego planu zamknięcia. Określa on zakres czynności związanych z wycofaniem danej aplikacji z użycia. Przede wszystkim chodzi tutaj o usunięcie z systemu wrażliwych informacji. Może to oznaczać wielokrotne nadpisanie zawierających je obszarów pamięci lub nawet fizyczne zniszczenie nośników. Wszystko zależy od stopnia tajności przetwarzanych danych i planów dalszego wykorzystania sprzętu. Jeśli komputery, na których przechowywano szczególnie istotne informacje, mają być sprzedane, należy bardzo skrupulatnie wyczyścić ich zawartość (więcej na temat bezpiecznego usuwania danych napiszę w dalszej części tego rozdziału).
4.1.2. Bezpieczny system kryptograficzny Warto zastanowić się również, co oznacza termin „bezpieczny system kryptograficzny”. W kryptologii podstawowym terminem jest „względnie bezpieczny” lub „prawdopodobnie bezpieczny”. Chodzi tu o system, co do którego nie znaleziono dowodu, iż można go złamać, ale nie ma też dowodu, że jest on w 100% bezpieczny. Istnieje tylko jeden system, o którym z pewnością można powiedzieć, iż nie da się go złamać. Jest nim szyfr z kluczem jednorazowym. Polega on na szyfrowaniu każdej wiadomości przy użyciu innego, losowo utworzonego klucza mającego dodatkowo taką samą długość, jaką ma szyfrowana wiadomość. Dzięki temu każdy tekst jawny jest dla danego szyfrogramu tak samo prawdopodobny, o ile oczywiście ma tę samą długość. Kryptoanalitykowi nie pozostaje żadna prawidłowość, od której mógłby zacząć łamanie szyfru. Jedynym sposobem jest przechwycenie tajnej książki kluczy i wypróbowywanie wszystkich kluczy po kolei. Metoda ta jest jednak wysoce niepraktyczna ze względu na problem generowania i dystrybucji kluczy, zwłaszcza w przypadku stosowania technologii komputerowej. Liczba przesyłanych codziennie przez internet wiadomości wymuszałaby generowanie i przechowywanie gigantycznej liczby kluczy, a poza tym w przypadku tej metody konieczna jest idealna synchronizacja nadawcy i odbiorcy, co jest bardzo trudne ze względu na przypadkowe szumy i przekłamania bitów pojawiające się podczas transmisji przez sieć.
150
Podstawy kryptografii
Istnieją jednak inne kryteria, na podstawie których da się ocenić bezpieczeństwo szyfru. Nie zawsze bowiem potencjalna możliwość złamania systemu oznacza jego nieprzydatność. Może się okazać, że koszt złamania zabezpieczeń jest większy niż korzyści wynikające z uzyskanych w ten sposób informacji. W takiej sytuacji uważa się, że szyfr jest bezpieczny, gdyż jego łamanie staje się nieopłacalne. Bywa również, że dane, które system powinien chronić, mają pewien okres utajnienia. Jeśli na złamanie zabezpieczeń potrzeba więcej czasu, niż wynosi ten okres, to również są one bezpieczne. Niektóre typy szyfrów wymagają określonej ilości materiału do badań kryptoanalitycznych w celu wykrycia użytego klucza. Trzeba więc odpowiednio często zmieniać klucze, aby wrogi kryptoanalityk nie miał wystarczającego materiału do przeprowadzenia skutecznego ataku. O algorytmie obliczeniowo bezpiecznym możemy również mówić wówczas, jeśli nie można złamać go za pomocą dostępnych obecnie (i w najbliższej przyszłości) środków. Termin „dostępne środki” jest trudny do zdefiniowania, zwłaszcza w odniesieniu do przyszłości. Pewnych wskazówek dostarczyć nam mogą dane na temat złożoności obliczeniowej algorytmu kryptoanalitycznego, który mógłby przełamać nasze zabezpieczenia metodą brutalnego ataku. Nie mniej istotnym parametrem systemu szyfrującego jest jego wydajność. Należy zawsze mieć na uwadze możliwości techniczne środowiska, w którym ma być zaimplementowany system. Chodzi tu zwłaszcza o możliwości obliczeniowe używanych komputerów. Temat ten podejmuje N. Koblitz w książce Algebraiczne aspekty kryptografii (patrz Bibliografia), zwracając uwagę na fakt, iż systemy z kluczem publicznym są wolniejsze od systemów opartych na szyfrowaniu symetrycznym, w związku z czym nie nadają się one do przesyłania dużych wiadomości. Szyfrowanie takich wiadomości przy użyciu funkcji jednokierunkowych jest bardzo czasochłonne i tym samym mniej efektywne niż w przypadku systemów symetrycznych. Z drugiej jednak strony systemy oparte na tajności klucza oferują niższy stopień bezpieczeństwa. Wydaje się więc, że optymalnym rozwiązaniem jest zastosowanie systemów hybrydowych opierających się na szyfrowaniu symetrycznym przy jednoczesnym zastosowaniu technik asymetrycznych do zabezpieczania kluczy. Tego typu rozwiązanie stosowane jest na przykład w pakiecie PGP, gdzie szyfrowanie opiera się na wybranym algorytmie symetrycznym, natomiast wykorzystane w jego trakcie klucze są szyfrowane metodą RSA.
4.1.3. Najsłabsze ogniwo „Dwie rzeczy nie mają granic: wszechświat i ludzka głupota, choć co do tego pierwszego nie mamy pewności”. Te słowa Alberta Einsteina najpełniej oddają temat tego podrozdziału. Nawet najlepszy system kryptograficzny na nic się nie przyda, jeśli jego użytkownicy nie będą z niego umiejętnie korzystać. Wydaje się to oczywiste i być może niektórzy z Was stwierdzą, że się powtarzam, ale realia są bezlitosne. Każdy system zabezpieczeń jest najwyżej tak solidny jak jego najsłabszy element, a tym, niestety, najczęściej okazuje się człowiek. Dzieje się tak z bardzo prostej przyczyny — jest nią brak wiedzy. I nie chodzi tu o administratora, ale o zwykłych pracowników. Dlatego jeśli myślicie o projektowaniu i wdrażaniu systemów zabezpieczeń, bądźcie gotowi na długie rozmowy i nieraz bardzo irytujące pytania w stylu: „Dlaczego nie powinno się zapisywać haseł w postaci
Rozdział 4. Kryptografia w praktyce
151
plików tekstowych?” (tak na marginesie: haseł w ogóle nie powinno się zapisywać). Jeśli wydaje Wam się, że nikt nie zrobiłby czegoś takiego, najwyraźniej nie słyszeliście jeszcze o przylepianiu kartki z hasłem do monitora. Liczba sposobów narażania na szwank bezpieczeństwa systemu przez użytkowników zależy tylko od ich wyobraźni. Innymi słowy, jest nieograniczona, a wymienianie potencjalnych zagrożeń na tym polu mija się z celem. Lepiej skoncentrować się na ogólnych zasadach postępowania, które pozwalają znacznie zmniejszyć wynikające z tego ryzyko.
4.1.3.1. Kryptografia jako gwarancja bezpieczeństwa „Nasze dane są zaszyfrowane, więc nic im nie grozi”. Takie podejście jest, niestety, nadal powszechnie spotykane. Wiele osób utożsamia kryptografię z idealnym rozwiązaniem wszelkich problemów związanych z bezpieczeństwem danych. Tymczasem szyfry same w sobie nie stanowią gwarancji bezpieczeństwa. Bez wspomagania w postaci odpowiednich procedur zarządzania hasłami, kluczami, fizycznym dostępem do serwerów oraz wszelkich innych niekryptograficznych technik bezpieczeństwa są niewiele warte. Najbardziej obrazowym porównaniem jest tu analogia do drzwi. Kryptografia to nasz zamek. Może on być najnowocześniejszy i wyjątkowo trudny do otwarcia, jednak niczego nam nie zagwarantuje, jeśli drzwi można łatwo wyjąć z zawiasów, a my i tak notorycznie zostawiamy je uchylone, gdy wychodzimy z domu. Inna sprawa, że atakujący niekoniecznie musi chcieć dotrzeć do tajnych informacji. Co jeśli po prostu będzie chciał je skasować? Zaszyfrowane dane kasuje się równie łatwo jak niezaszyfrowane. Należy więc pamiętać, aby oprócz odpowiedniej implementacji położyć nacisk na właściwe (zgodne z normami bezpieczeństwa) użytkowanie kryptosystemu. W przeciwnym wypadku zamiast prawdziwego bezpieczeństwa otrzymujemy jego iluzję, co jest jeszcze gorsze niż jego zupełny brak.
4.1.3.2. Hasła Pamiętacie, na czym polega atak słownikowy? Pozwala on na odgadnięcie hasła chroniącego dostęp do systemu dzięki założeniu, iż hasło to jest jednym z powszechnie występujących w języku wyrazów lub jego wariacją. Teraz napiszę nieco więcej na temat metod wybierania bezpiecznych haseł. Bezpiecznych, czyli takich, których nie można łatwo odgadnąć. Ale zanim zaczniemy, jedna uwaga: hasła nie zapisujemy — zapamiętujemy je. Stosowanie tej zasady pozwala uniknąć wszelkich problemów wynikających ze zgubienia kartki z hasłem. I nie chodzi tu już nawet o zagrożenie bezpieczeństwa (choć to oczywiście również ma znaczenie), ale o fakt, że wiele osób zapomina, jak brzmi ich własne hasło, bo przecież je sobie zapisały. Potem pojawia się kłopot z zalogowaniem do systemu i trzeba się kontaktować z administratorem. Jak więc wybrać bezpieczne hasło? Najlepiej byłoby, gdyby składało się ono z małych i dużych liter, a także znaków specjalnych i cyfr i przy okazji nie tworzyło żadnej logicznej struktury. Przykładem takiego hasła może być d8#lD0!Qx. Atak słownikowy na pewno temu nie podoła, problem jednak w tym, jak takie hasło zapamiętać. Jeśli potrzebujemy
152
Podstawy kryptografii
kilku albo nawet kilkunastu takich bezpiecznych haseł, jedynym rozwiązaniem może się okazać ich zapisanie, a to nas nie urządza. A co powiecie na MB!Tka10$!? Ten sam problem? Niekoniecznie. Spójrzcie na poniższe zdanie: „Mój Boże! To kosztuje aż 10$!”. Widzicie już, o co chodzi? Wystarczy spisać pierwsze litery wyrazów oraz znaki specjalne i cyfry. W ten sposób powstał ciąg pozornie przypadkowych znaków. Zdanie o wiele łatwiej zapamiętać, a wówczas zawsze będziemy w stanie odtworzyć hasło. Jeszcze lepszym rozwiązaniem jest zastosowanie tzw. frazy kluczowej, a więc całego zdania występującego w charakterze hasła. Łatwo je zapamiętać i posiada ono znacznie więcej znaków niż „zwykłe” hasło. I ostatnia uwaga. Jeśli już koniecznie musimy zapisać hasło, dobrym pomysłem jest stworzenie prostego systemu szyfrowania i stosowanie go do ochrony hasła. Można na przykład zamieniać litery na występujące dalej w alfabecie, zapisać hasło od tyłu lub połączyć litery w pary i zamienić je miejscami. Hasło zapisujemy dopiero po jego przekształceniu. Zawsze będzie to jakieś utrudnienie dla osoby, która weszłaby w posiadanie takiej kartki, choć nie przeceniałbym wagi tego typu „zabezpieczeń”, zwłaszcza w odniesieniu do naprawdę istotnych danych.
4.1.3.3. Procedury kontra socjotechnika Wspomniane wcześniej ataki socjotechniczne również mogą zniweczyć cały wysiłek włożony w kryptograficzne zabezpieczanie danych. O wiele łatwiej namówić osobę posiadającą tajne informacje, by je udostępniła, niż złamać chroniący je szyfr. Najlepszą metodą ochrony przez socjotechniką jest opracowanie stosownych reguł udostępniania danych. Najogólniej rzecz biorąc, pracownik musi wiedzieć, które dane są bezwzględnie tajne, które może powszechnie udostępniać, a które powinny być dostępne dla wybranych osób i jak te osoby rozpoznać. Niestety, samo opracowanie takich reguł nie wystarczy. Należy je jeszcze potem rygorystycznie stosować. Być może wydaje Wam się, że to coś oczywistego, jednak tak naprawdę chwyty socjotechniczne opracowywane są z myślą o skłonieniu drugiej osoby do odstąpienia od przyjętych reguł bezpieczeństwa. Atakujący może się podać za innego pracownika tej samej firmy, który potrzebuje pomocy, lub za kogoś posiadającego dużą władzę w firmie. W pierwszym przypadku zadziała zwykła chęć pomocy „koledze po fachu”, a w drugim — lęk przed konsekwencjami. Takich metod jest oczywiście znacznie więcej, jednak wszystkie opierają się na podobnych mechanizmach psychologicznych. Jak więc im zapobiegać? Po ustaleniu jasnych procedur należy uświadomić pracownikom, dlaczego ich przestrzeganie jest istotne oraz jakie konsekwencje grożą za ich łamanie. Dobrze jest również wyjaśnić, dlaczego chronione dane są tajne i jaki użytek mogłaby z nich zrobić osoba mająca złe zamiary. Warto również od czasu do czasu sprawdzać, czy procedury faktycznie są przestrzegane. W miarę możliwości polecane jest nawet zorganizowanie prostego szkolenia dotyczącego ataków socjotechnicznych. Wiele cennych wskazówek na ten temat znaleźć można w książce Sztuka podstępu (patrz Bibliografia). Podano tam również wiele informacji dotyczących ustalania odpowiednich procedur oraz ich późniejszego testowania.
Rozdział 4. Kryptografia w praktyce
153
4.1.3.4. Wewnętrzny wróg Za zdecydowaną większością udanych ataków na systemy informatyczne firm stoją ich byli pracownicy. Dysponują oni dużą wiedzą na temat organizacji danego przedsiębiorstwa, struktury rozmieszczenia danych oraz obowiązujących zasad bezpieczeństwa. Nawiązane w trakcie pracy znajomości dają im ogromne możliwości wykorzystania chwytów socjotechnicznych (dobry przykład znajduje się we wspomnianej powyżej książce). Często dysponują również pewnymi uprawnieniami w systemie, ponieważ ich konto nadal pozostaje aktywne, przynajmniej przez jakiś czas. Dlatego też po odejściu danej osoby z firmy jej konto powinno być likwidowane natychmiast. Inni pracownicy powinni zdawać sobie sprawę, iż udostępnianie niejawnych informacji takiej osobie jest równie ryzykowne jak udostępnianie ich komuś zupełnie obcemu. Wydaje się to oczywiste, jednak często zdarzają się odstępstwa od tej reguły — „po starej znajomości”. Nieco inaczej ma się sprawa z aktualnymi pracownikami firmy. Tu jedynym rozwiązaniem jest odpowiednia kontrola dostępu do danych. Podstawowe znaczenie ma odpowiedni system uwierzytelniania, jednak nie tylko on. Na tym polu również liczy się znajomość i przestrzeganie procedur. Sytuacja, w której jeden pracownik podaje swój login i hasło drugiemu, jest niedopuszczalna (choć w praktyce występuje nagminnie). Dotyczy to zwłaszcza sytuacji, kiedy druga z osób ma mniejsze uprawnienia niż pierwsza. Oczywiście niezwykle rzadko zdarza się, aby taka osoba wykorzystała sytuację w celu zdobycia tajnych informacji. Niemniej jednak stwarzanie takich okazji naraża firmę na niepotrzebne ryzyko. W teorii cała sprawa jest prosta. Należy ustalić, kto, kiedy i do jakich informacji ma mieć dostęp, a następnie wcielić te ustalenia w życie za pomocą odpowiednich procedur i technik uwierzytelniania. W praktyce jednak pracownicy często ignorują pewne przepisy, aby ułatwić sobie życie. W zdecydowanej większości przypadków nie ma to żadnych negatywnych konsekwencji, otwiera jednak pewne pole manewru dla kogoś, kto wie, jak wykorzystać powstałą w ten sposób lukę.
4.1.3.5. Podsumowując… Wszelkie zagrożenia płynące z ogólnie rozumianego „czynnika ludzkiego” można znacznie ograniczyć przez wprowadzanie odpowiednich procedur, a następnie ich przestrzeganie. O wiele łatwiej jednak skłonić ludzi do przestrzegania określonych zasad, jeśli rozumieją przyświecający temu cel i zagrożenia płynące z lekceważenia ustaleń. Stąd też (na miarę posiadanych środków i czasu) dobrze jest przeprowadzić choćby krótkie szkolenie poruszające najważniejsze aspekty bezpieczeństwa. Wyjaśnienie zasad działania podstawowych mechanizmów ochrony danych oraz sposobów ich obchodzenia również pomaga uświadomić ludziom różne potencjalne niebezpieczeństwa. Kontrola wprowadzonych metod postępowania oraz ich przestrzegania również jest istotna. Po przeprowadzonym szkoleniu pracownicy z pewnością będą przykładać większą wagę do przestrzegania ustalonych reguł, jednak w miarę upływu czasu górę wezmą stare nawyki i w końcu sytuacja wróci do punktu wyjścia.
154
Podstawy kryptografii
Same procedury należy regularnie weryfikować. Co jakiś czas pojawiają się nowe typy zagrożeń i takie ataki na dane, wobec których nasze reguły postępowania mogą się okazać przestarzałe. Innymi słowy, trzeba trzymać rękę na pulsie. Krótko mówiąc, ochrona danych to proces, a nie stan. Składają się na niego cyklicznie powtarzane operacje udoskonalania i weryfikacji jakości posiadanych zabezpieczeń. Bez względu na to, czy dotyczy to sprzętu, oprogramowania, czy ludzi. Oczywiście nie zawsze dysponujemy odpowiednimi środkami (albo czasem), aby pozwolić sobie na przeprowadzanie kolejnych szkoleń czy kontroli, trzeba jednak zdawać sobie sprawę z ewentualnych konsekwencji zaniedbań na tym polu, gdyż koszty luki w zabezpieczeniach mogą się okazać znacznie wyższe.
4.2. Zabezpieczanie połączeń internetowych W tym rozdziale omówione zostaną protokoły służące do inicjowania i utrzymywania bezpiecznego kanału komunikacyjnego między dwoma komputerami.
4.2.1. Protokół TLS TLS (skrót od ang. Transport Layer Security) dawniej znany był jako protokół SSL (skrót od ang. Secure Socket Layer). TLS jest protokołem bezpieczeństwa stosowanym przez przeglądarki internetowe do zabezpieczania połączeń z serwerami sieciowymi. Został on opracowany i zaimplementowany przez Netscape. Wersja SSL 1.0 nigdy nie trafiła do publicznego użytku, a wersja 2.0 bardzo szybko została zastąpiona wersją 3.0 (wypuszczoną w roku 1996) ze względu na odkryte luki w bezpieczeństwie. Dalszy rozwój protokołu odbywa się w ramach projektu realizowanego przez grupę roboczą IETF. W roku 1999 opublikowano pierwszą wersję protokołu TLS. Kolejne wersje (TLS 1.1 i TLS 1.2) ukazywały się odpowiednio w latach 2006 i 2008.
4.2.1.1. Struktura i lokalizacja protokołu TLS Protokół TLS składa się z dwóch podprotokołów: protokołu uzgadniania (ang. Handshake Protocol), w którego skład wchodzą
również protokoły zmiany specyfikacji szyfru (ang. Cipher Spec Protocol) oraz protokół alarmowy (ang. Alert Protocol); protokołu określania formatu pakietów (ang. Record Protocol).
Możliwe jest wykorzystanie TLS w połączeniu z protokołami innymi niż HTTP, ponieważ jest on przezroczysty. Oznacza to, że posiada taki sam interfejs jak położone poniżej protokoły warstwy transportowej, dzięki czemu operacje związane z zabezpieczaniem połączenia wykonywane są w sposób niewidoczny dla innych protokołów. TLS jest inicjalizowany w warstwie aplikacji, ale działa w warstwie prezentacji modelu OSI.
Rozdział 4. Kryptografia w praktyce
155
4.2.1.2. Nawiązywanie połączenia w TLS Za nawiązywanie połączenia w protokole TLS odpowiedzialny jest protokół uzgadniania (ang. handshake). Podczas jego realizacji (w wersji 1.2) wykonywane są następujące operacje: Request Hello — to żądanie może być wysłane przez serwer. Jest to sygnał dla
klienta, że powinien rozpocząć cały proces negocjacji od nowa. W odpowiedzi klient powinien przesłać komunikat Client Hello. Jeśli sesja negocjacyjna już trwa, klient ignoruje to żądanie. Client Hello — klient, który chce nawiązać połączenie z serwerem, wysyła
pierwszy komunikat. Przesyłane są następujące parametry: wersja stosowanego protokołu, używane przez niego metody kompresowania, szyfrowania oraz podpisywania danych, a także czas systemowy klienta, identyfikator sesji i 28-bajtowa liczba losowa. Server Hello — serwer odpowiada klientowi, wysyłając własne parametry
i ciąg losowy. Hello Extensions — następuje uzgodnienie dodatkowych, nieustalonych
w poprzednich etapach parametrów połączenia. Na tym etapie ustalany jest m.in. algorytm podpisu elektronicznego, który zostanie wykorzystany w dalszej części nawiązywania połączenia. Server Certificate — serwer podaje klientowi swój certyfikat. W przypadku
niektórych algorytmów (RSA, DH-DSS, DH-RSA) na tym etapie ustalane są dane konieczne do wygenerowania parametru o nazwie pre-master-secret. Server Key Exchange Message — na tym etapie klient i serwer ustalają dane konieczne do wygenerowania pre-master-secret, o ile nie były one ustalone
wcześniej. To rozwiązanie stosowane jest w przypadku algorytmów DHE-DSS, DHE-RSA i DH-anon. W przypadku innych algorytmów moment generowania pre-master-secret jest ustalany w ich specyfikacji. Certificate Request — na tym etapie serwer może zażądać certyfikatu od klienta,
jeśli wymaga tego wybrana metoda szyfrowania. Server Hello Done — ten komunikat oznacza koniec etapu Server Hello.
Po jego wysłaniu serwer czeka na odpowiedź ze strony klienta. Client Certificate — ta wiadomość zostaje przesłana, jeśli serwer zażądał
od klienta przesłania certyfikatu. Jeśli certyfikat nie jest dostępny, klient musi przesłać wiadomość niezawierającą żadnych certyfikatów. To, czy w takiej sytuacji komunikacja zostanie przerwana, zależy od ustawień serwera (możliwe jest nawiązanie połączenia pomimo braku certyfikatu klienta). Client Key Exchange Message — ta wiadomość musi zostać wysłana
w odpowiedzi na komunikat Server Hello Done (wcześniej może być przesłany wyłącznie certyfikat klienta, o ile serwer takiego zażądał). Służy ona do ostatecznego ustalenia parametru pre-master-secret. Jest on przesyłany bezpośrednio, po zaszyfrowaniu algorytmem RSA lub w formie negocjacji parametrów dla algorytmu Diffiego-Hellmana.
156
Podstawy kryptografii Certificate Verify — weryfikacja certyfikatu klienta. Musi nastąpić bezpośrednio
po komunikacie Client Key Exchange Message. Finish — jeśli wszystkie operacje przebiegły pomyślnie, zostaje nawiązana
chroniona kryptograficznie komunikacja.
4.2.1.3. Wyznaczanie kluczy Używany przy bezpośredniej weryfikacji ciąg master-secret jest tworzony przy użyciu ciągów losowych klienta i serwera, ustalonego ciągu pre-master-secret oraz specjalnie w tym celu zaprojektowanej funkcji pseudolosowej (PRF) wykorzystującej algorytm SHA. Istotną cechą ciągu master-secret jest to, iż jest on zależny nie tylko od wyboru klienta (jak pre-master-secret), ale też od decyzji serwera. Taki stan rzeczy osiągnięto dzięki wprowadzeniu do obliczeń wspomnianych ciągów losowych. Po ustaleniu parametru master-secret parametr pre-master-secret jest usuwany z pamięci. Generowanie osobnego klucza dla każdej sesji zmniejsza ryzyko złamania szyfru poprzez ograniczenie liczby kryptogramów przypisanych do jednego klucza. Dodatkowo rozwiązanie to ogranicza potencjalne straty wynikające ze zdobycia klucza przez osobę niepowołaną. W takiej sytuacji atakujący będzie mógł jedynie uzyskać dostęp do informacji przekazywanych w ramach danej sesji i nie zwiększy to jego szans na odgadnięcie kolejnego klucza sesyjnego.
4.2.1.4. Przesyłanie danych Podczas wysyłania danych z użyciem TLS wykonywane są następujące operacje: Dane dzielone są na pakiety. Pakiety poddawane są kompresji (opcjonalnie). Następuje szyfrowanie pakietów. Dla każdego pakietu obliczany jest kod MAC. Pakiety wysyłane są do sieci.
Za przeprowadzenie tych operacji odpowiedzialny jest protokół określania pakietów. Jeśli w trakcie wykonywania operacji pojawi się pakiet zawierający błędy, uruchamia się protokół alarmowy (ang. Alert Protocol). Sytuacja jest kwalifikowana do jednej z trzech kategorii: ostrzeżenie, błąd i błąd krytyczny. Dalsza procedura postępowania zależy od tego, który z tych przypadków ma miejsce. W pierwszych dwóch na połączenie zostają nałożone ograniczenia, a w przypadku błędu krytycznego połączenie zostaje przerwane. Metoda używana do szyfrowania pakietów jest ustalana w fazie nawiązywania połączenia. Komputer klienta podaje listę obsługiwanych metod, spośród których serwer wybiera najbezpieczniejszą dla danego połączenia. Ogólnie stosowane są metody symetryczne, natomiast używany klucz jest ustalany i chroniony przez techniki asymetryczne.
Rozdział 4. Kryptografia w praktyce
157
Jeśli w trakcie połączenia zachodzi konieczność zmiany szyfru bądź niektórych jego elementów (powiedzmy, klucza), uruchamiany jest protokół zmiany specyfikacji szyfru.
4.2.1.5. Implementacja protokołu TLS Aby posługiwać się protokołem SSL do zabezpieczania połączenia internetowego klientów z serwerem, musimy w pierwszej kolejności pobrać certyfikat SSL z jednego z centrów certyfikacyjnych. Cena wyrobienia takiego certyfikatu zależy od konkretnego centrum certyfikacji, jednak z reguły jest to wydatek od 200 do 1500 zł. Niektóre centra oferują możliwość przetestowania zabezpieczenia SSL, zanim klient zdecyduje się na zakup. W przedstawionym poniżej przykładzie posłużę się próbną wersją certyfikatu SSL, proponowaną przez Centrum Certyfikacji Certum. W celu pobrania certyfikatu testowego trzeba udać się na stronę http://www.certum.pl. Po najechaniu kursorem na przycisk Certyfikaty SSL wyświetlone zostanie okienko z dodatkowymi opcjami (Kup certyfikat SSL, Testuj certyfikat SSL i Odnów certyfikat SSL) (patrz rysunek 4.1).
Rysunek 4.1. Próbny certyfikat SSL w Centrum Certyfikacji Certum
Klikamy łącze Testuj certyfikat SSL i wypełniamy wyświetlony na kolejnej stronie formularz dotyczący naszych danych kontaktowych, branży itp. Po przesłaniu danych otrzymamy informację o rozpoczęciu przetwarzania wniosku oraz łącze do strony, na której po zalogowaniu i zakończeniu przetwarzania będzie można aktywować certyfikat (patrz rysunek 4.2).
158
Podstawy kryptografii
Rysunek 4.2. Aktywacja certyfikatu
Klikamy widoczny w prawym dolnym rogu przycisk Aktywuj. Zostaniemy poproszeni o wybór metody dostarczenia klucza dla certyfikatu. Do wyboru mamy jedną z dwóch opcji: Generowanie pary kluczy — klucze zostaną utworzone w ramach przeglądarki
(Firefox, Opera) lub w systemie Windows (Internet Explorer, Chrome). Jest to opcja zalecana dla certyfikatów niekwalifikowanych oraz certyfikatów do podpisywania kodu. CSR — czyli żądanie podpisania certyfikatu (ang. Certificate Signing Request).
Pozwala na podanie wygenerowanego wcześniej żądania CSR. Zawiera ono dane certyfikatu oraz klucze szyfrowania. Podczas tworzenia certyfikatu SSL należy zaznaczyć właśnie tę opcję. Sposób uzyskiwania żądania certyfikatu zależy od typu serwera. Pliki dokumentacji dla poszczególnych serwerów zapisane w formacie pdf pobrać można pod adresem http://certum.pl/certum/cert,wiedza_certyfikaty_ssl_instalacja_certyfikatu_instrukcje. xml. Zawarte są w nich m.in. informacje na temat generowania wniosku o certyfikat oraz klucza prywatnego serwera. Dobrym pomysłem jest pobranie odpowiadającego określonemu serwerowi pliku i wygenerowanie żądania zgodnie z podanymi wytycznymi. Dostępne są instrukcje dla następujących serwerów: Apache, Exchange 2010, Internet Information Service 5.0 (IIS), Internet Information Service 7.0 (IIS), PureFTPd, Postfix, Sendmail, VSFTPd, Tomcat,
Rozdział 4. Kryptografia w praktyce
159
Archiwalne: Exchange 2003, Exchange 2007, Lotus Domino, PureFTPd,
Sendmail, VPN, SunOne Web Serwer. Jeśli ktoś posługuje się innym typem serwera, powinien znaleźć odpowiednie instrukcje w jego specyfikacji technicznej. CSR można również utworzyć za pomocą dostępnego na stronie centrum generatora. Klucz prywatny należy zabezpieczyć, natomiast wniosek będzie potrzebny do ukończenia procesu uzyskiwania certyfikatu. Przykładowe żądanie certyfikatu widoczne jest na rysunku 4.3. Po wygenerowaniu żądania kopiujemy je (łącznie z liniami -----BEGIN NEW CERTIFICATE REQUEST----- oraz -----END NEW CERTIFICATE REQUEST-----) do pola w formularzu w kroku trzecim procedury (Klucze), podajemy wymagane dane i klikamy przycisk Dalej. W ostatnim kroku dokonujemy ostatecznej weryfikacji wprowadzonych danych (ich późniejsza zmiana nie będzie możliwa!), akceptujemy oświadczenie i klikamy przycisk Aktywuj. Ostatnim warunkiem wydania certyfikatu jest potwierdzenie dostępu do domeny, którą podaliśmy podczas wypełniania wniosku. Można to zrobić na jeden z czterech sposobów: klikając łącze przesłane na adres w domenie; umieszczając na stronie plik html otrzymany od centrum; umieszczając na stronie (w sekcji ) fragment tekstu przesłany
przez centrum; tworząc w zasobach DNS rekord TXT o treści przesłanej przez centrum.
Pozytywna weryfikacja powoduje automatyczne wydanie certyfikatu — w e-mailu otrzymamy potwierdzenie zakończenia procedury oraz łącze do strony, na której możemy zapisać certyfikat w postaci binarnej lub cyfrowej oraz zainstalować go online. Rysunek 4.3. Przykładowe żądanie certyfikatu SSL
Na koniec pozostaje jedynie zainstalowanie naszego certyfikatu. Stosowne instrukcje dotyczące dalszego postępowania podane są we wspomnianych wcześniej plikach pdf. Zgodnie z nimi instalujemy certyfikaty i uaktywniamy tryb szyfrowania. Po ponownym uruchomieniu serwer będzie już gotowy do przesyłania danych w trybie zabezpieczonym TLS. Po nawiązaniu takiego połączenia widoczna będzie zmiana nazwy protokołu z HTTP na HTTPS. Ponadto przed adresem strony w pasku adresu pojawi się
160
Podstawy kryptografii
ikona kłódki (patrz rysunek 4.4). W zależności od przeglądarki ikona kłódki może być również wyświetlana po prawej stronie paska lub w prawym dolnym rogu okna przeglądarki. Rysunek 4.4. Ikona kłódki potwierdza nawiązanie połączenia w trybie szyfrowanym
Wersje testowe wydawanego certyfikatu ważne są przez 30 dni. Po tym okresie wygasają i niemożliwe jest ich odnowienie. Aby zapewnić sobie stałe bezpieczeństwo połączeń z naszym serwerem, należy wykupić pełną wersję certyfikatu. W takim przypadku oprócz wniosku o wydanie certyfikatu dostarczyć należy dokumenty poświadczające uiszczenie odpowiedniej opłaty oraz prawo do posługiwania się adresem internetowym podanym we wniosku. Podany adres e-mail będzie wykorzystywany do kontaktów z centrum certyfikacji. Należy pamiętać o dobrym zabezpieczeniu wygenerowanego klucza prywatnego, a także o tym, by w razie jego utraty bądź kompromitacji jak najszybciej unieważnić certyfikat.
4.2.1.6. Sprawdzanie certyfikatu Wiemy już, jak sprawdzić, czy połączenie ze stroną przebiega w trybie szyfrowanym. A jak uzyskać bardziej szczegółowe informacje o certyfikacie? Zwykle podczas nawiązywania połączenia zabezpieczonego system nie wyświetla żadnych danych na jego temat. Wyjątkiem jest sytuacja, kiedy certyfikat budzi zastrzeżenia. W takiej sytuacji wyświetlone zostaną informacje na temat znalezionych „niedociągnięć” wraz z zapytaniem, czy mimo to chcemy danemu certyfikatowi zaufać. Niekoniecznie musi to oznaczać, że z certyfikatem jest coś nie w porządku i połączenie nie będzie bezpieczne. Wina może równie dobrze leżeć po stronie przeglądarki. Wyjaśnię, jak sprawdzić, czy certyfikat jest „w porządku”. Dane dotyczące wybranego certyfikatu wyświetlić można przy użyciu przeglądarki internetowej. W tym celu w przeglądarce Firefox wybieramy polecenie Opcje z menu Narzędzia, a następnie zakładkę Szyfrowanie w sekcji Zaawansowane i klikamy przycisk Wyświetl certyfikaty. Na wyświetlonej liście klikamy dwukrotnie nazwę certyfikatu, którego dane chcemy obejrzeć. Aby wyświetlić tę samą listę w przeglądarce Internet Explorer, musimy wybrać polecenie Opcje internetowe z menu Narzędzia, aktywować zakładkę Zawartość i kliknąć przycisk Certyfikaty. Analogiczną operację w przeglądarce Netscape Navigator 9.x przeprowadzamy, wybierając polecenie Options z menu Tools i aktywując zakładkę Advanced. W wyświetlonym oknie klikamy zakładkę Encryption i naciskamy przycisk View Certificates. Dane dotyczące wskazanego certyfikatu wyświetlone zostaną w oknie podobnym do tego z rysunku 4.5. Możemy teraz sprawdzić, jakie centrum certyfikacji wystawiło dany certyfikat, jakiemu adresowi internetowemu jest on przypisany i kiedy upływa jego termin ważności. Wybierając zakładkę Szczegóły, można uzyskać dokładne informacje na temat struktury certyfikatu (patrz rysunek 4.6).
Rozdział 4. Kryptografia w praktyce Rysunek 4.5. Dane certyfikatu w przeglądarce internetowej
Rysunek 4.6. Szczegóły certyfikatu w przeglądarce internetowej
161
162
Podstawy kryptografii
Szczególnie istotna jest dostępna w obu zakładkach sekcja Ważność, w której możemy sprawdzić, do kiedy ważny jest certyfikat. Jak nietrudno się domyślić, data Nieważny po powinna wskazywać na termin w możliwie odległej przyszłości. Jeśli tak jest, możemy uznać certyfikat za aktualny, nawet jeśli przeglądarka zgłasza zastrzeżenia. Dla pewności warto też sprawdzić odcisk palca certyfikatu oraz ścieżkę (hierarchię) certyfikacji — ich poprawna wartość często podawana jest (a przynajmniej powinna być) na stronie instytucji, z którą nawiązujemy szyfrowane połączenia (np. banku). Jeśli ścieżka i odcisk palca się zgadzają, możemy zaufać certyfikatowi. Dla pełnej ścisłości warto dodać, że od kilku lat odcisków generowanych z wykorzystaniem funkcji MD5 nie można uznać za bezpieczne — w 2008 roku grupa kryptoanalityków sfałszowała odcisk MD5, tym samym podrabiając certyfikat potrzebny do kryptograficznego uwierzytelnienia strony WWW. Na szczęście w danych certyfikatu podawany jest również odcisk palca generowany za pomocą wciąż bezpiecznego algorytmu SHA.
4.2.1.7. Biblioteka OpenSSL Innym sposobem wykorzystania protokołu SSL jest implementacja powszechnie dostępnej biblioteki OpenSSL. Można ją pobrać ze strony http://www.openssl.org. Biblioteka zawiera implementacje obu wersji SSL — przestarzałej v2 oraz v3 — a także TLS v1. Pozwala ona również na obsługę certyfikatów oraz podpisów cyfrowych. Dodatkowo zawiera implementacje następujących algorytmów: RSA — do szyfrowania asymetrycznego; AES, Blowfish, CAST, DES, IDEA, RC2, RC4, RC5 — do szyfrowania
symetrycznego; HMAC, MD5, SHA — w charakterze funkcji skrótu.
Dzięki temu możliwe jest stosowanie OpenSSL do tworzenia własnych programów szyfrujących. To zagadnienie wykracza jednak poza ramy tego rozdziału. Bibliotekę OpenSSL wykorzystywano również między innymi w OpenPGP, S/MIME, a także w opisanym w następnym rozdziale protokole SSH. Warto tu wspomnieć, że MD5, RC2, RC4, IDEA i DES są uznawane za przestarzałe.
4.2.2. Protokół SSH Protokół SSH (skrót od ang. Secure Shell — bezpieczna powłoka) jest protokołem sieciowym zaprojektowanym z myślą o zabezpieczaniu połączeń w systemach komputerowych typu klient-serwer. Służy on do logowania się oraz wykonywania poleceń na zdalnych komputerach. W odróżnieniu od programów takich jak Telnet SSH pozwala dodatkowo na kryptograficzne zabezpieczenie połączenia oraz przeprowadzanie uwierzytelniania zarówno serwera, jak i klienta. SSH jest więc kryptograficznie wzmocnioną wersją RSH (skrót od ang. Remote Shell). Autorem pierwszych wersji SSH był Tatu Ylonen z uniwersytetu w Helsinkach. Dalszy rozwój protokołu odbywał się w ramach grupy Sechs należącej do IETF (Internet Engi-
Rozdział 4. Kryptografia w praktyce
163
neering Task Force). Aktualnie SSH to już cała rodzina protokołów, a jego najbardziej znane implementacje to ssh.com i OpenSSH. Zasadniczo można wyróżnić dwie wersje — SSH1 i SSH2. SSH zapewnia elementarne bezpieczeństwo podczas przesyłania informacji pomiędzy komputerami dzięki szyfrowaniu haseł oraz danych. Zapewnia również ochronę przed bardziej wyrafinowanymi formami ataku, takimi jak IP Spoofing czy DNS Spoofing. SSH dzieli się na trzy podprotokoły: Protokół warstwy transportowej — obejmuje poufność danych i ich integralność,
uwierzytelnianie serwera oraz tzw. poufność przekazywaną, czyli gwarancję, że złamanie aktualnie wykorzystywanego klucza nie zagrozi bezpieczeństwu wcześniejszych sesji. Protokół połączenia — multipleksowanie wielu kanałów komunikacji w jedno
połączenie SSH. Protokół uwierzytelniania użytkownika — uwierzytelnianie użytkownika
wobec serwera. Bardzo ważną zaletą protokołu SSH jest też możliwość tunelowania połączenia, znanego też jako forwardowanie portów. W skrócie technika ta polega na konwersji dowolnego niezabezpieczonego połączenia na połączenie szyfrowane. Odbywa się to w bardzo prosty sposób — zarówno w komputerze klienckim, jak i serwerze encje niezabezpieczonego protokołu (np. TCP) zastępowane są encjami SSH poprzez zmianę numerów portów, na których odbywa się komunikacja. Jest to operacja całkowicie transparentna z punktu widzenia użytkownika.
4.2.2.1. Sesja SSH Proces nawiązywania połączenia z serwerem SSH przebiega w czterech etapach: uwierzytelnianie serwera, ustanawianie bezpiecznego połączenia, uwierzytelnianie klienta, logowanie klienta na serwerze.
Ewentualny błąd lub niezgodność na którymkolwiek z etapów powodują zerwanie połączenia przez serwer. Jeśli wszystko przebiegnie zgodnie z założeniami, połączenie zostaje nawiązane i klient może rozpocząć pracę na serwerze. Spoofing (od ang. spoof — oszukiwać, naciągać) — technika polegająca na podszywaniu się pod inny komputer poprzez fałszowanie numeru IP lub przypisywanej mu przez serwer DNS nazwy. W pierwszym przypadku atakujący najpierw zdobywa numer IP komputera, pod który chce się podszyć, a następnie zmienia nagłówki przesyłanych pakietów tak, aby zawierały ten numer. W drugim przypadku atakowany jest serwer przypisujący nazwę danemu adresowi IP.
164
Podstawy kryptografii
4.2.2.1.1. Uwierzytelnianie serwera Po nawiązaniu połączenia serwer przesyła użytkownikowi parę swoich kluczy publicznych — serwera i komputera. Para kluczy serwera jest generowana co godzinę z zastosowaniem stosowanego w danej implementacji algorytmu (RSA/DSA). Dzięki temu jeśli atakujący wejdzie w posiadanie obydwu kluczy, będzie mógł odczytać jedynie wiadomości wymieniane z serwerem w trakcie jednej godziny. Klucz prywatny przechowywany jest cały czas w pamięci operacyjnej komputera i nie jest zapisywany na dysku. Klucze komputera są również tworzone z użyciem bezpiecznego algorytmu wymiany klucza i służą do uwierzytelniania serwera. Klient porównuje otrzymany klucz komputera z kluczem umieszczonym w bazie w celu potwierdzenia autentyczności serwera. Oczywiście podczas pierwszego połączenia z danym serwerem klucza nie będzie jeszcze w bazie klienta. W takim wypadku użytkownik musi zdecydować, czy akceptuje pobrany klucz jako należący do serwera. Jeśli tak, klucz zostanie przypisany do danego serwera i wprowadzony do bazy. Nie trzeba chyba dodawać, że przed potwierdzeniem swojego zaufania do klucza należy się upewnić co do jego autentyczności.
4.2.2.1.2. Ustanawianie bezpiecznego połączenia Po potwierdzeniu autentyczności kluczy klient generuje liczbę losową, a następnie szyfruje ją otrzymanymi kluczami. Wynik całej operacji przesyłany jest do serwera i używany później w charakterze klucza sesji. Następnie wybrany zostaje algorytm szyfrowania stosowany do ochrony przesyłanych danych. Dostępne do wyboru algorytmy zależą od obsługiwanej przez serwer wersji protokołu (patrz punkt 4.2.2.2).
4.2.2.1.3. Uwierzytelnianie klienta W kolejnym etapie następuje uwierzytelnianie klienta. Można go dokonać na kilka sposobów: z wykorzystaniem plików identyfikujących klienta, z wykorzystaniem plików identyfikujących klienta oraz jego klucza publicznego, z wykorzystaniem kluczy publicznych klienta, z wykorzystaniem hasła.
Wspomniane pliki identyfikujące są przechowywane w systemie operacyjnym serwera. Zawierają one dane dotyczące klienta (nazwę komputera oraz identyfikator). Dane te są porównywane z danymi komputera nawiązującego połączenie i jeśli weryfikacja wypadnie pozytywnie, uwierzytelnianie dobiega końca bez konieczności podawania hasła. Jak łatwo się domyślić, nie jest to specjalnie bezpieczna metoda, dlatego też w większości przypadków nie jest ona obsługiwana. W drugim przypadku klient wysyła dodatkowo swój klucz publiczny. Podobnie jak podczas uwierzytelniania serwera klucz ten porównywany jest z kluczem przypisanym do danego komputera (z tym że tutaj porównania dokonuje serwer w oparciu o posiadaną bazę kluczy). Jeśli zgadzają się zarówno klucze, jak i dane w plikach identyfikacyjnych, procedura zostaje zakończona pomyślnie.
Rozdział 4. Kryptografia w praktyce
165
Kolejną możliwością jest stosowanie kluczy konkretnych użytkowników. Użytkownik przesyła do serwera swój klucz publiczny, w odpowiedzi otrzymując liczbę losową zaszyfrowaną tym kluczem. Odszyfrowuje ją kluczem prywatnym i odsyła do serwera, dokonując tym samym uwierzytelnienia. Tu również nie jest konieczne podawanie hasła. Ostatnia metoda opiera się na znajomości tajnego hasła przyporządkowanego do danego użytkownika. Hasło jest przesyłane w połączeniu zaszyfrowanym. Najczęściej stosowana jest metoda druga. Pierwsza z metod jest co prawda obsługiwana, jednak jej stosowanie w praktyce wiąże się ze sporym ryzykiem. Uwierzytelnianie za pomocą hasła jest natomiast stosowane w momencie, kiedy niemożliwe jest użycie innych metod. Po pomyślnym zakończeniu uwierzytelniania użytkownik zostaje zalogowany na serwerze.
4.2.2.2. Algorytmy wykorzystywane w SSH Po zalogowaniu na serwerze przesyłane dane szyfrowane są z użyciem wcześniej ustalonego klucza sesji i wybranego przez klienta algorytmu. Istnieje kilka możliwości, są one jednak zależne od wersji protokołu i jego implementacji. Na przykład algorytm Twofish nie jest dostępny w OpenSSH, który obsługuje z kolei niedostępny w innych wersjach algorytm CAST-128. Inne występujące w poszczególnych implementacjach i wersjach algorytmy to AES, 3DES, IDEA, Blowfish i RC4. Pierwotnie wszystkie algorytmy działały w trybie CBC, ale w związku ze skutecznym atakiem na SSH2 wykorzystującym ten element implementacji w OpenSSH 5.2 zmieniono tryb na CTR.
4.2.2.3. SSH1 a SSH2 Różnice między protokołami SSH1 i SSH2 nie sprowadzają się jedynie do obsługiwanych algorytmów szyfrowania. SSH2 wykorzystuje algorytm HMAC do zapewnienia integralności danych. Dostępne wersje zależne są od implementacji, ale najczęściej występujące to: HMAC — SHA1, HMAC — MD5, HMAC — SHA1-96, HMAC — MD5-96, HMAC — SHA2-256 (16-bajtowy klucz), HMAC — SHA2-256-2 (32-bajtowy klucz), HMAC — SHA2-384, HMAC — SHA2-512.
Dodatkowo SSH2 wykorzystuje standard DSS w celu uwierzytelniania użytkownika. Na serwerze znajduje się tylko jeden klucz identyfikujący komputer, natomiast klucze tymczasowe serwera nie są generowane. Podczas ustalania klucza sesji wykorzystywany jest protokół Diffiego-Hellmana.
166
Podstawy kryptografii
4.2.2.4. PuTTY PuTTY jest klientem protokołów SSH, Telnet oraz Rlogin. Jego autorem jest Simon Tatham. PuTTY umożliwia przeprowadzenie kryptograficznie zabezpieczonej sesji z użyciem SHH1 oraz SSH2 (od wersji 5.0). Pozwala również na zapisywanie danych połączeń, co znacznie ułatwia ponowne ich nawiązywanie. Jego użytkowanie jest bezpłatne, również w zastosowaniach komercyjnych. Najnowszą wersję programu (0.63) można pobrać ze strony http://www.chiark.greenend. org.uk/~sgtatham/putty/. Znajdują się tam wersje PuTTY oraz programów pokrewnych dla wszystkich platform Windows wraz z sumami MD5, SHA1 i SHA256 i SHA512 potwierdzającymi autentyczność plików. Wspomniane programy pokrewne to: PuTTYtel — wersja programu nieobsługująca protokołu SSH, a jedynie
protokoły Telnet oraz Rlogin. Projektowana była z myślą o krajach, gdzie stosowanie kryptografii jest prawnie zabronione. Plink (PuTTY link) — program umożliwiający nawiązywanie połączeń w trybie
wiersza poleceń (konsolowym). Aby go uruchomić, należy z Menu start/Programy/Akcesoria (lub Menu start/Programy w Windows 98) wybrać Wiersz poleceń (Tryb MS-DOS w Windows 98), wejść do odpowiedniego katalogu i wpisać plink. Pojawi się komunikat dotyczący używanej wersji programu oraz dostępnych opcji, po czym będzie można rozpocząć używanie Plink. PSCP — klient scp. Scp (skrót od ang. Secure copy) jest kryptograficznie chronionym odpowiednikiem programu rcp (skrót od ang. Remote copy).
Jest zaimplementowany w obu wersjach SSH i umożliwia kopiowanie plików w trybie wiersza poleceń. PSFTP — program umożliwiający kryptograficznie zabezpieczoną transmisję
plików w protokole ftp (klient SFTP). Możliwość taka istnieje jednak tylko w ramach protokołu SSH2. Podobnie jak Plink oraz PSCP program ten działa w trybie konsoli. Pageant — program obsługujący klucze SSH w ramach PuTTY, PSCP oraz
Plink. Po uruchomieniu jego ikona pojawia się na pasku zadań, umożliwiając dodawanie nowych kluczy (Add Key) użytkownika oraz przeglądanie już istniejących (View Keys). PuTTYgen — program pozwalający na generowanie par kluczy użytkownika.
Po jego uruchomieniu ukaże się okno pokazane na rysunku 4.7. Na samym dole okna można zaznaczyć odpowiednią opcję i w ten sposób wybrać rodzaj generowanego klucza (SSH1, SSH2 — RSA lub SSH2 — DSA). W polu poniżej wpisujemy długość klucza, po czym naciskamy przycisk Generate. Teraz trzeba dostarczyć dane losowe dla generatora, przesuwając kursor w obrębie pustego obszaru okna programu (widoczny będzie pasek postępu odzwierciedlający pozostałą do wygenerowania ilość danych). Po wygenerowaniu kluczy ukaże się kolejne okno (patrz rysunek 4.8).
Rozdział 4. Kryptografia w praktyce
167
Rysunek 4.7. Program PuTTYgen
Rysunek 4.8. PuTTYgen po wygenerowaniu pary kluczy
W ramce na samej górze znajduje się nasz klucz publiczny, niżej zaś jego odcisk palca (Key fingerprint) oraz komentarz (Key comment) opisujący typ klucza i datę jego wygenerowania. Poniżej należy wpisać hasło chroniące klucz prywatny (Key passphrase) oraz jego potwierdzenie (Confirm passphrase). Klucz będzie chroniony przy użyciu hasła oraz algorytmu AES. Hasło wymagane jest również podczas dodawania klucza w programie Pageant. I wreszcie dochodzimy do samego PuTTY. Rysunek 4.9 przedstawia główne okno programu.
168
Podstawy kryptografii
Rysunek 4.9. Program PuTTY
Na górze po prawej stronie wpisujemy nazwę hosta, z którym chcemy się połączyć (lub jego numer IP). Poniżej wybieramy tryb połączenia. Możliwości są cztery: RAW — połączenie „surowe” (niemodyfikowane). Pozwala ono na transfer
plików bez ingerencji ze strony oprogramowania i sprzętu. Telnet — transfer plików z wykorzystaniem protokołu Telnet. Rlogin — transfer plików przy użyciu polecenia Rlogin. SSH — transfer plików z użyciem protokołu SSH.
Nas interesuje oczywiście ta ostatnia opcja. Po jej zaznaczeniu i ewentualnym zapisaniu parametrów sesji naciskamy przycisk Open. Jeśli jest to pierwsze połączenie z danym serwerem, wyświetlony zostanie komunikat podobny do tego na rysunku 4.10. Rysunek 4.10. Pierwsze połączenie z serwerem
Program ostrzega, iż klucz wykorzystywany przez serwer nie znajduje się jeszcze w rejestrze, w związku z czym nie możemy mieć pewności, iż faktycznie połączyliśmy się z właściwym komputerem. Podany jest tu odcisk palca pobranego klucza, a do nas należy decyzja, czy chcemy mu zaufać. Jeśli odpowiemy „tak”, klucz zostanie zapisany w rejestrze kluczy. Wybranie odpowiedzi negatywnej oznacza jednokrotne nawiązanie połączenia przy użyciu danego klucza (nie zostanie on zapisany w rejestrze). Przycisk Anuluj zrywa połączenie z serwerem.
Rozdział 4. Kryptografia w praktyce
169
Po zaakceptowaniu klucza program przechodzi do emulacji terminalu konsolowego, w którym wpisujemy login oraz hasło używane do nawiązywania połączenia z serwerem. Opcje znajdujące się po lewej stronie głównego okna programu służą do konfigurowania dodatkowych ustawień połączenia. Nie ma sensu omawiać ich wszystkich po kolei, tym bardziej że konkretne parametry połączenia zależą od konkretnego serwera oraz ustawień konfiguracji SSH zastosowanej przez administratora. Z reguły na serwerze znajdują się informacje dotyczące koniecznych do nawiązania połączenia ustawień klienta SSH. Forwardowanie portów PuTTY jest również banalnie proste. W celu utworzenia tunelu z menu po lewej stronie wybieramy zakładkę Tunnels (w sekcji SSH). Wyświetlone zostanie okno przedstawione na rysunku 4.11. Rysunek 4.11. Tunelowanie portów w PuTTY
W polu Source port podajemy adres portu na komputerze lokalnym, a w polu Destination — adres serwera i numer portu oddzielone dwukropkiem. Po kliknięciu przycisku Add połączenie zostanie dodane na listę w polu Forwarded ports. Następnie wystarczy zaznaczyć tak zdefiniowane połączenie na wspomnianej liście i kliknąć przycisk Open. Zostaniemy poproszeni o potwierdzenie bezpieczeństwa klucza serwera i dalsza komunikacja odbywać się będzie w standardowy sposób.
4.3. Symantec Encryption Desktop Pakiet Symantec Encryption Desktop to nowa nazwa pakietu PGP rozwijanego i dystrybuowanego przez firmę Symantec. Pakiet pozwala na utworzenie własnej pary kluczy szyfrujących, podpisywanie wiadomości, ochronę poczty elektronicznej, szyfrowanie plików, katalogów i dysków oraz tworzenie szyfrowanych dysków wirtualnych. Funkcje te są zintegrowane z systemem certyfikatów i wykorzystują podpisy elektroniczne. Od wersji 10 program jest dostępny wyłącznie w wersji płatnej. Opis
170
Podstawy kryptografii
poprzednich, bezpłatnych wersji programu znaleźć można w dostępnych do pobrania materiałach dodatkowych. W tym rozdziale skupię się na opcjach i rozwiązaniach dostępnych dla użytkowników wersji indywidualnej programu — w przypadku wersji korporacyjnej istnieje szereg dodatkowych rozwiązań związanych z wykorzystaniem centralnego serwera zarządzającego Symantec Encryption Management Server, które wykraczają znacznie poza ramy tej książki. Po zainstalowaniu i uruchomieniu programu w pierwszej kolejności będziemy musieli wygenerować naszą parę kluczy szyfrujących. W tym celu uruchomiony zostanie specjalny kreator (patrz rysunek 4.12).
Rysunek 4.12. Kreator tworzenia kluczy w Symantec Encryption Desktop
Po zapoznaniu się z podstawowymi informacjami klikamy przycisk Next i w kolejnym oknie podajemy swoją nazwę użytkownika oraz adres e-mail, który będziemy wykorzystywać do prowadzenia zaszyfrowanej korespondencji. Klikając przycisk More, możemy skonfigurować zaawansowane ustawienia (patrz rysunek 4.13). Możemy tu wybrać typ kluczy (RSA, Diffie-Hellman/DSS), ich rozmiar (liczba z zakresu od 1024 do 4096 określana osobno dla każdego z kluczy), datę wygaśnięcia (Expiration), wykorzystywane algorytmy szyfrowania (Ciphers) i tworzenia skrótu (Hashes) oraz algorytm kompresji. Po skonfigurowaniu i zatwierdzeniu ewentualnych zmian klikamy przycisk Next. W kolejnym oknie (patrz rysunek 4.14) wpisujemy i potwierdzamy hasło chroniące klucz prywatny. Na dole okna widoczny jest pasek określający jakość podawanego hasła. Po kliknięciu Next klucze zostaną wygenerowane, a na ekranie pojawi się okno potwierdzające zakończenie procedury.
Rozdział 4. Kryptografia w praktyce
171
Rysunek 4.13. Zaawansowane ustawienia generowania kluczy
Rysunek 4.14. Hasło chroniące klucz prywatny
Następnym krokiem jest dodanie klucza publicznego do katalogu globalnego, z którego będzie go mogła pobrać każda osoba zainteresowana prowadzeniem z nami korespondencji. Ten krok możemy też wykonać później, wybierając polecenie Publish to Global Directory z menu Keys. Kolejnym etapem jest konfigurowanie ustawień szyfrowania komunikacji. W pierwszej kolejności decydujemy, czy program ma automatycznie wykryć wykorzystywane na komputerze konta e-mail (Automatically detect my email accounts) oraz czy komunikacja z wykorzystaniem komunikatora AOL Instant Messenger ma być automatycznie
172
Podstawy kryptografii
szyfrowana (Automatically encrypt AOL® Instant Messenger ™ communications). Na koniec pozostaje jeszcze skonfigurowanie ustawień wysyłania wiadomości (Default Outgoing Email Policies). Program oferuje tu dwie podstawowe, domyślne „strategie”: Require Encryption: PGP — jeśli na początku tytułu wiadomości umieścimy znacznik [PGP], program automatycznie postara się odnaleźć zweryfikowany
klucz adresata w katalogu globalnym i prześle zaszyfrowaną wiadomość. E-mail można również oznaczyć jako poufny (szyfrowany), wybierając odpowiednią opcję w programie pocztowym, ale nie każdy klient poczty elektronicznej daje taką możliwość. Jeśli klucz adresata nie zostanie znaleziony, wiadomość nie zostanie wysłana, a na ekranie pojawi się stosowne ostrzeżenie. Opportunistic Encryption — jeśli nie oznaczymy wiadomości znacznikiem [PGP], program mimo wszystko postara się znaleźć zweryfikowany klucz
adresata na serwerze globalnym, ale w tym przypadku jego brak nie zablokuje wysłania wiadomości (zostanie ona nadana bez szyfrowania). Jeśli klucz zostanie znaleziony, szyfrowanie odbędzie się automatycznie. Szczegółowe ustawienia przeanalizować można, klikając przycisk Details (ich konfigurację omówię w podrozdziale „PGP Messaging”). Klikamy przycisk Next i program jest gotowy do uruchomienia. Na pasku szybkiego uruchamiania dostępna będzie od teraz ikona przedstawiająca kłódkę, umożliwiająca szybkie uruchamianie PGP oraz dostęp do najważniejszych opcji. Główne okno programu przedstawia rysunek 4.15.
Rysunek 4.15. Główne okno programu
PGP składa się z sześciu głównych modułów: PGP Keys, PGP Messaging, PGP Zip, PGP Disk, PGP Viewer oraz File Share Encryption.
Rozdział 4. Kryptografia w praktyce
173
4.3.1. PGP Keys PGP Keys służy do tworzenia par kluczy oraz zarządzania nimi. Po wybraniu tego modułu z menu po lewej stronie w prawej części okna wyświetlona zostanie lista dostępnych w programie kluczy (patrz rysunek 4.15). Dodatkowo pole PGP Keys zostanie rozwinięte, udostępniając kilka podstawowych opcji związanych z modułem: All keys — ta opcja jest zaznaczona domyślnie i powoduje wyświetlanie na liście
wszystkich dostępnych lokalnie kluczy. Po wybraniu z menu Keys polecenia New Keyring stworzone zostanie nowe repozytorium o takiej samej nazwie (pojawi się ona pod opcją All Keys). Klikając nową nazwę prawym przyciskiem myszy, możemy tę nazwę zmienić (Rename), usunąć repozytorium (Delete) lub wyświetlić właściwości repozytorium (Properties). My Private Keys — zaznaczenie tej opcji powoduje wyświetlenie wyłącznie
naszych kluczy prywatnych. Lepiej nie tworzyć ich zbyt wielu, gdyż w pewnym momencie mogą zacząć się mylić, a trzeba pamiętać, że w kontekście kryptografii asymetrycznej para kluczy odpowiada dowodowi tożsamości. Jeśli jednak zachodzi konieczność stworzenia nowej pary kluczy, możemy to zrobić, wybierając polecenie New PGP Key z menu File. Uruchomiony zostanie ten sam kreator, który powitał nas po pierwszym uruchomieniu programu. Warto też zadbać o kopię zapasową klucza prywatnego. Najlepiej zapisać ją na osobnym, dobrze strzeżonym nośniku danych. Search for Keys — pozwala na wyszukiwanie kluczy zarówno w lokalnych
repozytoriach, jak i na dostępnych serwerach. Po zaznaczeniu tej opcji w prawej części okna wyświetlona zostanie wyszukiwarka umożliwiająca określenie zakresu wyszukiwania oraz zdefiniowanie licznych filtrów związanych z parametrami klucza, nazwą jego właściciela oraz przypisanym do niego adresem poczty elektronicznej. Email this Key — jak nietrudno się domyślić, to polecenie umożliwia wysłanie
klucza publicznego za pomocą poczty elektronicznej. Po kliknięciu prawym przyciskiem myszy na wybranym kluczu wyświetlone zostanie podręczne menu, dzięki któremu możemy wykonać podstawowe związane z nim operacje — dodać klucz do jednego z utworzonych wcześniej repozytoriów (Add to), wysłać pocztą elektroniczną (Send to), zsynchronizować jego ustawienia z danymi na serwerze PGP (Synchronize), skopiować klucz publiczny z pary kluczy (Copy Public Key), wkleić wcześniej skopiowany klucz (Paste), usunąć klucz z listy (Delete), podpisać klucz innego użytkownika (Sign), tymczasowo wyłączyć (Disable) lub permanentnie unieważnić klucz (Revoke), wyeksportować go do pliku (Export) i wyświetlić jego właściwości (Key Properties). Po kliknięciu ostatniego z wymienionych poleceń wyświetlone zostanie okno przedstawione na rysunku 4.16. Możemy w nim dodać nowy adres e-mail, wygenerować żądanie certyfikatu, zmienić hasło chroniące klucz prywatny, przeanalizować szczegółowe dane klucza, a także zarządzać dodatkowymi podkluczami. Klikając okrągłą ikonę ze znakiem plus widoczną pod rysunkiem kluczy, możemy również dodać nasze zdjęcie, które od tej pory będzie wyświetlane wraz ze szczegółami klucza.
174
Podstawy kryptografii
Rysunek 4.16. Właściwości klucza
W tym samym oknie możemy również przypisać stopień zaufania do analizowanego klucza. W tym celu rozwijamy menu o nazwie Trust i wybieramy jedną z czterech dostępnych opcji: None (brak zaufania), Marginal (zaufanie średnie), Trusted (klucz zaufany), Implicit (zaufanie całkowite — ta opcja zarezerwowana jest dla osobistych kluczy użytkownika). W dolnej części okna możemy również tworzyć dodatkowe podklucze (subkeys), służące do podpisywania i (lub) szyfrowania wiadomości. Jest to narzędzie bardzo przydatne z punktu widzenia bezpieczeństwa, ponieważ daje możliwość tworzenia kluczy o różnych okresach ważności. W ten sposób możemy np. zmieniać klucz szyfrowania co pół roku, dodatkowo utrudniając złamanie zabezpieczeń. Aby dodać nowy podklucz, klikamy przycisk Add w sekcji Subkeys okna właściwości klucza. Określamy jego zastosowanie (szyfrowanie, podpisywanie lub szyfrowanie i podpisywanie), rozmiar, datę, od której będzie wykorzystywany, oraz datę wygaśnięcia, po czym klikamy przycisk OK. Po podaniu hasła chroniącego klucz prywatny nowy klucz zostanie dodany do listy w sekcji Subkeys. Aby obejrzeć szczegółowe informacje na temat podklucza, wystarczy kliknąć jego nazwę prawym przyciskiem myszy i z wyświetlonego menu wybrać polecenie Subkey Properties. Kolejnym elementem pola właściwości jest lista dodatkowych kluczy deszyfrowania ADK (skrót od ang. Additional Decryption Keys). Jest to rozwiązanie wykorzystywane w ramach pakietów PGP przeznaczonych dla firm i organizacji wykorzystujących centralny serwer PGP, pozwalający na zarządzanie użytkownikami pakietu. Wiadomości zaszyfrowane kluczem posiadającym ADK można odszyfrować również za pomocą wspomnianego dodatkowego klucza, zwykle będącego w posiadaniu osoby odpowiedzialnej za bezpieczeństwo systemu informatycznego.
Rozdział 4. Kryptografia w praktyce
175
Ostatnie pole w omawianym oknie to lista kluczy odwołujących (Revokers). Dzięki takiemu kluczowi możemy unieważnić klucz, do którego straciliśmy dostęp lub zapomnieliśmy hasła. Aby dodać klucz unieważniający, klikamy przycisk Add w sekcji Revokers, wskazujemy na liście inny klucz, klikamy przycisk OK i podajemy hasło do klucza, do którego dodajemy klucz odwołujący. Bardzo istotna jest również opcja podpisywania klucza, ponieważ pozwala ona uwierzytelniać innych użytkowników w ramach sieci zaufania PGP (patrz podrozdział 4.3.8). Po wybraniu z podręcznego menu polecenia Sign na ekranie wyświetlone zostanie okno przedstawione na rysunku 4.17. Rysunek 4.17. Podpisywanie klucza
Klikając przycisk More Choices, wyświetlamy dodatkowe opcje, przydatne podczas wykonywania podpisu. W sekcji Expiration możemy określić, kiedy nasz podpis wygaśnie — domyślnie wybrana jest opcja Never (Nigdy), ale jeśli z jakichś względów chcemy ograniczyć czasowo nasze poświadczenie autentyczności klucza, możemy zaznaczyć opcję Date i wskazać datę, kiedy podpis wygaśnie. W sekcji Signature Type do dyspozycji mamy kilka opcji: Non-Exportable — taki podpis nie będzie eksportowany wraz z kluczem.
Z tej opcji korzystamy, gdy chcemy uwierzytelnić klucz wyłącznie lokalnie. Exportable — podpis będzie eksportowany wraz z kluczem. W tym przypadku
po przesłaniu klucza na serwer inni użytkownicy będą go mogli pobrać wraz z naszym podpisem, co zwiększy jego wiarygodność. Meta-Introducer Non-Exportable — po zaznaczeniu tej opcji podpisywany klucz
oraz wszystkie klucze podpisane za jego pomocą, które zostały uwierzytelnione jako Trusted Introducer (patrz niżej), są w pełni zaufane. Ten rodzaj podpisu nie jest eksportowany.
176
Podstawy kryptografii Trusted Introducer Exportable — zaznaczając tę opcję, uwierzytelniamy klucz
i zaświadczamy, że jego właścicielowi można w pełni zaufać przy uwierzytelnianiu innych kluczy. Ten typ podpisu jest automatycznie eksportowany wraz z kluczem i może być ograniczony do określonej domeny (patrz dalej). W ostatnich dwóch kontrolkach okna możemy określić maksymalną głębię zaufania do klucza (Maximum Trust Depth) oraz ograniczenie domeny (Domain restriction). Pierwsza z wymienionych opcji pozwala określić, do ilu poziomów w głąb struktury podpisów widoczny będzie nasz podpis. Przykładowo: jeśli wynosi ona 1, będziemy potwierdzać nasze zaufanie wyłącznie do podpisywanego klucza, a jeśli 2 — również każdego klucza podpisanego z jego wykorzystaniem. Druga opcja jest dostępna wyłącznie po zaznaczeniu opcji Trusted Introducer Exportable. Aby wycofać podpis złożony pod kluczem, należy wyszukać go na liście i rozwinąć szczegółowe informacje, klikając znajdującą się po lewej stronie ikonę plusa. Po zlokalizowaniu naszego podpisu klikamy go prawym przyciskiem myszy i z podręcznego menu wybieramy polecenie Revoke (patrz rysunek 4.18).
Rysunek 4.18. Wycofywanie podpisu pod kluczem
Dzięki poleceniu Export możemy utworzyć zapasową kopię klucza prywatnego. W tym celu w oknie, w którym wybieramy nazwę i ścieżkę dostępu do pliku eksportowanego klucza, zaznaczamy znajdującą się na samym dole opcję Include Private Keys. Nie trzeba chyba dodawać, że dostęp do takiej kopii nie powinien być zbyt łatwy. Jeśli często korzystamy z jakiegoś klucza podczas wykonywanych w programie operacji, możemy dodać go do tzw. listy kluczy głównych (Master Key List). Dzięki temu za każdym razem kiedy podczas szyfrowania lub podpisywania będziemy podawać listę odbiorców (Recipients), ten klucz będzie do niej automatycznie dodawany, oszczędzając nam zachodu związanego z przeciąganiem go do odpowiedniego okienka. Klucz utwo-
Rozdział 4. Kryptografia w praktyce
177
rzony po pierwszym uruchomieniu programu jest domyślnie umieszczany na liście kluczy głównych. Aby dodać do niej nowy klucz, wybieramy polecenie Options z menu Tools, wybieramy zakładkę Master Keys i klikamy przycisk Add. W kolejnym oknie dostępne klucze widoczne będą w polu po lewej stronie. Zaznaczamy odpowiedni klucz lub klucze, klikamy przycisk Add i zatwierdzamy przyciskiem OK. Aby zaimportować otrzymany od innego użytkownika klucz publiczny, wystarczy wybrać polecenie Import z menu File i wskazać plik importowanego klucza. Jeszcze szybszym sposobem jest przeciągnięcie pliku klucza do okna PGP Keys. PGP 10 daje nam również bardzo ciekawą możliwość rekonstruowania utraconego klucza prywatnego. Do tej pory w przypadku utraty takiego klucza jedynym rozwiązaniem było jak najszybsze wycofanie odpowiadającego mu klucza publicznego i stworzenie nowej pary. Teraz możemy się zabezpieczyć na ewentualność utraty sekretnego klucza. W tym celu z menu Keys wybieramy polecenie Create My PGP Questions i podajemy hasło chroniące klucz prywatny. W wyświetlonym oknie wybieramy kolejno pięć pytań oraz przypisane do nich odpowiedzi (aby wpisać własne pytanie, z pierwszego menu wybieramy znajdującą się na samym dole opcję Enter my own question). W przypadku utraty hasła do klucza prywatnego (lub samego klucza) z menu Keys wybieramy polecenie I Lost My Key. Zostaniemy poproszeni o udzielenie odpowiedzi na te same pytania. Jeśli odpowiedzi będą poprawne, program pozwoli nam ustalić nowe hasło dla klucza prywatnego. Po jego wprowadzeniu proces rekonstrukcji klucza zostanie zakończony.
4.3.2. PGP Messaging Moduł PGP Messaging umożliwia kryptograficzne zabezpieczenie komunikacji między serwerem pocztowym a zainstalowanym lokalnie klientem poczty elektronicznej. Wszelkie operacje szyfrowania, deszyfrowania, podpisywania i weryfikowania podpisów są wykonywane automatycznie (o ile tylko dostępne są odpowiednie klucze). Program przeszukuje w tym celu nie tylko lokalne zasoby kluczy, ale również dostępne w sieci serwery. Jeśli więc odszyfrowanie/zweryfikowanie wiadomości okazało się niemożliwe, najlepiej skontaktować się z nadawcą i upewnić się, czy użył właściwego klucza. Innym powodem może być brak potwierdzenia poprawności klucza, dlatego zawsze po otrzymaniu klucza publicznego od innego użytkownika należy zweryfikować odcisk palca klucza i w przypadku weryfikacji pozytywnej złożyć pod nim własny podpis. Każde nowe konto pocztowe zdefiniowane w programie określane jest jako usługa (ang. Service). Dokładny sposób postępowania z odbieranymi i wysyłanymi w ramach usługi wiadomościami określamy, konfigurując tzw. politykę zabezpieczeń (ang. policy). Domyślnie podczas wysyłania wiadomości zaszyfrowanej program szuka klucza odbiorcy na liście dostępnej w programie. Jeśli go tam nie znajdzie, przeszukuje repozytorium globalne. Przy ponownym niepowodzeniu zostanie wysłana niezaszyfrowana wiadomość. Ta domyślna polityka zdefiniowana jest jako tzw. szyfrowanie w miarę możliwości (ang. Opportunistic Encryption) i jest stosowana dla wiadomości, które nie są oznaczone jako poufne (nie mają w temacie znacznika [PGP]). Dodając nową politykę szyfrowania (patrz dalej), należy pamiętać, aby znalazła się ona na liście powyżej
178
Podstawy kryptografii
Opportunistic Encryption, ponieważ podczas obsługi każdej wiadomości program wybiera z listy pierwszy pasujący zestaw ustawień, a „szyfrowanie w miarę możliwości” pasuje do prawie każdej sytuacji (z tego względu umieszczone jest na końcu listy). Przychodzące zaszyfrowane i/lub podpisane wiadomości są uzupełniane o tzw. adnotacje (ang. Annotations). Są to informacje na temat wykonanych operacji deszyfrowania i weryfikowania podpisów. Szczegółowość tych informacji zależy od ustawień w programie. Do dyspozycji mamy trzy ustawienia: Maximum: Verbose Annotation — adnotacja obejmuje wszystkie operacje
wykonane w związku z daną wiadomością. Medium: Failures and Successess — adnotacje dotyczą tylko błędów (np. nieznany
klucz) oraz poprawnie wykonanych operacji. Nie obejmują operacji wykonywanych na załącznikach. Jest to ustawienie domyślne. Minimum: Failures Only — w adnotacji zapisywane są wyłącznie informacje
o błędach. Aby zmienić ustawienia dotyczące adnotacji, w pierwszej kolejności wybieramy polecenie Options z menu Tool i klikamy zakładkę Messaging. W wyświetlonym oknie (patrz rysunek 4.19) zaznaczamy pole Annotate incoming email. Chosee detail level: i wybieramy interesujący nas poziom adnotacji z umieszczonego poniżej rozwijanego menu. Rysunek 4.19. Ustawienia modułu PGP Messaging
Zaznaczając dostępne poniżej pole Add a comment to secured messages:, możemy zdefiniować komentarz automatycznie dodawany do zabezpieczonych wiadomości. Treść komentarza wpisujemy w polu tekstowym widocznym pod wspomnianym polem wyboru.
Rozdział 4. Kryptografia w praktyce
179
Kolejna opcja (Protect sent message copies for IMAP accounts) pozwala zmienić zabezpieczenia wiadomości przesyłanych na serwer pocztowy IMAP (jeśli korzystamy z takiego rozwiązania). Domyślnie każda z nich jest szyfrowana, ale możemy również zdecydować się je dodatkowo podpisywać albo (co nie jest najlepszym pomysłem) wyłącznie podpisywać. Zaznaczenie ostatniej opcji (Enable PGP encrypt and sign buttons In Outlook) dodaje specjalne przyciski do szyfrowania (ikona kłódki) i podpisywania (ikona przedstawiająca pióro) wiadomości w programie MS Outlook (patrz rysunek 4.20). Rysunek 4.20. Przyciski do szyfrowania i podpisywania wiadomości w MS Outlook
W zależności od wersji programu przyciski mogą się pojawiać w różnych miejscach, ale ich funkcja pozostaje ta sama. Po otwarciu modułu PGP Messaging wyświetlone zostanie okno przedstawione na rysunku 4.21.
Rysunek 4.21. Główne okno modułu PGP Messaging
W pierwszej kolejności musimy zdefiniować usługę, czyli parametry wykorzystywanego konta pocztowego. W tym celu uzupełniamy pola Description (Opis usługi), Email Address (Adres e-mail), Incoming Server (Serwer poczty przychodzącej), Outgoing Server (Serwer poczty wychodzącej) oraz Default Key (Domyślny klucz). Pole Encryption Server jest wykorzystywane tylko w środowisku zarządzanym za pomocą centralnego serwera Symantec Encryption Management Server. Jeśli hasło chroniące klucz prywatny ma być zapisywane w pamięci podręcznej po zalogowaniu, zaznaczamy
180
Podstawy kryptografii
pole wyboru Cache this key’s passphrase when I log in. Klikając przycisk Server Settings, możemy skonfigurować zaawansowane ustawienia serwera pocztowego (patrz rysunek 4.22). Rysunek 4.22. Zaawansowane ustawienia serwera pocztowego
Oprócz nazwy serwerów poczty przychodzącej i wychodzącej możemy też określić wykorzystywany protokół, port i ustawienia protokołu SSL/TLS. Korzystanie z SSL/TLS wybieramy tylko wtedy, kiedy mamy pewność, że nasz serwer pocztowy obsługuje ten protokół. Jeśli zaznaczymy tę opcję, a serwer nie daje takiej możliwości, wiadomości nie będą wysyłane ani odbierane. W razie wątpliwości najlepiej pozostawić wybraną domyślną opcję (Automatic). Automatyczna konfiguracja oznacza, że program będzie próbował nawiązać szyfrowane połączenie. Jeśli próba się nie powiedzie, wiadomości zostaną wysłane niezaszyfrowanym kanałem, ale nie wpłynie to na szyfrowanie i podpisywanie dokonywane w samym Symantec Encryption Desktop. Następnie możemy skonfigurować poszczególne polityki dla definiowanej usługi. W tym celu klikamy przycisk Edit Policies. Wypunktowana lista zamieni się w listę pól wyboru, a po prawej stronie okna pojawią się nowe przyciski. Możemy za ich pomocą edytować aktualnie zaznaczoną politykę (Edit Policy), dodać nową (New Policy), usunąć zaznaczoną politykę (Remove Policy), utworzyć jej duplikat (Duplicate Policy), a także przesunąć ją do góry (Move up) lub w dół (Move Down) na liście. Po kliknięciu przycisku Edit Policy wyświetlone zostanie okno podobne do przedstawionego na rysunku 4.23. Możemy w nim zmienić nazwę, pod jaką polityka wyświetlana jest na liście (Description), oraz ustalić, jakie czynności mają zostać wykonane podczas wysyłania wiadomości (Perform the following action on the message) i pod jakimi warunkami (If any/If all/If none of the following conditions are met). Dzięki rozwijanemu menu możemy
Rozdział 4. Kryptografia w praktyce
181
Rysunek 4.23. Konfigurowanie ustawień polityki
uzależnić czynności od spełnienia jednego (If any), wszystkich (If all) lub żadnego (If none) z warunków, które definiujemy za pomocą kontrolek dostępnych poniżej. W ostatniej sekcji (If a recipient’s key is not avalaible) określamy czynności wykonywane w sytuacji, gdy klucz odbiorcy jest niedostępny. Lista możliwych kombinacji oraz związanych z nimi detali technicznych jest bardzo rozbudowana (program pozwala nawet na wykorzystywanie znanych programistom wyrażeń regularnych) i znacznie wykracza poza ramy tej książki. W przypadku problemów lub niejasności najlepiej zajrzeć do dokumentacji programu. Po skonfigurowaniu polityki klikamy przycisk OK, a następnie w głównym oknie programu — przycisk Done. Aby dodać nową usługę, wybieramy polecenie Create New Service z menu Messaging i wykonujemy wszystkie opisane kroki ponownie. Za pomocą tego samego menu możemy ją również usunąć (Delete Service), a także wyłączyć (Disable Service) i ponownie włączyć (Enable Service). W każdej chwili możemy również obejrzeć listę operacji wykonanych do tej pory przez moduł PGP Messaging — są one zapisywane w dzienniku programu, dostępnym po kliknięciu polecenia PGP Log widocznego na liście poleceń modułu.
4.3.3. PGP Zip Moduł PGP Zip pozwala na tworzenie zaszyfrowanych archiwów w formacie ZIP, a także ich odszyfrowywanie i rozpakowywanie. Do szyfrowania wykorzystywany jest algorytm AES256. Aby stworzyć zaszyfrowane archiwum, po rozwinięciu modułu PGP Zip klikamy polecenie New PGP Zip. Wyświetlone zostanie okno przedstawione na rysunku 4.24.
182
Podstawy kryptografii
Rysunek 4.24. PGP Zip
Pliki lub katalogi przeznaczone do spakowania dodajemy, przeciągając je na biały obszar w centralnej części okna lub klikając przyciski Add Directory/Add File umieszczone poniżej. Jeśli zaznaczymy opcję Shred originals (prawy dolny róg okna), oryginalne pliki zostaną bezpiecznie usunięte (patrz podrozdział 4.3.7) po utworzeniu zaszyfrowanych archiwów. Tuż obok przycisków umożliwiających dodawanie i usuwanie plików i katalogów znajduje się przycisk PGP Zip advanced options. Po jego kliknięciu wyświetlone zostanie okno z dodatkowymi opcjami tworzenia archiwum. Wspomniane opcje to: Do not Zip — po zaznaczeniu tej opcji pliki nie zostaną połączone w jedno
spakowane archiwum, ale zaszyfrowane osobno. Convert linefeeds for text files — zaznaczenie tego pola spowoduje utworzenie
archiwum zawierającego wyłącznie pliki tekstowe. Output Text — po zaznaczeniu tej opcji plik zostanie zapisany w formacie
ASCII, co pozwoli na przesłanie go za pomocą niektórych starszych aplikacji pocztowych. Po zaznaczeniu wybranych opcji możemy dodatkowo zapamiętać nasze ustawienia (Remember these settings next time), po czym klikamy przycisk OK, a w głównym oknie tworzenia archiwum — przycisk Dalej. W kolejnym oknie (patrz rysunek 4.25) do wyboru mamy cztery kolejne opcje: Recipient Keys — najbezpieczniejszy wariant tworzenia archiwum. Zakłada
wykorzystanie klucza publicznego adresata, dzięki czemu tylko on będzie mógł odszyfrować plik. Passphrase — w tym wariancie pliki zostaną zaszyfrowane z wykorzystaniem
podanego przez nas hasła i będą mogły zostać odszyfrowane jedynie przez osoby również znające hasło i korzystające z Symantec Encryption Desktop.
Rozdział 4. Kryptografia w praktyce
183
Rysunek 4.25. Opcje szyfrowanego archiwum
PGP Self-Decrypting Archive — po zaznaczeniu tej opcji utworzone zostanie
samorozpakowujące się archiwum, chronione hasłem. Znajomość hasła wystarczy do odpakowania plików — adresat nie musi korzystać z Symantec Encryption Desktop, ale musi pracować w systemie Windows. Po otrzymaniu pliku wystarczy dwukrotnie go kliknąć i podać hasło. Sign Only — w tym przypadku archiwum nie zostanie zaszyfrowane, a jedynie
podpisane. Po otworzeniu go w Symantec Encryption Desktop adresat będzie mógł zweryfikować nas jako nadawcę pliku. Po wybraniu pierwszej z wymienionych opcji w kolejnym oknie zostaniemy poproszeni o wybranie klucza publicznego odbiorcy. Zaznaczamy odpowiednią pozycję na liście i klikamy przycisk Dalej. W następnym oknie określamy katalog, w którym plik ma zostać zapisany. Możemy również podpisać archiwum, wybierając nasz klucz prywatny z menu Signing Key. W takim wypadku konieczne będzie również podanie chroniącego go hasła. Jeśli podawaliśmy wcześniej hasło chroniące klucz, zostanie ono zapisane w pamięci cache, dzięki czemu nie będziemy musieli wpisywać go, tworząc kolejne archiwa w tej sesji programu. Jeśli nie chcemy, by program zapamiętywał hasło, możemy zmienić odpowiednie ustawienia, wybierając polecenie Options z menu Tools. W zakładce General wyświetlonego okna, w sekcji My Passphrase, oprócz domyślnej opcji zapisywania hasła na czas sesji mamy możliwość ustalenia czasu, przez jaki hasło jest pamiętane (Save my passphrase for), lub wyłączenia możliwości zapisywania hasła w pamięci cache (Do not save my passphrase). W przypadku szyfrowania z użyciem hasła procedura przebiega podobnie — po wybraniu tej opcji podajemy hasło, opcjonalnie podpisujemy plik i wskazujemy katalog, w którym ma zostać zapisany.
184
Podstawy kryptografii
Jeśli zdecydujemy się na samorozpakowujące się archiwum, również będziemy musieli podać hasło oraz lokalizację dla pliku, ale nie będziemy mieli możliwości złożenia podpisu. Ostatnia opcja pozwala dodatkowo zapisać podpis w formie osobnego pliku. W tym celu w trakcie wybierania klucza prywatnego wykorzystywanego do składania podpisu zaznaczamy dodatkowo pole Save Detached Signature(s). Aby rozpakować zaszyfrowane archiwum, wystarczy dwukrotnie kliknąć jego plik. Po podaniu ewentualnego hasła zawartość archiwum zostanie wyświetlona w programie Symantec Encryption Desktop (patrz rysunek 4.26).
Rysunek 4.26. Rozpakowywanie zaszyfrowanego archiwum
Następnie zaznaczamy interesujące nas pliki, klikamy je prawym przyciskiem myszy, wybieramy polecenie Extract z wyświetlonego menu podręcznego i wskazujemy katalog, w który mają zostać zapisane. Archiwa PGP Zip możemy również edytować. W tym celu po otwarciu archiwum w programie klikamy przycisk Edit (patrz rysunek 4.26). Możemy teraz zmienić typ szyfrowania (na konwencjonalne lub wykorzystujące kryptografię asymetryczną), klucz wykorzystywany do składania podpisu, a także dodać nowe osoby do listy odbiorców. Możemy też dodać nowe pliki i katalogi do archiwum, przeciągając je na listę aktualnie umieszczonych w nim plików. Aby usunąć plik lub katalog, klikamy go prawym przyciskiem myszy i wybieramy polecenie Delete z podręcznego menu. Zmiany zatwierdzamy, klikając przycisk Save.
Rozdział 4. Kryptografia w praktyce
185
4.3.4. PGP Disk Moduł PGP Disk umożliwia kryptograficzne kontrolowanie dostępu do dysków lub ich wybranych obszarów. Pozwala na szyfrowanie całych obszarów dyskowych, przyznawanie praw dostępu do nich poszczególnym użytkownikom, wykonywanie kopii zapasowych dla wyszczególnionych danych itp. Po aktywowaniu modułu do dyspozycji dostajemy trzy podstawowe narzędzia — New Virtual Disk (do tworzenia dysków wirtualnych), Encrypt Whole Disk or Partition (do szyfrowania dysków i partycji) oraz Shred Free Space (do czyszczenia wolnej przestrzeni dyskowej).
4.3.4.1. Tworzenie dysków wirtualnych Po wybraniu polecenia New Virtual Disk wyświetlone zostanie okno przedstawione na rysunku 4.27.
Rysunek 4.27. Tworzenie dysku wirtualnego
Podajemy nazwę dla dysku oraz katalog, w którym ma zostać zapisany jego plik. Z menu Mount as wybieramy oznaczenie systemowe nowego dysku. Jeśli ma on być automatycznie wpinany przy uruchamianiu systemu, zaznaczamy pole Mount as startup. Kolejna opcja — Unmount when inactive for — pozwala określić, po jakim czasie bezczynności dysk ma zostać wypięty. Możemy również zrezygnować z takiego zabezpieczenia (choć nie jest to najlepszy pomysł), usuwając zaznaczenie tego pola. Z menu Capacity wybieramy opcję określającą rozmiar dysku. W Symantec Encryption Desktop dostępne są trzy rozwiązania: Dynamic (resizable) — rozmiar dysku rośnie, w miarę jak dodawane są do niego
kolejne pliki. Musimy tylko określić maksymalny dopuszczalny rozmiar dysku,
186
Podstawy kryptografii
korzystając z kontrolek umieszczonych na prawo od rozwijanego menu. Ta opcja dostępna jest tylko dla dysków z systemem plików FAT i FAT-32. Expendable — to rozwiązanie identyczne jak poprzednie, ale dostępne
wyłącznie dla dysków z systemem plików NTFS. Jeśli wybierzemy ten system z dostępnego poniżej menu Format, opcja zostanie automatycznie wyświetlona. Fixed size — dysk tego typu ma stały rozmiar, który określamy na etapie jego
tworzenia. W kolejnym menu (Format) wybieramy system plików dla tworzonego dysku, tym samym określając jego minimalny rozmiar — 100 KB dla systemu FAT, 260 MB dla FAT32 i 5 MB dla NTFS (12 MB, jeśli korzystamy z systemu Windows Vista). Korzystając z menu Encryption, określamy wykorzystywany algorytm szyfrowania. Na koniec określamy jeszcze ewentualnych dodatkowych użytkowników, który będą mieli dostęp do dysku — podajemy ich nazwy lub adresy e-mailowe przypisane do kluczy. Po dodaniu użytkownika możemy nadać mu uprawnienia administracyjne lub tylko do odczytu, klikając jego nazwę prawym przyciskiem myszy i wybierając odpowiednią opcję z wyświetlonego menu. Po skonfigurowaniu wszystkich parametrów dysku klikamy przycisk Create, podajemy hasło chroniące nasz klucz prywatny i zatwierdzamy przyciskiem OK. Po utworzeniu dysk zostanie automatycznie wpięty, a jego nazwa pojawi się nad opcjami dostępnymi w module PGP Disk. Jej kliknięcie powoduje wyświetlenie właściwości dysku wirtualnego (patrz rysunek 4.28).
Rysunek 4.28. Właściwości dysku wirtualnego
Rozdział 4. Kryptografia w praktyce
187
W prawym górnym rogu okna znajduje się przycisk pozwalający wpinać i wypinać dysk (Mount/Unmount). Możemy również zmienić ustawienia dotyczące wpinania dysku podczas uruchamiania systemu i dodać nowych użytkowników. Dyski wirtualne możemy wyszukiwać, korzystając z polecenia Scan for PGP Disks z menu File. Aby zlokalizować dysk widoczny w programie, wpinamy go, klikamy jego nazwę prawym przyciskiem myszy i z wyświetlonego menu wybieramy polecenie Show Disk Location In Explorer. W oknie właściwości dysku aktywować możemy dodatkowe opcje przyłączania i odłączania dysków. Zaznaczenie pierwszej z nich (Mount at startup) powoduje automatyczne przyłączanie dysku podczas uruchamiania systemu. Znajdujące się poniżej pole Unmount when inactive for umożliwia nam zmianę domyślnych ustawień dotyczących odłączania dysków. Domyślnie dysk przestaje być dostępny po 15 minutach bezczynności. Możemy ustalić inny okres, po którym ta procedura będzie stosowana (w zakresie od 1 do 999999 minut), bądź też w ogóle zrezygnować z tej opcji. Opcji automatycznego odłączania należy używać z rozwagą. Zapobiegają one wprawdzie nieautoryzowanemu dostępowi do danych w przypadku, kiedy któryś z pracowników przez roztargnienie pozostawi na dłuższy czas komputer bez opieki, z drugiej jednak strony mogą wtedy powodować utratę niezapisanych danych. Kluczowe znaczenie ma tutaj możliwość wymuszanego odłączania dysków. Proponuję na pierwszym miejscu postawić jednak bezpieczeństwo danych i umożliwić wymuszane odłączanie dysków. Ewentualnej utracie danych możemy zapobiec, przeprowadzając wśród pracowników krótkie szkolenie uświadamiające zagrożenia płynące z pozostawiania komputerów bez opieki. Częste zapisywanie zmian w plikach zawartych na wirtualnych dyskach oraz ich manualne odłączanie przed odejściem od komputera w zupełności wystarczy do zapewnienia bezpieczeństwa naszym danym. I ostatnia uwaga — jakkolwiek dyski PGP zapewniają bardzo wysoki stopień zabezpieczenia znajdujących się na nich danych, to same w sobie nie są w żaden sposób zabezpieczane. Innymi słowy, osoba posiadająca swobodny dostęp do komputera nie będzie w stanie odczytać danych z dysku PGP, ale będzie je mogła bez problemu skasować. Z dysku wirtualnego korzystamy w identyczny sposób jak ze zwykłego dysku lub partycji. Po zakończeniu pracy wypinamy dysk, dzięki czemu zawarte na nim dane zostają zaszyfrowane. Wypięcie dysku, na którym nadal znajdują się zmodyfikowane i otwarte pliki, grozi utratą wprowadzonych zmian, warto więc upewnić się wcześniej, czy wszystkie modyfikacje zostały zapisane. W przypadku dysków typu Dynamic możemy zwolnić trochę dodatkowej, niewykorzystywanej pamięci przez kompaktowanie. W tym celu klikamy plik dysku prawym przyciskiem myszy i wybieramy polecenie Symantec Encryption Desktop/Compact unused space. W trakcie korzystania z dysku istnieje również możliwość jego ponownego zaszyfrowania. W tym celu należy wypiąć dysk, kliknąć jego nazwę prawym przyciskiem myszy i z wyświetlonego menu wybrać polecenie Re-encrypt. Po podaniu hasła klikamy przycisk Dalej i w wyświetlonym oknie wybieramy nowy algorytm szyfrowania (zaznaczając
188
Podstawy kryptografii
pole Re-encrypt to the same algorithm, jeśli chcemy skorzystać z tego samego algorytmu). Po kliknięciu przycisku Dalej dysk zostanie ponownie zaszyfrowany. Opcję ponownego szyfrowania możemy zastosować, jeśli podejrzewamy kompromitację dotychczasowego systemu lub jeśli chcemy mieć pewność, że osoba, którą usunęliśmy z listy użytkowników, nie będzie już miała możliwości uzyskania dostępu do dysku. Istnieje bowiem możliwość, iż dany użytkownik, zanim usunięto go z listy uprawnionych, odszukał wygenerowany dla niego przez program klucz szyfrujący i posłuży się nim w celu uzyskania ponownego dostępu. Dyski możemy też wysyłać innym użytkownikom pakietu Symantec Encryption Desktop. Po podaniu hasła będą oni mogli normalnie korzystać z ich zawartości.
4.3.4.2. Szyfrowanie całego dysku lub partycji Symantec Encryption Desktop umożliwia również zaszyfrowanie całego dysku. Dzięki temu jego zawartość będzie dostępna po podaniu wybranego hasła. Podczas wyłączania komputera cała zawartość dysku będzie szyfrowana, chroniąc dane przed niepowołanym dostępem. Jeśli chcemy zabezpieczyć informacje również w trakcie pracy komputera, musimy się posłużyć dyskiem wirtualnym. Przed wykonaniem szyfrowania należy: Upewnić się, że program obsługuje wybrany typ dysku — Symantec Encryption
Desktop obsługuje dyski montowane w laptopach i komputerach stacjonarnych, a także większość dysków zewnętrznych i dyski USB flash. Szczegółowe informacje na temat obsługiwanych typów dysków znaleźć można w dokumentacji programu. Upewnić się, że korzystamy z odpowiedniego układu klawiatury — lista
dopuszczalnych układów znajduje się w dokumentacji. Upewnić się, że na dysku nie ma żadnych uszkodzonych sektorów,
przeprowadzając skanowanie z wykorzystaniem odpowiedniego oprogramowania. Warto również przeprowadzić defragmentację dysku. Wszelkie błędy mogą zakłócić proces szyfrowania. Zapewnić stały dostęp do zasilania. W przypadku laptopów nie będziemy
w stanie przeprowadzić szyfrowania, korzystając wyłącznie z baterii. Warto zastanowić się nad tym, kiedy chcemy wykonać operację szyfrowania.
Jest ona dość obciążająca dla komputera i chociaż można z niego nadal korzystać w trakcie szyfrowania, nastąpi zauważalny spadek szybkości działania aplikacji, a one same negatywnie wpłyną na prędkość wykonywanych przez program operacji. Najlepiej rozpocząć szyfrowanie w momencie, gdy nie musimy wykonywać na komputerze żadnej pracy. W przypadku większej liczby komputerów warto przeprowadzić wcześniej
testowe szyfrowanie dysku na kilku z nich, by upewnić się, że wykorzystywane oprogramowanie jest kompatybilne z Symantec Encryption Desktop. W dokumentacji programu znaleźć można informacje na temat niekompatybilnych aplikacji.
Rozdział 4. Kryptografia w praktyce
189
W celu zwiększenia bezpieczeństwa naszych danych przed rozpoczęciem
szyfrowania warto nagrać płytę pozwalającą na odzyskanie danych w przypadku utraty dostępu do dysku z powodu błędu oprogramowania. Jest to bardzo mało prawdopodobne, ale może się zdarzyć. W tym celu musimy wypalić na płycie CD/DVD obraz o nazwie bootg.iso zapisywany domyślnie w katalogu C:\Program Files\PGP Corporation\PGP Desktop. W przypadku problemów z uruchamianiem dysku należy ponownie uruchomić komputer, umieszczając wcześniej płytę w napędzie CD/DVD. Dysk będzie współpracował wyłącznie z wersją PGP, w której został utworzony. Dostęp do dysku możemy zabezpieczyć na jeden z pięciu sposobów: Hasło podawane podczas uruchamiania systemu. Możemy wybrać osobne hasło
dla szyfrowanego dysku lub zsynchronizować je z mechanizmem logowania do systemu Windows. Para kluczy szyfrowania. W tym przypadku dostęp do dysku będzie miał jedynie
właściciel klucza prywatnego. Ta opcja dostępna jest tylko dla dysków zewnętrznych. Dla dysków wewnętrznych musimy posłużyć się tokenem. Klucz prywatny na tokenie lub karcie inteligentnej. Jeśli chcemy zabezpieczyć
dysk wewnętrzny za pomocą klucza prywatnego, musimy zapisać go na tokenie lub karcie inteligentnej kompatybilnej z Symantec Encryption Desktop. Lista urządzeń kompatybilnych z programem znajduje się w dokumentacji. Ochrona dwupoziomowa z wykorzystaniem hasła i urządzenia USB. W tym
wariancie oprócz hasła użytkownik musi posiadać dostęp do wcześniej wskazanego napędu USB. Podczas uruchamiania systemu musi on być podłączony do komputera. Uwierzytelnianie z wykorzystaniem platformy TPM (Trusted Platform Module)
— opcja jest dostępna, jeśli komputer jest wyposażony we wspomniane rozwiązanie sprzętowe i jest kompatybilny z modułem szyfrowania całych dysków. Lista odpowiednich rozwiązań sprzętowych znajduje się w dokumentacji. Po przygotowaniu dysku otwieramy moduł PGP Disk i klikamy polecenie Encrypt Whole Disk or Partition. Wyświetlone zostanie okno przedstawione na rysunku 4.29. W pierwszej kolejności musimy określić sposób zabezpieczania dostępu do dysku. Aby zdefiniować jedno z zabezpieczeń wykorzystujących hasło, klikamy polecenie New Passphrase User, dostępne w prawym dolnym rogu okna programu. W kolejnym oknie możemy zdecydować, czy chcemy stworzyć nowe hasło (Create New Pasphrase), czy skorzystać z tego, które wpisujemy podczas logowania do systemu (Use Windows Password). Aby skorzystać z ochrony dwupoziomowej, musimy zaznaczyć pierwszą z wymienionych opcji. Po zaznaczeniu interesującego nas rozwiązania klikamy przycisk Next. W kolejnym oknie określamy, czy chcemy ograniczyć zabezpieczenie do hasła (Proceed with passphrase authentication only), czy (jeśli wcześniej zaznaczyliśmy odpowiednią opcję) będziemy korzystać również z urządzenia USB Flash (Generic USB Flash Device). Następnie klikamy przycisk Next, podajemy hasło i zatwierdzamy operację przyciskiem OK, wracając do głównego okna programu.
190
Podstawy kryptografii
Rysunek 4.29. Szyfrowanie dysku lub partycji
Aby zabezpieczyć dysk z wykorzystaniem klucza, klikamy polecenie Add User Key, zaznaczamy odpowiedni klucz na liście, klikamy przycisk Add i zatwierdzamy przyciskiem OK. Jeśli chcemy zaszyfrować tylko pojedynczą partycję, klikamy ikonę ze znakiem plus widoczną obok ikony dysku i zaznaczamy wybraną partycję na wyświetlonej liście. Po prawej stronie listy dostępnych dysków znajduje się opcja Power Failure Safety. Zaznaczenie jej powoduje wykorzystanie metody szyfrowania, która pozwoli na późniejsze wznowienie procesu, gdyby w jego trakcie komputer został pozbawiony zasilania, ale również jest bardziej obciążająca dla procesora. Po skonfigurowaniu wszystkich parametrów klikamy przycisk Encrypt i zatwierdzamy polecenie przyciskiem OK. Szyfrowanie możemy zatrzymać, klikając przycisk Pause, a wznowić za pomocą przycisku Resume. Możliwe jest nawet wyłączenie komputera — szyfrowanie zostanie wznowione po jego ponownym uruchomieniu — nie należy jednak instalować aktualizacji systemu operacyjnego. Jeśli w trakcie szyfrowania program natrafi na błędy na dysku, wyświetli komunikat z pytaniem o dalsze postępowanie. Możemy wymusić kontynuowanie szyfrowania, klikając Yes, lub anulować proces, klikając No. Zaszyfrowanie sektorów z błędami z reguły nie powoduje żadnych negatywnych konsekwencji, jeśli jednak chcemy dmuchać na zimne, możemy usunąć błędy niezależnie i ponownie rozpocząć szyfrowanie. Od momentu zaszyfrowania dysku podczas uruchamiania komputera wyświetlany będzie ekran powitalny przedstawiony na rysunku 4.30. Oprócz funkcji uwierzytelniania użytkownika daje on możliwość wyświetlenia informacji na temat dysków systemowych (Advanced), zmiany układu klawiatury (Keyboard) oraz odzyskiwania hasła (Forgot Passphrase). Po wpisaniu poprawnego hasła system
Rozdział 4. Kryptografia w praktyce
191
Rysunek 4.30. Ekran powitalny PGP Whole Disk Encryption
uruchomi się w normalny sposób. Ostatnia z wymienionych funkcji działa w taki sam sposób jak odzyskiwanie utraconego hasła do klucza — klikamy prawym przyciskiem myszy nazwę użytkownika w module PGP Disk i wybieramy polecenie Add Security Questions. Definiujemy swoje pytania i odpowiedzi, po czym zatwierdzamy zmiany. Od teraz, jeśli w oknie logowania wybierzemy polecenie Forgot Passphrase, będziemy proszeni o udzielenie odpowiedzi na nasze pytania. Jeśli odpowiemy poprawnie na przynajmniej trzy z nich, program pozwoli nam zalogować się do systemu i ustalić nowe hasło. Na koniec kilka dodatkowych uwag. Nie należy modyfikować partycji zaszyfrowanego dysku, gdyż spowoduje to błędy przy następnym logowaniu. Jeśli zachodzi konieczność wprowadzenia takich zmian, trzeba najpierw odszyfrować dysk (korzystając z polecenia Decrypt dostępnego w podręcznym menu po kliknięciu nazwy dysku w module PGP Disk), a dopiero później modyfikować partycje. W każdej chwili możemy również powtórnie zaszyfrować dysk — w tym celu klikamy jego nazwę prawym przyciskiem myszy i z podręcznego menu wybieramy polecenie re-encrypt. Zaszyfrowany dysk USB zawsze należy odpinać, korzystając z opcji bezpiecznego usuwania sprzętu.
4.3.4.3. Czyszczenie wolnej przestrzeni dyskowej Ostatnia z opcji modułu PGP Disk umożliwia czyszczenie wolnej przestrzeni dysków. Należy tu nadmienić, że przestrzeń ta w rzeczywistości zapełniona jest tworzonymi przez system kopiami zapasowymi plików, z których korzystamy. Po zakończeniu pracy są one usuwane, ale w tradycyjny (opisany w rozdziale dotyczącym narzędzia PGP Shredder) sposób, co oznacza, że nadal można je odzyskać. Opcja Shred Free Space umożliwia dokonanie wielokrotnego nadpisania na wybranym obszarze. Po jej wybraniu
192
Podstawy kryptografii
i zapoznaniu się z ogólnymi informacjami dotyczącymi całego procesu naciskamy przycisk Dalej. W kolejnym oknie (patrz rysunek 4.31) wybieramy napęd, którego wolna przestrzeń ma zostać wyczyszczona, oraz liczbę przejść procesu czyszczenia. Liczba ta zależy od stopnia poufności danych. Ogólnie zalecane normy to: 3 przejścia dla potrzeb przeciętnego użytkownika, 10 przejść w zastosowaniach biznesowych (dane klientów banków,
tajne dane przedsiębiorstw), 18 przejść dla danych o znaczeniu militarnym, 26 przejść dla uzyskania maksymalnego bezpieczeństwa.
Rysunek 4.31. Czyszczenie wolnej przestrzeni dyskowej — liczba przejść Przejście oznacza tu jednokrotne zapisanie całej wolnej przestrzeni danego dysku specjalnym wzorem danych. Wzór ten zaprojektowano z myślą o maksymalnym utrudnieniu odzyskiwania nadpisanych danych.
Domyślnie ustawione są 3 przejścia nadpisywania, jednak ich liczbę można zwiększyć nawet do 49 (możliwość tę wprowadzono w związku z rozmaitymi standardami usuwania danych, które muszą spełniać organizacje przetwarzające dane o wysokim stopniu poufności). Po wybraniu dysku i ustaleniu liczby przejść klikamy przycisk Dalej. W kolejnym oknie (patrz rysunek 4.32) można obejrzeć statystykę wybranego dysku i rozpocząć proces czyszczenia wolnej przestrzeni przy użyciu przycisku Begin Shred.
Rozdział 4. Kryptografia w praktyce
193
Rysunek 4.32. Czyszczenie wolnej przestrzeni dyskowej
Ponieważ w przypadku dysków twardych operacja czyszczenia jest wyjątkowo czasochłonna (wyczyszczenie 1 gigabajta może zająć od kilku do kilkunastu minut w zależności od parametrów sprzętu), Symantec Encryption Desktop umożliwia skorelowanie jej z pracą systemu za pomocą harmonogramu zadań. Służy do tego przycisk Schedule. Po jego naciśnięciu i podaniu hasła systemowego przeniesieni zostajemy do kolejnego okna (patrz rysunek 4.33), w którym ustalić można harmonogram czyszczenia wolnej przestrzeni. Rysunek 4.33. Harmonogram czyszczenia wolnej przestrzeni dyskowej
194
Podstawy kryptografii
W rozwijanym menu po lewej stronie dostępnych jest siedem wariantów harmonogramu: Codziennie — czyszczenie będzie się rozpoczynać raz na ustaloną liczbę
dni o określonej przez użytkownika godzinie. Cotygodniowo — czyszczenie w odstępach tygodniowych w ustalonym
przez użytkownika dniu (lub dniach) i o określonej godzinie. Comiesięcznie — czyszczenie odbywa się w odstępach miesięcznych
w wybranym przez użytkownika dniu i o wyznaczonej godzinie. Raz — czyszczenie zostanie przeprowadzone jednokrotnie w wybranym
przez użytkownika terminie. Przy uruchamianiu systemu — czyszczenie rozpocznie się automatycznie
przy uruchomieniu systemu operacyjnego. Przy logowaniu — czyszczenie rozpocznie się po zalogowaniu użytkownika
do systemu. W czasie bezczynności — czyszczenie rozpoczyna się, kiedy system pozostaje
w bezczynności przez określoną przez użytkownika ilość czasu. Możemy tworzyć wiele harmonogramów, korzystając z polecenia w lewym dolnym rogu okna, jak również ustalać bardziej skomplikowane harmonogramy, klikając przycisk Zaawansowane.
4.3.5. PGP Viewer W trakcie normalnego użytkowania Symantec Encryption Desktop pełni rolę pośrednika pomiędzy serwerem a naszym klientem pocztowym. Moduł PGP Viewer daje możliwość odszyfrowywania, weryfikowania i przeglądania poczty w standardowy dla programu sposób, ale poza tym kanałem komunikacji. Przykładowo: wiadomość może być zapisana w formie pliku w celach archiwizacyjnych lub dołączona w formie zaszyfrowanego pliku do „zwykłej” poczty elektronicznej. PGP Viewer współpracuje z następującymi klientami pocztowymi: MS Outlook (Windows), Outlook Express (Windows), Windows Mail (Windows), Mozilla Thunderbird (Windows i Mac OS X), Mail.app (Mac OS X).
Obsługiwane typy plików to: .pgp, .eml, .emlx, .msg. Po kliknięciu nazwy modułu w głównym oknie programu zostanie wyświetlone okno przedstawione na rysunku 4.34.
Rozdział 4. Kryptografia w praktyce
195
Rysunek 4.34. PGP Viewer
Przeciągamy plik wiadomości na specjalnie oznaczone pole (Drag Email or Files Here). Wiadomość zostanie wyświetlona w osobnym oknie (patrz rysunek 4.35). Alternatywnie możemy też skorzystać z widocznej po lewej stronie opcji Open File In PGP Viewer, wskazać lokalizację pliku na dysku i kliknąć przycisk Otwórz. Rysunek 4.35. PGP Viewer — wyświetlanie wiadomości
Korzystając z opcji widocznych u góry okna, możemy: otworzyć kolejną wiadomość (Open Message), skopiować ją do skrzynki odbiorczej naszego programu pocztowego (Copy to Inbox) i wyeksportować do pliku (Export).
196
Podstawy kryptografii
Klikając ikonę zębatki w prawym górnym rogu okna programu, możemy skonfigurować podstawowe ustawienia modułu: Text Encoding — pozwala wybrać kodowanie dla wyświetlanej wiadomości. Show Remote Images — zaznaczenie tej opcji spowoduje wyświetlenie
w aktualnie przeglądanej wiadomości tzw. zewnętrznych zasobów, czyli obrazów, kaskadowych arkuszy stylów (CSS), zawartości ramek iframe itp. View Message Source — po zaznaczeniu tej opcji w oknie wiadomości będzie
również wyświetlana informacja o jej źródle. Preferences — wyświetla okno preferencji, w którym możemy zmienić
dodatkowe ustawienia modułu. Okno preferencji podzielone jest na dwie zakładki — General i Font. W pierwszej z nich możemy określić, czy kopiowanie wiadomości do skrzynki odbiorczej wymaga dodatkowego potwierdzenia (pole Ask user to confirm Copy to Inbox command) oraz czy zewnętrzne zasoby mają być automatycznie wyświetlanie w oknie PGP Viewer (pole Automatically load remote images). Za pomocą umieszczonego na samym dole menu Use email client możemy też wybrać nowego domyślnego klienta poczty. Druga zakładka służy do konfigurowania opcji wyświetlania tekstu, takich jak krój i kolor czcionki lub kolor tła wiadomości.
4.3.6. File Share Encryption Moduł File Share Encryption pozwala na kryptograficznie zabezpieczone współdzielenie plików (np. na serwerze firmowym, w katalogu sieciowym lub na dysku USB). Pliki można normalnie otwierać i edytować w przypisanych do nich aplikacjach, a jedynym warunkiem jest posiadanie dostępu do katalogu (szyfrowanie i deszyfrowanie odbywa się po stronie klienta). Chroniony kryptograficznie katalog można również utworzyć na dysku szyfrowanym. Warto też zaznaczyć, że File Share Encryption nie zapewnia kontroli dostępu do plików w chronionym katalogu — osoby mające do niego dostęp w ramach systemu nadal będą mogły dodawać i usuwać pliki, jednak tylko zdefiniowani za pomocą Symantec Encryption Desktop użytkownicy będą mieli możliwość odczytywania zaszyfrowanej treści. Dzięki temu administrator systemu będzie mógł wykonywać kopie zapasowe plików, nie poznając jednocześnie ich zawartości. Po kliknięciu nazwy modułu wyświetlone zostanie okno przedstawione na rysunku 4.36. Aby utworzyć chroniony katalog, możemy albo przeciągnąć istniejący katalog na biały obszar u góry okna (Drag and Drop Folder Here), albo kliknąć polecenie Add Folder (dostępne na liście poleceń modułu po lewej stronie) i wskazać lokalizację katalogu na dysku. W obu przypadkach wyświetlone zostanie kolejne okno, w którym musimy wskazać użytkowników uprawnionych do korzystania z katalogu. Domyślnie wybrani są użytkownicy kluczy umieszczonych na liście kluczy głównych (Master Keys). Aby dodać kolejnych, klikamy przycisk Add, wybieramy użytkowników z listy po lewej stronie okna i ponownie klikamy przycisk Add (możemy również przeciągać klucze z lewej do prawej kolumny). Po skompletowaniu listy użytkowników zatwierdzamy ją przyciskiem OK. Możemy teraz nadać każdemu z użytkowników jedną z trzech ról:
Rozdział 4. Kryptografia w praktyce
197
Rysunek 4.36. PGP NetShare Administrator — właściciel katalogu z pełnym dostępem do plików i możliwością
modyfikowania uprawnień wszystkich pozostałych użytkowników. Dla każdego katalogu może być tylko jeden administrator. Aby zostać administratorem, twórca katalogu musi dodać się do listy użytkowników i przypisać sobie tę rolę. Administrator nie może zostać pozbawiony uprawnień przez innych użytkowników, może jedynie sam zrezygnować ze swojej roli na rzecz jednego z nich. Administrator grupy — administrator pojedynczego katalogu z pełnym
dostępem do plików i możliwością modyfikowania uprawnień zwykłych użytkowników. Pojedynczy katalog może mieć wielu takich administratorów. Użytkownik — osoba z dostępem do plików w chronionym katalogu,
przyznanym przez jednego z administratorów. Aby nadać użytkownikowi rolę, klikamy jego nazwę prawym przyciskiem myszy i wybieramy rolę z wyświetlonego menu. Następnie klikamy przycisk Dalej i podajemy hasło do klucza prywatnego. Po ponownym naciśnięciu przycisku Dalej katalog zostanie zaszyfrowany, a jego nazwa pojawi się na liście poleceń modułu File Share Encryption. Po jej zaznaczeniu możemy skorzystać z dostępnych poniżej opcji, aby usunąć folder z listy chronionych zasobów (Remove Folder), ponownie go zaszyfrować (Re-encrypt Folder) i obejrzeć informacje na jego temat (Folder Status). Korzystając z przycisków po prawej stronie okna, możemy również dodawać i usuwać użytkowników, a także zmieniać ich role. Aby wyświetlić zawartość katalogu, wystarczy kliknąć przypisaną do niego ścieżkę dostępu, widoczną w górnej części okna. Pliki w chronionym katalogu szyfrowane są za pomocą kluczy publicznych jego użytkowników i podpisywane ich kluczami prywatnymi. Ochroną nie są objęte pliki znajdujące się na tzw. czarnej liście. Obejmuje ona między innymi pliki kluczy i dysków wirtualnych Symantec Encryption Desktop (.skr, .pkr, .pgd), pliki instalacji i ustawień programu oraz pliki oznaczone jako systemowe. Dodanie tego rodzaju pliku do chronionego katalogu spowoduje wyświetlenie ostrzeżenia podczas szyfrowania, a sam plik zostanie
198
Podstawy kryptografii
w jego trakcie pominięty. W przypadku programu zarządzanego z wykorzystaniem serwera Encryption Management Server katalogi i pliki mogą również zostać dodane do czarnej listy przez administratora. Program posiada również białą listę — umieszczone na niej pliki i katalogi są zawsze dodawane do zasobów chronionych przez File Share Encryption. Pliki do zaszyfrowania można również wybierać na podstawie obsługującej je aplikacji. Przykładowo: możemy zdecydować, że pliki MS Word lub MS Excel są zawsze zaszyfrowane niezależnie od tego, gdzie zostały zapisane (dotyczy to również plików tymczasowych programu). File Share Encryption daje też możliwość wskazania plików, które nie są automatycznie deszyfrowane i pozostają zabezpieczone nawet podczas czytania ich zawartości. Program szyfruje wszystkie pliki umieszczane w katalogu oznaczonym jako chroniony, ale mamy również możliwość zabezpieczania pojedynczych, zapisanych osobno plików. W tym celu z menu Tools wybieramy polecenie Options, w wyświetlonym oknie wybieramy zakładkę File Share i zaznaczamy pole Protect Individual Files. Od tej chwili po kliknięciu pojedynczego pliku prawym przyciskiem myszy w podmenu File Share Encryption dostępna będzie opcja Encrypt „nazwa_pliku” with Symantec File Share. Po kliknięciu zaszyfrowanego pliku prawym przyciskiem myszy i wybraniu polecenia Właściwości z podręcznego menu w wyświetlonym oknie właściwości pliku dostępna będzie dodatkowa zakładka File Share Encryption, w której możemy odblokować dostęp do pliku (Unlock) i dodawać nowe osoby do listy jego użytkowników (Edit). Warto wspomnieć, że tak chronione pliki nie pojawiają się w obszarze roboczym File Share Encryption. Dodatkowo niektóre aplikacje zapisują zmodyfikowane pliki w sposób, który powoduje utratę ochrony (przez moduł File Share Encryption są one traktowane jak skasowane). Krótko mówiąc, do ochrony zasobów najlepiej wykorzystać mechanizm chronionych katalogów, a opcję szyfrowania indywidualnych plików stosować w ostateczności. Jeśli chcemy zmienić lokalizację katalogu, najbezpieczniejszym sposobem jest utworzenie nowego, chronionego katalogu w pożądanym miejscu, a następnie skopiowanie do niego zawartości starego katalogu. Przenoszenie katalogu może bowiem spowodować utratę ochrony w ramach File Share Encryption. Po utworzeniu nowego katalogu nie musimy od nowa tworzyć listy użytkowników i przypisywać im ról. W zamian wystarczy zaznaczyć nazwę katalogu i wybrać polecenie Import Access List (dostępne w sekcji User Access), wskazać katalog, z którego chcemy importować listę, a po potwierdzeniu wyboru wybrać klucz prywatny, który zostanie wykorzystany do podpisania plików podczas ich ponownego szyfrowania. Po podaniu hasła do klucza i kliknięciu przycisku Dalej lista użytkowników zostanie zaimportowana.
4.3.7. PGP Shredder Narzędzie PGP Shredder służy do bezpiecznego usuwania plików. Podobnie jak w przypadku narzędzia Shred Free Space program nadpisuje wolną przestrzeń powstałą w wyniku usunięcia pliku specjalnym wzorem, który uniemożliwia późniejsze odzyskanie wcześniej zapisanych tam danych. Aby ustalić liczbę przejść, należy wybrać polecenie Options z menu Tools i aktywować zakładkę Disk. Wyświetlone zostanie okno przedstawione na rysunku 4.37.
Rozdział 4. Kryptografia w praktyce
199
Rysunek 4.37. Ustawienia narzędzia PGP Shredder
Liczbę przejść ustalamy za pomocą kontrolki Number of passess. Za pomocą umieszczonych poniżej pól wyboru możemy włączyć nadpisywanie również podczas opróżniania kosza (Shred when emptying the Windows Recycle Bin), wyświetlić ikonę narzędzia PGP Shredder na pulpicie (Place PGP Shredder icon on the desktop) i aktywować ostrzeżenie wyświetlane przed każdym bezpiecznym usunięciem pliku (Always warn me before shredding). Szybkość bezpiecznego usuwania pliku zależy od zdefiniowanej liczby przejść, rozmiaru pliku, szybkości procesora i aktualnego obciążenia komputera (liczby działających aplikacji i procesów). Najprostszym sposobem na bezpieczne usunięcie pliku jest przeciągnięcie go na ikonę PGP Shredder. Można też kliknąć plik prawym przyciskiem myszy i z wyświetlonego menu wybrać polecenie PGP Shred „nazwa_pliku” (dostępne w podmenu Symantec Encryption Desktop). Inny sposób to wybranie polecenia Shred Files z menu Tools w głównym oknie Symantec Encryption Desktop. Za pomocą narzędzia PGP Shredder nie można usuwać plików systemowych, plików tylko do odczytu, plików WebDav i Sharepoint oraz katalogów zawierających pliki, które z różnych względów nie mogą być usunięte. Usuwając dane, warto pamiętać, że mogą one być przechowywane również w innych miejscach, na przykład pod postacią plików tymczasowych. Z tego względu wrażliwe informacje najlepiej zabezpieczać za pomocą szyfrowanych dysków, traktując narzędzie PGP Shredder jako dodatkowe zabezpieczenie.
4.3.8. Web of Trust Wydaje się, że dobrym pomysłem byłoby utworzenie internetowych banków kluczy, z których użytkownicy mogliby pobierać potrzebne im klucze prywatne. Taka koncepcja nie podobała się jednak Philowi Zimmermannowi. PGP zostało bądź co bądź stworzone,
200
Podstawy kryptografii
aby przeciwdziałać szpiegowskim praktykom rządu. Skupianie kluczy w jednym miejscu było jego zdaniem ryzykowne, gdyż łatwiej wówczas można by uzyskać dostęp do większej ich liczby. Z tego też względu bezpieczeństwo w programie opiera się w dużej mierze na bardziej „rozproszonym” schemacie nazywanym siecią zaufania. Sieć zaufania opiera się na wzajemnym potwierdzaniu autentyczności kluczy przez osoby korzystające z PGP/Symantec Encryption Desktop. Nowy użytkownik po utworzeniu pary kluczy przekazuje klucz publiczny do podpisania innym użytkownikom. Klucz ten będzie potem rozprowadzany wraz ze złożonymi podpisami, które potwierdzać będą jego autentyczność. Podpisując klucz publiczny, użytkownik potwierdza, iż faktycznie należy on do danej osoby. Podpis wykonuje się przy użyciu klucza prywatnego, określając, jaki stopień zaufania przyznajemy danemu kluczowi (patrz podrozdział 4.3.1). Wcześniej oczywiście należy upewnić się, że klucz faktycznie nie jest fałszywy (najlepiej kontaktując się z właścicielem osobiście i sprawdzając odcisk palca klucza). W ten sposób między użytkownikami powstają „ścieżki zaufania” łączące się w ogólnoświatową sieć. Przykładowy schemat połączeń przedstawiony został na rysunku 4.38. Pogrubione strzałki oznaczają pełne zaufanie, natomiast zwykłe — zaufanie połowiczne. Rysunek 4.38. Przykładowy fragment sieci zaufania
Istnieją mniej więcej takie same szanse powodzenia w przejęciu kontroli nad tak skonstruowanym systemem uwierzytelniania jak w przejęciu kontroli nad całym internetem. Oczywiście struktura taka ma również swoje wady. Problemy pojawiają się w przypadku skompromitowania klucza. Zagrożone staje się bezpieczeństwo wszystkich użytkowników, których klucze były certyfikowane kluczem prywatnym danej osoby, co oznacza zagrożenie nawet dla kompletnie obcych sobie osób. Stąd też powstanie internetowych magazynów kluczy było mimo zamierzeń Phila Zimmermanna nieuniknione. Należy pamiętać, iż pobranie klucza z serwera nie gwarantuje jego autentyczności. W bazie danych gromadzone są nadesłane przez użytkowników klucze, jednak w przypadku złamania któregoś z nich wszystko zależy od tego, jak szybko właściciel wyśle do serwera informację na ten temat.
Rozdział 4. Kryptografia w praktyce
201
Jak widać, również w przypadku Symantec Encryption Desktop problem sprowadza się do kompromisu między bezpieczeństwem a funkcjonalnością systemu. Wypracowany do tej pory złoty środek również nie jest pozbawiony wad (udany atak na serwer ma o wiele groźniejsze następstwa niż atak na pojedynczego użytkownika), jednak w przypadku systemów ochrony danych nigdy nie możemy mówić o stuprocentowym zabezpieczeniu. Alternatywą dla płatnego pakietu Symantec Encryption Desktop jest darmowy program GnuPG oparty na standardzie OpenPGP.
4.4. GnuPG Program GnuPG jest darmową alternatywą dla PGP, spełniającą standard OpenPGP. GPG dostępne jest w niemal wszystkich dystrybucjach systemu Linux. Zwykle działa w trybie wiersza poleceń, jednak dostępne są również wersje posiadające interfejs graficzny. Wersję przeznaczoną do pracy w systemie Windows (GPG4win) pobrać można na stronie http://www.gpg4win.org/. Najnowsza (2.2.0) wersja programu składa się z następujących podprogramów: GnuPG — podstawowy element pakietu, odpowiadający za szyfrowanie. Kleopatra — aplikacja do zarządzania certyfikatami. GNU Privacy Assistant — alternatywny program do zarządzania certyfikatami. GnuPG for Outlook (GpgOL) — rozszerzenie pozwalające na podpisywanie
i szyfrowanie wiadomości w programie Microsoft Outlook 2003 i 2007. GPG Explorer eXtension (GpgEX) — rozszerzenie dla Windows Explorera,
pozwalające na szyfrowanie i podpisywanie plików za pomocą menu kontekstowego. Claws Mail — program pocztowy z pełną obsługą GnuPG.
Decyzję o tym, z których elementów pakietu będziemy korzystać, podejmujemy na etapie instalacji, zaznaczając odpowiednie pola wyboru.
4.4.1. Tworzenie certyfikatu Po zainstalowaniu i uruchomieniu programu w pierwszej kolejności uruchamiamy program Kleopatra. Wyświetlone zostanie okno widoczne na rysunku 4.39. Wybieramy polecenie New Certificate z menu File. W kolejnym oknie musimy wskazać typ tworzonego certyfikatu. Do wyboru mamy certyfikat bazujący na parze kluczy w standardzie OpenPGP lub na parze kluczy wraz z wnioskiem o certyfikat skierowanym do centrum certyfikacji (standard X.509). W pierwszym wypadku naszą wiarygodność potwierdzać będzie opisana w poprzednim rozdziale sieć zaufania (Web of Trust) tworzona przez znajomych, z którymi prowadzimy elektroniczną korespondencję. W drugim
202
Podstawy kryptografii
Rysunek 4.39. Kleopatra
para kluczy zostanie również utworzona lokalnie, ale naszą tożsamość będzie musiało potwierdzić niezależne centrum certyfikacji. Na początek zajmiemy się drugą z wymienionych opcji.
4.4.1.1. Tworzenie certyfikatu X.509 Po wybraniu tej opcji wyświetlone zostanie okno przedstawione na rysunku 4.40. Rysunek 4.40. Generowanie certyfikatu X.509
Podajemy w nim swoje imię i nazwisko (Common name), adres e-mail, nazwę organizacji i kod określający kraj. Klikając przycisk Advanced Settings, możemy dodatkowo określić długość klucza, zakres zastosowania klucza (szyfrowanie i/lub podpisywanie) oraz dodatkowe informacje personalne. Klikamy przycisk Next, w kolejnym oknie sprawdzamy jeszcze raz poprawność wybranych danych i klikamy przycisk Create Key. W kolejnym oknie wpisujemy hasło chroniące klucz prywatny. Podczas wpisywania w polu poniżej wyświetlany będzie zielony pasek oraz wartość procentowa określająca jakość hasła. Podane hasło będziemy musieli dwukrotnie potwierdzić, po czym certyfikat zostanie utworzony. W międzyczasie w tle wyświetlane będzie drugie okno, z dużym polem tekstowym. Można je wykorzystać do dostarczenia dodatkowego losowego ziarna generatorowi klucza, ruszając w jego obrębie kursorem lub wpisując losowe znaki (liczą się nie tyle same znaki, ile odstępy czasowe między nimi).
Rozdział 4. Kryptografia w praktyce
203
W ostatnim oknie możemy zapisać certyfikat w formie pliku (przycisk Save Certificate Request to File) lub od razu przesłać go do CC (Send Certificate Request By Email). W drugim przypadku utworzony zostanie anglojęzyczny szablon wiadomości e-mail, w którym trzeba będzie uzupełnić adres centrum certyfikacyjnego i (jeśli nie zostanie to zrobione automatycznie) dołączyć plik utworzonego certyfikatu. Oczywiście w przypadku polskojęzycznego użytkownika i CC należy również zmienić temat i treść wiadomości. Jak widać, o ile nie zamierzamy się kontaktować z zagranicznym centrum, nie jest to specjalnie przydatna opcja. Po zapisaniu certyfikatu do pliku w dowolnej chwili możemy załączyć do go wiadomości z prośbą o weryfikację tożsamości. Więcej na temat procesu uzyskiwania certyfikatu potwierdzonego przez CC przeczytać można w podrozdziale 4.6. Po uzyskaniu potwierdzonego certyfikatu musimy go zaimportować, korzystając z polecenia Import certificate w menu File.
4.4.1.2. Tworzenie certyfikatu OpenPGP Po wybraniu tej opcji wyświetlone zostanie okno podobne do przedstawionego na rysunku 4.38, ale zawierające mniej pól do uzupełnienia. W tym przypadku musimy podać jedynie swoje imię i nazwisko oraz adres e-mail. Klikając przycisk Advanced Settings, możemy dodatkowo określić długość klucza i zakres jego stosowania. Następnie podajemy i potwierdzamy hasło, dostarczamy losowe ziarno dla generatora i nasz klucz jest gotowy. W ostatnim oknie do dyspozycji mamy trzy przyciski: Make a Backup Of Your Key Pair — wykonanie kopii zapasowej stworzonych
kluczy. Tak utworzony plik najlepiej przechowywać na osobnym, dobrze ukrytym nośniku danych. Send Certificate By Email — analogicznie jak w przypadku certyfikatu X.509
możemy teraz wysłać swój certyfikat pocztą elektroniczną, ale w tym wypadku będziemy go przesyłać do swoich znajomych. Upload Certificate To Directory Service — przesłanie certyfikatu do globalnego
serwera, z którego każdy będzie mógł go pobrać. Jeśli wcześniej nie określiliśmy domyślnego adresu dla takiego serwera, certyfikat zostanie przesłany na adres keys.gnupg.net. Po zakończeniu procesu tworzenia certyfikatu OpenPGP zostanie on automatycznie dodany do listy certyfikatów w programie Kleopatra.
4.4.2. Obsługa certyfikatów Niezależnie od tego, na który typ certyfikatu się zdecydowaliśmy, dalsza obsługa programu wygląda tak samo. Certyfikat wraz z jego podstawowymi parametrami jest widoczny w zakładce My Certificates. Klikając go dwukrotnie, możemy wyświetlić dodatkowe dotyczące go informacje (patrz rysunek 4.39). Dodatkowe parametry to: User-ID (ID użytkownika), Validity (zakres ważności), Certificate type (typ certyfikatu), Certificate usage (zakres zastosowań certyfikatu), Key-ID (ID klucza), Fingerprint
204
Podstawy kryptografii
(odcisk palca), Ownertrust (stopień zaufania do certyfikatu) i Stored (miejsce przechowywania certyfikatu). Więcej informacji na temat struktury i parametrów certyfikatów znaleźć można w podrozdziale 4.6. W tym samym oknie możemy również zmienić hasło chroniące certyfikat, klikając przycisk Change Passphrase. Aby prowadzić korespondencję z innymi użytkownikami, musimy wcześniej uzyskać ich publiczne certyfikaty oraz dostarczyć im swój. Można to zrobić, przesyłając plik certyfikatu pocztą elektroniczną, umieszczając takie pliki na serwerze lub swojej stronie WWW, a nawet osobiście, przekazując pliki na nośnikach danych. Bez względu na to, na którą ewentualność się zdecydujemy, musimy wcześniej wyeksportować certyfikat do pliku. W tym celu klikamy jego nazwę na liście certyfikatów prawym przyciskiem myszy i z podręcznego menu (patrz rysunek 4.41) wybieramy polecenie Export certificate lub Export Certificate to Server (jeśli chcemy przesłać publiczny certyfikat na serwer). Należy bardzo uważać, żeby przez pomyłkę nie skorzystać z opcji Export Secret Keys i nie udostępnić publicznie naszych kluczy tajnych (opcja ta została dość niefortunnie umieszczona pomiędzy dwiema pozostałymi). Skoro już o tym mowa, eksportowanie i importowanie klucza prywatnego odbywa się na tej samej zasadzie, ale wymaga podania chroniącego go hasła i o wiele większej ostrożności przy przenoszeniu i przechowywaniu zawierającego klucz pliku. Rysunek 4.41. Dodatkowe informacje dotyczące certyfikatu
Po wyeksportowaniu certyfikatu możemy go przesłać jako załącznik lub otworzyć jego plik w notatniku, skopiować zawartość (łącznie z fragmentami -----BEGIN PGP PUBLIC KEY BLOCK----- oraz -----END PGP PUBLIC KEY BLOCK-----) i przesłać jako treść wiadomości. Eksportowanie certyfikatu na serwer może oszczędzić nam nieco czasu (osoby zainteresowane korespondowaniem z nami nie muszą już czekać, aż osobiście prześlemy im certyfikat; pobierają go z serwera), ale ma pewne wady. Po pierwsze, w przypadku certyfikatów OpenPGP jesteśmy ograniczeni do serwerów OpenPGP. Po drugie, będziemy teraz bardziej narażeni na otrzymywanie spamu.
Rozdział 4. Kryptografia w praktyce
205
Rysunek 4.42. Podręczne menu certyfikatu
Po otrzymaniu certyfikatu publicznego innego użytkownika należy zapisać go na dysku (jeśli został przesłany w treści wiadomości, należy skopiować go do pliku o rozszerzeniu .asc lub .gpg dla OpenPGP albo .pem lub .der dla X.509). Następnie z menu File wybieramy polecenie Import Certificates, wskazujemy plik i klikamy przycisk Otwórz. Aby mieć pewność, że certyfikat faktycznie pochodzi od właściwej osoby, możemy przeprowadzić proces certyfikacji. W tym celu klikamy nazwę certyfikatu na liście i z podręcznego menu wybieramy polecenie Certify Certificate. W wyświetlonym oknie zaznaczamy interesujący nas certyfikat i sprawdzamy, czy wyświetlony odcisk palca się zgadza. W tym celu trzeba się skontaktować z osobą, do której certyfikat należy, i porównać wartości odcisków. Jeśli odcisk się zgadza, przechodzimy do kolejnego okna, gdzie ponownie zaznaczamy certyfikat i wybieramy jedną z dwóch opcji: Certify Only for Myself — potwierdzenie tożsamości na użytek własny. Certify for everyone to see — potwierdzenie tożsamości z przesłaniem na
serwer — w ten sposób uwiarygodniamy użytkownika certyfikatu w ramach sieci zaufania OpenPGP.
4.4.3. Szyfrowanie i podpisywanie Aby zaszyfrować lub podpisać wiadomość e-mail w programie Microsoft Outlook, w oknie edycji wiadomości aktywujemy zakładkę Dodatki i wybieramy odpowiednie polecenie w polu Polecenia menu (patrz rysunek 4.43). Możemy również skorzystać z widocznych obok przycisków przedstawiających kłódkę (szyfrowanie) i pióro (podpisywanie). Odpowiedni dla certyfikatu protokół (OpenPGP lub S/MIME) zostanie wybrany automatycznie. W przypadku podpisu elektronicznego zostaniemy dodatkowo poproszeni o wprowadzenie hasła chroniącego nasz klucz prywatny. Jeśli do wiadomości dodane zostaną załączniki GpgOL, zostaną one również automatycznie zaszyfrowane (podpisane).
206
Podstawy kryptografii
Rysunek 4.43. Szyfrowanie i podpisywanie wiadomości w programie Microsoft Outlook
Po otrzymaniu i otwarciu wiadomości zaszyfrowanej naszym kluczem publicznym zostaniemy poproszeni o podanie hasła chroniącego klucz prywatny. Jeśli będzie ono poprawne, wiadomość zostanie automatycznie odszyfrowana i wyświetlona. Proces weryfikacji podpisu elektronicznego przebiega analogicznie. Po otrzymaniu i otwarciu podpisanej wiadomości program automatycznie sprawdzi podpis, bazując na liście zaimportowanych certyfikatów publicznych, i wyświetli informację o użytkowniku, który podpisał wiadomość (adres e-mail przypisany do wykorzystanego certyfikatu). Zamiast korzystać z dodatku GpgOL, możemy również zaszyfrować i/lub podpisać naszą wiadomość, zapisać ją (oraz ewentualny podpis) w postaci plików i dołączyć je do normalnej wiadomości (jest to przydatne, jeśli nasz program pocztowy nie obsługuje oferowanego przez Gpg4win mechanizmu szyfrowania i podpisywania). Do szyfrowania i podpisywania plików w GnuPG wykorzystywana jest aplikacja GpgEX, która dodaje odpowiednie opcje do menu kontekstowego w programie Windows Explorer. Dzięki temu cała operacja jest dziecinnie prosta — klikamy wybrany plik prawym przyciskiem myszy i z wyświetlonego menu wybieramy opcję Sign and encrypt. Aby wykonać inną operację związaną z szyfrowaniem, klikamy znajdującą się poniżej opcję More GpgEX options i wybieramy odpowiednie polecenie z dodatkowego menu. Całość przedstawiona jest na rysunku 4.44. Po wybraniu opcji związanej z szyfrowaniem/podpisywaniem wiadomości wyświetlone zostanie okno przedstawione na rysunku 4.45. Oprócz podpisywania i szyfrowania mamy również możliwość spakowania pliku do archiwum w formacie .tar. Jeśli zaszyfrowany (podpisany) plik ma być również otwierany w edytorze tekstu, musimy zaznaczyć pole Text output (ASCII armor). Ostatnia opcja — Remove unencrypted original file when done — pozwala usunąć oryginalny plik po wykonaniu zaszyfrowanej wersji. Klikamy przycisk Next. Wygląd kolejnego okna zależy od tego, na jaką operację się zdecydowaliśmy. W przypadku szyfrowania będzie ono wyglądać mniej więcej tak jak na rysunku 4.46. Wyszukujemy odpowiedni certyfikat, w razie problemów korzystając z wyszukiwarki i menu filtrowania w górnej części okna, i klikamy przycisk Add. Certyfikat zostanie
Rozdział 4. Kryptografia w praktyce
207
Rysunek 4.44. Szyfrowanie i podpisywanie plików — menu kontekstowe
Rysunek 4.45. Szyfrowanie i podpisywanie plików
wyświetlony w dolnej części okna. Klikamy przycisk Encrypt. Jeśli szyfrowanie przebiegnie bez problemów, zaszyfrowany plik zostanie zapisany na dysku, a na ekranie pojawi się okno potwierdzające poprawne wykonanie operacji (patrz rysunek 4.47). W przypadku podpisywania musimy jedynie wybrać certyfikat z rozwijanego menu i (po kliknięciu przycisku Sign) podać hasło chroniące klucz prywatny. Ponownie: jeśli operacja zostanie wykonana poprawnie, na ekranie zostanie wyświetlone potwierdzenie. Podpis zostanie zapisany w osobnym pliku, a jego potwierdzenie będzie wymagało również pliku, pod którym został złożony. Zaszyfrowane (podpisane) pliki tworzone są w jednym z czterech formatów w zależności od wybranych opcji: .sig (OpenPGP), asc (OpenPGP z możliwością odczytu w edytorze tekstu), p7s (S/MIME), pem (S/MIME z możliwością odczytu w edytorze tekstu).
208
Podstawy kryptografii
Rysunek 4.46. Szyfrowanie plików
Rysunek 4.47. Potwierdzenie zaszyfrowania pliku
Aby sprawdzić poprawność podpisu, klikamy plik w jednym z wymienionych formatów prawym przyciskiem myszy i z wyświetlonego menu wybieramy polecenie Decrypt and Verify. W kolejnym oknie klikamy przycisk Decrypt/Verify i jeśli nie wystąpią błędy, pojawi się okno z informacją o użytkowniku, który złożył podpis pod plikiem. Jeśli błędy wystąpią (np. ktoś w międzyczasie zmodyfikuje oryginalny plik), w oknie pojawi się komunikat Invalid signature. Odszyfrowywanie pliku przebiega na tej samej zasadzie, z tą różnicą, że będziemy dodatkowo musieli podać hasło chroniące klucz prywatny.
Rozdział 4. Kryptografia w praktyce
209
4.4.4. Obsługa serwerów Przed przesłaniem certyfikatu na serwer musimy skonfigurować jego dane. W tym celu wybieramy polecenie Configure Kleopatra z menu Settings. Pojawi się okno przedstawione na rysunku 4.48. Rysunek 4.48. Konfigurowanie serwera
Klikamy skierowaną w dół strzałkę obok przycisku New i wybieramy typ serwera (OpenPGP lub X.509). W kolumnie Scheme wpisany zostanie domyślny protokół dla wybranego typu (hkp dla OpenPGP i ldap dla X.509). W przypadku OpenPGP domyślnym serwerem jest keys.gnupg.net, dla X.509 nazwę serwera trzeba podać (informację tę można uzyskać od centrum certyfikacji). Kolejna informacja to wykorzystywany do połączenia port. Dla OpenPGP jest to port 11371, a dla X.509 — 389. Jeśli serwer wymaga podania nazwy użytkownika i hasła, zaznaczamy pole Show user and password information i wprowadzamy te dane w odpowiednich kolumnach. Ustawienia zatwierdzamy przyciskiem OK. Jeśli przy nawiązywaniu połączenia korzystamy z serwera pośredniczącego, w kolumnie Server name należy podać dodatkowy parametr definiujący ten serwer. Parametr ma postać http-proxy= i powinien być oddzielony spacją od nazwy serwera. Jeśli firewall utrudnia nawiązanie połączenia, najlepiej zmienić serwer na wykorzystujący protokół http (np. http://gpg-keyserver.de dla OpenPGP). Po skonfigurowaniu połączenia z serwerem z menu File wybieramy polecenie Lookup Certificates on Server. Jeśli parametry połączenia są poprawne, w wyświetlonym oknie (patrz rysunek 4.49) będziemy mogli wyszukiwać certyfikaty interesujących nas użytkowników.
210
Podstawy kryptografii
Rysunek 4.49. Wyszukiwanie certyfikatów na serwerze
Aby wyświetlić szczegóły znalezionego certyfikatu, klikamy przycisk Details. Interesujące nas certyfikaty importujemy, klikając przycisk Import.
4.5. TrueCrypt Ciekawą alternatywą dla płatnych funkcji PGP jest program TrueCrypt. Nie umożliwia on co prawda kryptograficznej ochrony poczty elektronicznej i opracowywania szyfrowanych archiwów zip, pozwala jednak na tworzenie wirtualnych, zaszyfrowanych dysków, jak również szyfrowanie całych dysków i ich partycji. Aplikacja wykorzystuje znane i sprawdzone algorytmy szyfrowania: AES, CAST5, Serpent, 3DES oraz Twofish. Dekryptaż danych pobieranych z zaszyfrowanego dysku dokonywany jest w pamięci RAM, dzięki czemu nie ma konieczności zapisywania ich na dysku twardym.
4.5.1. Tworzenie szyfrowanych dysków i partycji Główne okno programu TrueCrypt przedstawione zostało na rysunku 4.50. Aby utworzyć wirtualny dysk, klikamy przycisk Create Volume. Wyświetlone zostanie okno widoczne na rysunku 4.51. Do dyspozycji mamy trzy opcje: możemy utworzyć zaszyfrowany dysk wirtualny (Create an encrypted file container), zaszyfrować dysk lub partycję niezawierającą systemu operacyjnego (Encrypt a non system partition/drive) lub zaszyfrować partycję/dysk z systemem (Encrypt the system partition or entire system drive). Na początek utworzymy pierwszy z nich. Po wybraniu interesującej nas opcji klikamy przycisk Next. Pojawia się kolejne okno kreatora (patrz rysunek 4.52).
Rozdział 4. Kryptografia w praktyce
211
Rysunek 4.50. Główne okno programu TrueCrypt
Rysunek 4.51. Kreator wirtualnych dysków
Musimy teraz zdecydować, czy chcemy utworzyć standardowy zaszyfrowany dysk (Standard TrueCrypt volume), czy też dysk zaszyfrowany i ukryty (Hidden TrueCrypt volume). Drugie rozwiązanie jest dodatkowym zabezpieczeniem na wypadek, gdyby ktoś kiedyś chciał nas zmusić do podania mu hasła do zaszyfrowanego obszaru dysku. Na temat dysków ukrytych piszę więcej w podrozdziale 4.5.3, a na pierwszy ogień pójdą dyski szyfrowane w sposób standardowy. Wybieramy interesującą nas opcję i klikamy przycisk Next.
212
Podstawy kryptografii
Rysunek 4.52. Wybór szyfrowanego dysku
Po kliknięciu przycisku program prosi nas o wybranie lokalizacji i nazwy dla pliku (dla dysku wirtualnego) lub lokalizacji napędu (w przypadku szyfrowania dysku lub partycji). W kolejnym oknie wybrać możemy algorytm szyfrowania oraz stosowaną funkcję skrótu. Następnie wybieramy rozmiar naszego dysku i (w kolejnym oknie) wpisujemy chroniące go hasło. Minimalna zalecana przez program długość hasła wynosi 20 znaków. Jeśli wpisane hasło będzie krótsze, pojawi się stosowne ostrzeżenie. W kolejnym kroku wyświetlone zostanie okno widoczne na rysunku 4.53. Rysunek 4.53. Dodatkowe opcje wirtualnego dysku
Możemy tu wybrać system plików, wykorzystywany rozmiar klastra (od 0,5 do 64 KB) oraz zaznaczyć opcję Dynamic. Dynamiczny dysk wirtualny zwiększa swoje rozmiary w miarę zapisywania na nim kolejnych danych. W tym przypadku wybrany wcześniej rozmiar dysku stanowi górne ograniczenie, po osiągnięciu którego dalsze zwiększanie pojemności nie będzie możliwe. Osobiście odradzam zaznaczanie tej opcji — dynamiczne dyski wirtualne cechują się gorszą wydajnością i mniejszym bezpieczeństwem. Istnieje również ryzyko uszkodzenia zaszyfrowanego systemu plików w przypadku małej ilości wolnej pamięci na dysku wirtualnym.
Rozdział 4. Kryptografia w praktyce
213
Na tym etapie gromadzone są również dane losowe służące do wygenerowania kluczy szyfrowania. Im dłużej poruszać będziemy kursorem w obrębie okna, tym lepszej jakości będzie nasz klucz (warto poświęcić na to przynajmniej 30 sekund). Aby zapobiec wyświetlaniu generowanych danych w oknie programu, można usunąć zaznaczenie pola umieszczonego w prawym górnym rogu obszaru Random Pool. Po zgromadzeniu odpowiedniej naszym zdaniem ilości danych losowych klikamy przycisk Format. Wirtualny dysk zostaje utworzony.
4.5.2. Obsługa dysków wirtualnych Przed rozpoczęciem używania szyfrowanego dysku należy go przyłączyć. W tym celu w głównym oknie programu zaznacza się literę, którą ma być oznaczony ten dysk, i klika przycisk Select File. Następnie należy wyszukać plik dysku wirtualnego, zaznaczyć go, kliknąć przycisk Open i w głównym oknie programu kliknąć przycisk Mount. Po podaniu chroniącego go hasła wybrany dysk pojawi się na liście przy wskazanej literze. W kolejnych kolumnach podane będą dotyczące go informacje: lokalizacja, rozmiar, wykorzystany algorytm szyfrowania oraz typ. Po przyłączeniu dysk pojawi się w systemie operacyjnym — można teraz tworzyć na nim nowe dokumenty, przegrywać na niego pliki, usuwać je z niego itd. Aby odłączyć dysk, wystarczy zaznaczyć go na liście w oknie głównym programu i kliknąć przycisk Dismount. Tworzenie i obsługa całych dysków i partycji różni się jedynie tym, że zamiast przycisku Select File w odpowiednich oknach trzeba kliknąć przycisk Select Device. Warto pamiętać, że w trakcie tworzenia szyfrowanego dysku usunięte zostaną wszystkie zgromadzone na nim uprzednio dane. Przed odszyfrowaniem zawartość dysków TrueCrypt stwarza wrażenie całkowitej losowości. Dzięki temu niemożliwe jest udowodnienie, że dana partycja lub plik faktycznie zawiera zaszyfrowane dane.
4.5.3. Ukryte dyski Oprócz szyfrowania program TrueCrypt pozwala nam również wykorzystać do ochrony informacji techniki steganograficzne. Mowa tutaj o możliwości tworzenia ukrytych dysków. Twórcy programu wbudowali tę opcję na wypadek skrajnych sytuacji, takich jak próba siłowego wymuszenia hasła do zaszyfrowanego dysku. Ukryty dysk umieszczany jest wewnątrz innego dysku wirtualnego, w ramach dostępnej na nim pamięci. Jego wykrycie jest niemożliwe nawet wtedy, gdy dysk zewnętrzny jest przyłączony. Dzieje się tak ze względu na właściwość dysków tworzonych w programie: pozorną losowość ich zawartości. Również informacje dotyczące zewnętrznego dysku nie są w żaden sposób zmieniane po utworzeniu na nim ukrytego obszaru. Aby utworzyć ukryty dysk wirtualny, postępujemy tak samo jak w przypadku zwykłego dysku, ale zamiast opcji Standard TrueCrypt volume wybieramy opcję Hidden TrueCrypt volume. W kolejnym oknie do dyspozycji mamy dwie opcje: utworzenie standardowego dysku wraz z dyskiem ukrytym (Normal Mode) lub ukrycie dysku wewnątrz istniejącego dysku standardowego (Direct Mode). W drugim przypadku trzeba
214
Podstawy kryptografii
wskazać plik dysku zewnętrznego (musi on być odłączony), podać chroniące go hasło, a następnie wybrać parametry ukrytego dysku (algorytm szyfrowania, funkcję skrótu, rozmiar i hasło). Jeśli zaznaczymy pierwsze z wymienionych pól (rozwiązanie zalecane dla początkujących użytkowników ze względu na możliwość nadpisania danych na dysku zewnętrznym w sytuacji, gdy źle określony zostanie rozmiar obszaru ukrytego), program poprowadzi nas przez proces tworzenia obu dysków po kolei. Po utworzeniu pierwszego z nich będziemy mogli umieścić na nim pliki „udające” tajne dane. W obu przypadkach maksymalny rozmiar ukrytego dysku określany jest w oparciu o ilość wolnego miejsca na dysku zewnętrznym. Hasło chroniące ukryty dysk musi być inne niż dla dysku zewnętrznego. Aby przyłączyć ukryty dysk, wskazujemy zawierający go dysk zewnętrzny, klikamy przycisk Mount i podajemy odpowiednie hasło. Dysk pojawi się na liście, a w kolumnie określającej jego typ wyświetlony zostanie napis Hidden. Jeśli wpiszemy hasło do dysku zewnętrznego, uzyskamy dostęp jedynie do „pseudotajnych” danych (w tym przypadku typ określony zostanie jako Normal). Jeśli w trakcie przyłączania włączymy ochronę danych zapisanych na dysku tajnym (patrz poniżej), dysk zewnętrzny zostanie oznaczony jako Outer. Ukryte dyski można również tworzyć wewnątrz zaszyfrowanych partycji. Podczas korzystania z dysku zewnętrznego pojawia się ryzyko nadpisania danych zawartych na dysku ukrytym. Z tego względu twórcy programu TrueCrypt wbudowali w niego mechanizm ochrony tajnych danych zabezpieczanych w ten sposób. Aby go aktywować, na etapie podawania hasła do przyłączanego dysku należy kliknąć przycisk Mount Options. Wyświetlone zostanie okno widoczne na rysunku 4.54. Rysunek 4.54. Ochrona ukrytego dysku
Zaznaczamy pole Protect hidden volume against damage caused by writing to outer volume. Pole tekstowe umieszczone poniżej zostanie aktywowane, umożliwiając wpisanie hasła chroniącego ukryty dysk. Można również wykorzystać plik klucza, zaznaczając pole Use Keyfiles, klikając przycisk Keyfiles i wybierając odpowiedni plik spośród dostępnych na liście. Na koniec należy kliknąć przycisk OK, aby wrócić do poprzedniego okna dialogowego. W trakcie przyłączania dysku zewnętrznego TrueCrypt odszyfruje dane zapisane w nagłówku ukrytego dysku i pobierze informacje dotyczące jego rozmiaru. Dzięki temu możemy zapisywać pliki na dysku zewnętrznym bez ryzyka utraty naprawdę istotnych danych. Opisane czynności należy wykonać za każdym razem, kiedy przyłączamy wirtualny dysk. Opcja ochrony ukrytego dysku jest dezaktywowana, aby potencjalny agresor nie mógł stwierdzić, czy była wcześniej używana.
Rozdział 4. Kryptografia w praktyce
215
Kiedy podczas pracy z dyskiem zewnętrznym wykonamy operację zagrażającą ukrytym danym, wyświetlone zostanie okno ostrzegawcze, a obok nazw typu dysku (Outer) pojawi się wykrzyknik (patrz rysunek 4.55). Rysunek 4.55. Zablokowana próba nadpisania ukrytych danych
W takiej sytuacji system może również zgłosić niepowodzenie operacji opóźnionego zapisu. Stwarzające zagrożenie dane nie zostaną rzecz jasna zapisane na dysku zewnętrznym. Ochrony ukrytych danych nie należy oczywiście aktywować w momencie, gdy ktoś zmusza nas do ujawnienia zawartości zaszyfrowanego dysku. W ten sposób ujawnione zostanie jej istnienie, a z dwojga złego lepiej chyba zaryzykować nadpisanie wrażliwych danych. I jeszcze jedna uwaga: jeśli faktycznie obawiamy się aż tak ekstremalnych sytuacji jak próba wymuszenia hasła siłą, powinniśmy umieścić na zewnętrznym dysku pliki „udające” nasze tajne dane, by nie wzbudzić podejrzeń po jego odszyfrowaniu.
4.5.4. Pozostałe opcje i polecenia W głównym oknie programu możemy uzyskać dostęp do informacji dotyczących zaznaczonego dysku (jego lokalizacji, rozmiaru, typu, zastosowanego algorytmu itp.), klikając przycisk Volume Properties. Umieszczony obok przycisk Wipe Cache pozwala usunąć hasła oraz dane pobrane z plików klucza, a znajdujące się w pamięci cache. Są one tam zapisywane po włączeniu opcji Cache passwords in driver memory (patrz poniżej). W tym samym oknie mamy również możliwość automatycznego przyłączenia zaszyfrowanych dysków (Auto-Mount Devices) oraz uzyskania dostępu do narzędzi powiązanych z dyskami wirtualnymi (Volume Tools). Po kliknięciu drugiego z wymienionych przycisków możemy zmienić hasło chroniące wybrany dysk (Change Volume Password), zmienić funkcję wyznaczającą klucz szyfrowania dla nagłówka dysku
216
Podstawy kryptografii
(Set Header Key Derivation Algorithm), dodawać i usuwać pliki kluczy powiązanych z zaszyfrowanymi dyskami (opcje Add/Remove Keyfiles to/from Volume i Remove All Keyfiles from Volume), utworzyć kopię zapasową nagłówka (Backup Volume Header) oraz odzyskać zapisane w nim dane (Restore Volume Header). Ostatnia z wymienionych operacji jest możliwa do przeprowadzenia po wcześniejszym utworzeniu kopii zapasowej. Zmian w konfiguracji programu dokonywać można za pośrednictwem menu Settings. Możemy w nim zmienić język programu (o ile dostępne są pakiety dla innych języków), zdefiniować skróty klawiaturowe (Hot Keys) oraz wybrać domyślne pliki kluczy szyfrowania (Default Keyfiles). Po wybraniu ostatniej z wymienionych opcji wyświetlone zostanie okno widoczne na rysunku 4.56. Rysunek 4.56. Tworzenie plików kluczy
Zawartość pliku klucza łączona jest z hasłem w celu zwiększenia bezpieczeństwa. Warto zastanowić się nad wykorzystaniem takiego rozwiązania, ponieważ zabezpiecza ono przed atakiem z wykorzystaniem programu rejestrującego znaki wpisywane z klawiatury (nawet jeśli atakujący zdobędzie w ten sposób nasze hasło, będzie musiał dodatkowo uzyskać dostęp do pliku klucza) oraz atakiem metodą pełnego przeglądu. Pliki kluczy pozwalają również na współdzielenie tego samego dysku przez wielu użytkowników, wykorzystywanie tokenów oraz kart inteligentnych (ang. smart card). Plik klucza może mieć dowolny format, ale zalecane są te, w których wykorzystano kompresję (MP3, ZIP, JPG itp.). Powinien on również mieć przynajmniej 30 bajtów. Maksymalny rozmiar nie jest zdefiniowany, choć wykorzystywane jest tylko 1 048 576 pierwszych bajtów (1 MB) zapisanych w pliku danych. Plik klucza można również wygenerować losowo. W tym celu wystarczy kliknąć przycisk Generate Random Keyfile. W wyświetlonym oknie musimy dostarczyć danych losowych dla klucza, poruszając kursorem w wyznaczonym obszarze (im dłużej, tym lepiej). Na koniec klikamy przycisk Generate and Save Keyfile i wskazujemy lokalizację dla nowego pliku klucza. Zamiast wskazywać konkretny plik (Add File) lub generować go losowo, możemy również podać jego ścieżkę dostępu (Add Path). Z tej możliwości należy
Rozdział 4. Kryptografia w praktyce
217
jednak korzystać ostrożnie, ponieważ w programie zapisywana jest jedynie wybrana ścieżka, a nie nazwy plików umieszczonych w wybranym katalogu. W rezultacie dodanie nowego pliku do wspomnianego katalogu uniemożliwi przyłączenie dysków chronionych za pomocą tak zdefiniowanego klucza. Ostatnia z opcji dostępnych w menu Settings (Preferences) pozwala wyświetlić okno zawierające preferencje zdefiniowane w programie (patrz rysunek 4.57). Rysunek 4.57. Preferencje programu TrueCrypt
Znajduje się tutaj wspomniana wcześniej opcja zapisywania haseł w pamięci cache. W tej samej sekcji możemy również zaznaczyć opcję czyszczenia pamięci cache podczas zamykania programu (Wipe cached passwords on exit) oraz w momencie automatycznego odłączenia dysku (Wipe cached passwords on auto-dismount). Na uwagę zasługują również opcje związane z automatycznym odłączaniem dysków (sekcja Auto-Dismount). Pozwalają one określić, kiedy zaszyfrowany dysk ma zostać odłączony. Domyślnie zaznaczone są pierwsze dwie: odłączanie podczas wylogowywania (User logs off) oraz przy przejściu w tryb oszczędzania energii (Entering power saving mode). Możemy również wymusić automatyczne odłączanie w momencie uruchomienia wygaszacza ekranu (Screen Server is Launched) oraz po wybranym okresie bezczynności zaszyfrowanego dysku (Auto-dismount volume after no data has been read/ written to it for). Po zaznaczeniu ostatniego pola (Force auto-dismount even if volume contains open files and directories) dyski będą automatycznie odłączane nawet w przypadku, gdy znajdują się na nich otwarte pliki lub katalogi.
218
Podstawy kryptografii
4.6. Składanie i weryfikacja podpisów elektronicznych Obecnie najczęstszym zastosowaniem technologii podpisu elektronicznego jest potwierdzenie tożsamości nadawcy wiadomości e-mail. Wszystkie stosowane współcześnie programy obsługujące wymianę poczty elektronicznej posiadają opcję podpisywania wysyłanych wiadomości. Wymaga to jednak pobrania lub stworzenia stosownego certyfikatu i odpowiedniej konfiguracji programu pocztowego.
4.6.1. Wymagania techniczne Aby możliwa była obsługa certyfikatów cyfrowych na naszym komputerze, musi on spełniać szereg warunków dotyczących oprogramowania.
4.6.1.1. Obsługa certyfikatów Przede wszystkim przeglądarka musi mieć wbudowaną obsługę certyfikatów cyfrowych. Warunek ten spełniają następujące przeglądarki: Internet Explorer od wersji 5.5, Netscape Navigator od wersji 4.7x, Mozilla 1.x, wszelkie inne przeglądarki obsługujące standard X.509. Standard X.509 definiuje metody dystrybucji kluczy przez centra dystrybucji, a także strukturę opartych na tych kluczach certyfikatów cyfrowych i związane z nimi typy danych. Opracowywaniem kolejnych wersji standardu X.509 zajmuje się NIST (skrót od ang. National Institute of Standards and Technology). Najnowsza wersja standardu nosi nazwę X.509v3.
Program pocztowy również powinien obsługiwać certyfikaty cyfrowe. Lista odpowiednich programów znajduje się poniżej: MS Outlook 98/2000/XP/Vista i następne, Outlook Express od wersji 5.5, Netscape Communicator od wersji 4.x, Pine, Mozilla 1.x, Novell Group Wise 6, wszystkie inne programy obsługujące standard x509v3.
Rozdział 4. Kryptografia w praktyce
219
4.6.1.2. Obsługa 128-bitowej siły szyfrowania Dodatkowo przeglądarka powinna mieć 128-bitową siłę szyfrowania. W przeglądarce Internet Explorer można to sprawdzić, wybierając opcję Internet Explorer — informacje. Obecnie 128-bitowa siła szyfrowania jest standardem, jeśli jednak używamy starszej wersji przeglądarki, konieczna będzie jej aktualizacja lub nawet instalacja wersji nowszej. Siła szyfrowania to nic innego jak długość stosowanego klucza. W starszych wersjach przeglądarek internetowych (i innych produkowanych w USA programach zawierających zabezpieczenia kryptograficzne) obsługiwana jest jedynie 40-bitowa siła szyfrowania. Wynika to ze zniesionego dopiero w roku 2000 zakazu eksportu oprogramowania obsługującego klucze dłuższe niż 40 bitów. Więcej wiadomości na ten temat znajduje się w podrozdziale 1.5, „Era komputerów”.
4.6.1.3. Obsługa cookies Kolejnym warunkiem obsługi certyfikatów cyfrowych jest włączona obsługa cookies. W przeglądarce Internet Explorer włączyć ją można w menu Narzędzia/Opcje internetowe w zakładce Prywatność. W przeglądarce Firefox analogiczne opcje skonfigurować można, wybierając polecenie Opcje z menu Narzędzia i aktywując zakładkę Prywatność. Tam z rozwijanego menu Program Firefox wybieramy opcję Będzie używał ustawień użytkownika. Potem wystarczy już tylko zaznaczyć pole Akceptuj ciasteczka i ewentualnie skonfigurować dodatkowe, dotyczące ich opcje. Cookies są małymi plikami tekstowymi tworzonymi przez serwer na komputerze klienta za pośrednictwem przeglądarki internetowej. Zapisywane są w nich dane klienta, dzięki czemu możliwe jest odróżnienie go od pozostałych użytkowników danej strony internetowej. Stwarza to możliwość tzw. dynamicznego generowania strony, czyli wyświetlania nieco innej zawartości dla każdego z użytkowników.
4.6.1.4. Obsługa ActiveX Ostatni warunek dotyczy jedynie produktów firmy Microsoft i jest nim obsługa formantów ActiveX. Jest to zbiór opracowanych przez firmę Microsoft technologii umożliwiających przesyłanie przez internet wykonywalnego kodu do komputera klienta. Umożliwia to m.in. dostęp do funkcji systemowych, konieczny w tym przypadku do zainstalowania certyfikatu i zabezpieczenia klucza. Obsługę formantów ActiveX można włączyć w menu Narzędzia/Opcje internetowe, w zakładce Zabezpieczenia. Wystarczy kliknąć przycisk Poziom niestandardowy i zaznaczyć odpowiednie opcje.
4.6.2. Jak zdobyć certyfikat cyfrowy? W tym rozdziale podaję najważniejsze centra certyfikacji, dzięki którym uzyskać można certyfikat cyfrowy. Następnie na przykładzie jednego z nich omówię dokładnie całą procedurę, którą należy w tym celu przejść.
220
Podstawy kryptografii
4.6.2.1. Centra certyfikacji Aby posługiwać się podpisem elektronicznym, należy zdobyć stosowny certyfikat potwierdzający naszą tożsamość i prawa do używanego klucza publicznego. W tym celu należy odwiedzić jeden z serwisów internetowych zajmujących się wydawaniem i składowaniem takich certyfikatów. Najpopularniejsze tego typu serwisy to: www.certum.pl, www.verisign.pl, www.globalsign.net, www.thawte.com, www.epodpis.pl (nowa strona centrum Polcert).
Procedura tworzenia i instalacji certyfikatu we wszystkich serwisach wygląda podobnie. W omawianym przypadku za przykład ponownie posłuży Centrum Certyfikacji Certum. Niestety w ostatnich latach liczne centra (np. Thawte) wycofały się z udostępniania darmowych certyfikatów testowych w związku z rosnącymi wymaganiami technicznymi związanymi ze świadczeniem tej usługi. Co prawda wciąż można znaleźć serwisy, które pozwalają uzyskać taki certyfikat — na przykład Comodo (http://www.comodo.com) — niemniej oferta dotycząca próbnych certyfikatów jest znacznie skromniejsza niż jeszcze kilka lat temu. Na szczęście ceny certyfikatów komercyjnych są coraz przystępniejsze — podstawową wersję można kupić już za kilkadziesiąt złotych.
4.6.2.2. Uzyskiwanie certyfikatu Procedura uzyskiwania certyfikatu wygląda bardzo podobnie jak w przypadku certyfikatu SSL. Po dokonaniu zakupu na wskazany adres e-mail zostanie przesłana wiadomość zawierająca kod aktywacyjny oraz adres strony, na której należy go podać. Po zweryfikowaniu jego poprawności w zakładce Aktywacja certyfikatów klikamy przycisk Aktywuj. Również jak w przypadku certyfikatu SSL staniemy przed wyborem między generowaniem pary kluczy a podaniem wygenerowanego wcześniej żądania CSR, przy czym w przypadku certyfikatu służącego do podpisywania poczty zalecana jest ta pierwsza opcja. Po jej wybraniu należy potwierdzić swoje zaufanie do odwiedzonej witryny, po czym wyświetlona zostanie strona przedstawiona na rysunku 4.58. Możemy zapisać certyfikat w magazynie certyfikatów lub na specjalnej karcie kryptograficznej, a także określić jego długość za pomocą rozwijanego menu. Po wybraniu interesujących nas opcji klikamy przycisk Generuj klucze. Wyświetlone zostanie okienko widoczne na rysunku 4.59. Klikamy przycisk Ustaw poziom zabezpieczeń, podajemy hasło chroniące klucz i klikamy przycisk Zakończ. Po wykonaniu tych czynności przycisk OK stanie się aktywny i będziemy mogli zakończyć proces generowania kluczy.
Rozdział 4. Kryptografia w praktyce
221
Rysunek 4.58. Wybór parametrów generowania kluczy w serwisie Certum
Rysunek 4.59. Generowanie klucza
Po wygenerowaniu kluczy klikamy przycisk Dalej. Na kolejnej stronie możemy uzupełnić nasze dane. Ewentualne zmiany zatwierdzamy, ponownie klikając przycisk Dalej. Ostatnim etapem jest potwierdzenie wprowadzonych do tej pory danych. Należy uważnie przejrzeć podane informacje, ponieważ później nie będziemy już mogli ich zmodyfikować. Jeśli nie chcemy wprowadzać żadnych zmian, zaznaczamy pole oznaczające akceptację umowy i klikamy przycisk Aktywuj. Spowoduje to przesłanie na podany wcześniej adres e-mailowy wiadomości zawierającej łącze aktywacyjne. Po kliknięciu łącza certyfikat zostanie aktywowany, chyba że wybrana wersja ma również potwierdzać nasze imię i nazwisko — wówczas konieczne będzie również dostarczenie centrum kopii dokumentu tożsamości z potwierdzeniem zgodności z oryginałem.
4.6.3. O czym warto pamiętać? Po pierwsze, zawsze warto zapoznać się ze szczegółami umowy certyfikacyjnej, a także ogólnymi przepisami dotyczącymi składania podpisów cyfrowych. Informacje na ten temat znaleźć można na stronie firmy Certum oraz stronach innych centrów certyfikacji. Często podczas procesu tworzenia certyfikatu pojawia się pytanie, czy klucz prywatny ma być dodatkowo chroniony. W przypadku udzielenia odpowiedzi twierdzącej klucz zostanie zablokowany i niemożliwe będzie na przykład eksportowanie go z ustawień
222
Podstawy kryptografii
przeglądarki internetowej lub programu pocztowego. Dodatkowa ochrona przydatna jest w sytuacji, gdy inne osoby korzystają z tego samego komputera. Innym rozwiązaniem jest późniejsze wyeksportowanie do pliku certyfikatu razem z kluczem prywatnym, a następnie jego ponowny import. W czasie importowania należy zaznaczyć opcję mocnej ochrony klucza prywatnego i zaznaczyć jej stopień. Średni stopień spowoduje, iż klucz nie będzie mógł zostać użyty bez zezwolenia właściciela, natomiast stopień wysoki implikuje konieczność podawania hasła przy każdym użyciu klucza. Podczas importowania można również zezwolić na eksportowanie klucza w przyszłości bądź zablokować tę możliwość. Zmiana adresu poczty elektronicznej pociąga za sobą konieczność zamówienia kolejnego certyfikatu. Dzieje się tak z uwagi na to, że programy pocztowe sprawdzają zgodność adresu zawartego w certyfikacie z adresem nadawcy. Ostatnią rzeczą, o jaką należy zadbać, jest kopia zapasowa klucza prywatnego. Nie należy się spodziewać, iż w razie jego utraty będzie go można łatwo odzyskać z pomocą centrum certyfikacji (na podobnej zasadzie jak zapomniane hasło konta pocztowego). Ze względu na swą niezwykłą wagę klucze prywatne są generowane i przechowywane wyłącznie na komputerze użytkownika, natomiast ośrodki certyfikacji przechowują jedynie klucze publiczne. Zwiększa to zaufanie do nich jako instytucji. Jeśli zatem ktoś utraci swój klucz, będzie musiał utworzyć nowy certyfikat. W sytuacji, kiedy klucz został powielony lub choćby zachodzi podejrzenie, że tak się stało, certyfikat należy jak najszybciej unieważnić.
4.6.4. Konfiguracja programu pocztowego Po utworzeniu stosownego certyfikatu należy uaktualnić program odpowiadający za obsługę poczty elektronicznej. Sposób aktualizacji zależy od używanego programu.
4.6.4.1. Microsoft Outlook W programie Microsoft Outlook w celu uaktualnienia ustawień związanych z instalacją certyfikatu z menu Narzędzia należy wybrać Centrum zaufania i uaktywnić zakładkę Zabezpieczenia poczty e-mail. Pojawi się okno przedstawione na rysunku 4.60. Następnie trzeba nacisnąć przycisk Importuj/eksportuj znajdujący się w sekcji Identyfikatory cyfrowe (certyfikaty). W kolejnym oknie (patrz rysunek 4.61) klikamy przycisk Przeglądaj, odnajdujemy plik certyfikatu na dysku i klikamy przycisk Otwórz. Podajemy hasło i nazwę dla certyfikatu, po czym potwierdzamy zmiany ustawień, klikając OK. Następnie po utworzeniu wiadomości e-mail w sekcji Opcje zakładki Wiadomości (w oknie pisanej wiadomości) klikamy przycisk Dodaj podpis cyfrowy do wiadomości (wygląda on jak koperta z pieczęcią). Jeśli przycisk nie jest widoczny, należy kliknąć przycisk w prawym dolnym rogu opisywanej grupy opcji. Wyświetlone zostanie okno przedstawione na rysunku 4.62.
Rozdział 4. Kryptografia w praktyce
223
Rysunek 4.60. Zabezpieczenia poczty e-mail w programie Microsoft Outlook
Rysunek 4.61. Wybór certyfikatu w programie Microsoft Outlook
Klikamy przycisk Ustawienia zabezpieczeń i w wyświetlonym oknie zaznaczamy pole Dodaj podpis cyfrowy do wiadomości. W zakładce Zabezpieczenia poczty e-mail w oknie Centrum zaufania możemy również wybrać opcję automatycznego podpisywania wszystkich wiadomości, ale nie jest to najlepsze rozwiązanie (patrz dalsza część rozdziału).
224
Podstawy kryptografii
Rysunek 4.62. Opcje wiadomości w programie Microsoft Outlook Express
4.6.4.2. MS Outlook Express Aby uaktualnić ustawienia w programie MS Outlook Express, należy wybrać zakładkę Zabezpieczenia z menu Narzędzia/Opcje (patrz rysunek 4.63) i nacisnąć przycisk Identyfikatory cyfrowe. Rysunek 4.63. Menu Narzędzia/Opcje w programie Microsoft Outlook Express
W polu dialogowym Certyfikaty należy uaktywnić zakładkę Osobisty. Jeśli klucz znajduje się w systemowym repozytorium kluczy, powinien automatycznie pojawić się na liście. Jeśli nie jest dostępny, klikamy przycisk Importuj, a następnie za pomocą uruchomionego kreatora wskazujemy plik certyfikatu, podajemy chroniące go hasło, określamy dodatkowe opcje i potwierdzamy operację importu. Aby podpisać lub zaszyfrować wiadomość, podczas jej edycji wybieramy odpowiednie polecenie z menu Narzędzia.
Rozdział 4. Kryptografia w praktyce
225
4.6.4.3. Mozilla Thunderbird Po uruchomieniu programu wybieramy menu Narzędzia/Opcje, a następnie zaznaczamy pole Zaawansowane i zakładkę Certyfikaty. Pojawi się okno pokazane na rysunku 4.64. Rysunek 4.64. Okno dialogowe Certyfikaty w programie Microsoft Outlook Express
Klikamy przycisk Wyświetl certyfikaty. W wyświetlonym oknie Menedżer certyfikatów klikamy przycisk Importuj, wskazujemy plik certyfikatu na dysku, klikamy przycisk Otwórz i potwierdzamy wybór przyciskiem OK. Aby zaszyfrować albo podpisać wiadomość, należy wybrać odpowiednią opcję z dostępnego w oknie edycji menu Opcje (patrz rysunek 4.65). Rysunek 4.65. Podpisywanie i szyfrowanie wiadomości w programie Mozilla Thunderbird
226
Podstawy kryptografii
4.6.4.4. Informacje dodatkowe Aby zaszyfrować wiadomości oraz potwierdzać tożsamość innych użytkowników, należy zdobyć ich certyfikaty. Można to zrobić, odwiedzając jedną z wymienionych stron internetowych lub prosząc danego użytkownika o przesłanie podpisanej wiadomości. W każdym podpisanym e-mailu można znaleźć informacje na temat serwisu, który wydał dany certyfikat, i adresu internetowego, pod którym można go pobrać. Aby zaimportować certyfikat, wystarczy dodać nadawcę do książki adresowej. W programach pocztowych często pojawia się opcja automatycznego podpisywania wszystkich wysyłanych wiadomości. Osobiście odradzam zaznaczanie jej ze względu na wirusy wykorzystujące system pocztowy do infekowania komputerów. Wirusy takie samoczynnie wysyłają się do wszystkich osób znajdujących się na liście kontaktów użytkownika i w takim wypadku do każdej wiadomości zostanie dołączony jego podpis elektroniczny. Jeśli wirus wyrządzi jakieś szkody, możliwe stanie się wszczęcie przeciw pechowemu użytkownikowi dochodzenia o naprawienie szkód na zasadzie odpowiedzialności cywilnej. Skoro już mowa o wirusach, to zanim zaczniecie prowadzić wymianę cyfrowo podpisywanych wiadomości, należy się upewnić, czy są one automatycznie sprawdzane przez skaner antywirusowy. Jeśli tak, należy wyłączyć opcję dodawania do wiadomości informacji, że została ona sprawdzona. Dołączenie takiej wiadomości przez skaner zostanie bowiem potraktowane jako jej zmiana i unieważni złożony podpis.
4.6.5. Struktura certyfikatu Programy pocztowe przechowują dane o zaimportowanych certyfikatach cyfrowych, dzięki czemu możliwe jest uzyskanie szczegółowych informacji dotyczących zarówno parametrów technicznych interesującego nas certyfikatu, jaki i urzędu, który go wystawił. Dane te podawane są w postaci listy elementów zwanej też ogólnie strukturą certyfikatu. Dzięki standaryzacji wyświetlania tych informacji łatwiejsze jest porównywanie między sobą różnych typów certyfikatów, a także wyszukiwanie konkretnych informacji.
4.6.5.1. Elementy certyfikatu Typowy certyfikat cyfrowy składa się z następujących elementów: Identyfikator wersji certyfikatu — identyfikator alfanumeryczny wskazujący
wersję danego certyfikatu. Numer seryjny certyfikatu — kod pozwalający zidentyfikować dany certyfikat. Algorytm podpisu — identyfikator wykorzystanego do podpisu algorytmu
szyfrującego. Określa on, jaki algorytm został wykorzystany do generowania podpisu.
Rozdział 4. Kryptografia w praktyce
227
Algorytm wyznaczania wartości skrótu podpisu. Identyfikator wystawcy — identyfikuje centrum wystawiające certyfikat. Okres ważności certyfikatu. Nazwa i identyfikator właściciela certyfikatu. Klucz publiczny właściciela certyfikatu. Rozszerzenia alternatywne — opcjonalne informacje na temat certyfikatu bądź
wystawiającego go urzędu, takie jak regulaminy certyfikacji, punkty dystrybucji unieważnionych certyfikatów, okres stosowania klucza prywatnego itp.
4.6.5.2. Uzyskiwanie informacji o certyfikacie Dostęp do danych stosowanego przez siebie certyfikatu uzyskać można poprzez program pocztowy. W programie Microsoft Outlook Express należy uaktywnić zakładkę Zabezpieczenia w menu Narzędzia/Opcje i nacisnąć przycisk Identyfikatory cyfrowe. Następnie trzeba wybrać interesujący certyfikat z listy, a w wyświetlonym oknie informacji zaznaczyć zakładkę Szczegóły. W górnym oknie zakładki znajduje się lista wszystkich elementów certyfikatu. Po wybraniu dowolnego elementu w dolnym oknie pojawia się jego szczegółowy opis. W Microsoft Outlook po kliknięciu przycisku Ustawienia zabezpieczeń w oknie Opcje wiadomości (patrz rysunek 4.62) w wyświetlonym oknie Właściwości zabezpieczeń klikamy przycisk Zmień ustawienia. Wyświetlone zostanie okno widoczne na rysunku 4.66. Klikamy przycisk Wybierz w sekcji Certyfikaty i algorytmy. Wyświetlona zostanie lista dostępnych certyfikatów. Aby obejrzeć szczegóły wybranego certyfikatu, klikamy dostępne pod nim łącze Kliknij tutaj, aby wyświetlić właściwości certyfikatu, a w wyświetlonym oknie wybieramy zakładkę Szczegóły. Całość okna informacyjnego przedstawia rysunek 4.67. Wygląda ono podobnie we wszystkich omawianych programach pocztowych. Rysunek 4.66. Wyświetlanie certyfikatu w programie Microsoft Outlook
228
Podstawy kryptografii
Rysunek 4.67. Informacje o certyfikacie w programie Microsoft Outlook
Spośród wspomnianych rozszerzeń alternatywnych warto zwrócić uwagę na Odcisk palca. Jest to unikatowy identyfikator certyfikatu uzyskany w wyniku działania funkcji skrótu. Rodzaj zastosowanej funkcji określony jest w polu Algorytm odcisku palca. W razie wątpliwości co do autentyczności certyfikatu można osobiście skontaktować się z jego właścicielem i poprosić o podanie odcisku palca. W ten sposób upewnicie się, że pobraliście właściwy certyfikat. W ostatniej zakładce (patrz rysunek 4.68) obejrzeć można ścieżkę certyfikacji danego certyfikatu. Rysunek 4.68. Ścieżka certyfikacji
Rozdział 4. Kryptografia w praktyce
229
Obejrzeć tu można certyfikaty wszystkich instytucji, które potwierdzają jego autentyczność. Wystarczy dwukrotnie kliknąć lewym przyciskiem myszy odpowiednią pozycję na liście. Poniżej znajduje się informacja na temat stanu certyfikatu (wspominałem o tym w podrozdziale 4.2). Na samej górze podany jest główny urząd certyfikacji. Posługuje się on podpisanym przez siebie certyfikatem i stanowi podstawę zaufania dla wszystkich pozostałych centrów certyfikacji (patrz podrozdział 3.4).
4.7. Kryptografia w PHP i MySQL W tym podrozdziale omówię funkcje szyfrujące wykorzystywane w języku skryptowym PHP oraz systemie zarządzania bazami danych MySQL. Wiedza tu przedstawiona pozwoli na wykorzystanie algorytmów kryptograficznych na stronie WWW lub do ochrony prostych baz danych. Nie sposób oczywiście opisać wszystkich możliwości, które otwiera zastosowanie kryptografii na tym polu, niemniej jednak poniższe informacje dają solidną podstawę do dalszych poszukiwań i eksperymentów.
4.7.1. Funkcje szyfrujące w PHP Na początek zajmę się wykorzystaniem funkcji szyfrujących w języku PHP. Jeśli dotychczas nie zetknęliście się z taką nazwą, wyjaśniam, iż PHP (skrót od ang. Personal Home Page — osobista strona domowa) jest językiem skryptowym pozwalającym na tworzenie dynamicznych stron WWW. Oznacza to, iż wygląd strony będzie się zmieniał w zależności od parametrów przetwarzanych przez napisany przez nas skrypt php. Najprostszym przykładem może być tu strona połączona z bazą danych odwiedzających ją użytkowników. Dzięki skryptom php użytkownicy mogą rejestrować się w bazie, a następnie logować na stronie, której wygląd zależeć będzie od ich preferencji (wyświetlane będą łącza do ich ulubionych działów itp.). Warto zaznajomić się z podstawami PHP przed przeczytaniem dalszej części tego rozdziału (godna polecenia jest pozycja PHP i MySQL. Tworzenie stron WWW. Vademecum profesjonalisty — patrz Bibliografia), może się bowiem okazać, iż opisane tu zagadnienia i funkcje będą dla początkujących zbyt skomplikowane. Do wykonania opisanych skryptów będziemy potrzebować serwera z wbudowaną obsługą PHP i MySQL. Bardzo popularny jest serwer Apache, jednak jego konfiguracja i instalacja wszelkich niezbędnych komponentów może okazać się zbyt trudna. Na początek polecam zatem dostępne w sieci bezpłatne pakiety instalacyjne Apache z wbudowanymi narzędziami obsługi PHP i MySQL. Dwa najbardziej popularne to: FoxServ — pakiet instalacyjny dla platform Unix oraz Windows dostępny
na stronie http://sourceforge.net/projects/foxserv/. WampServer — dostępny na stronie http://www.wampserver.com/en/ pakiet
zawierający Apache2, MySQL i PHP.
230
Podstawy kryptografii
W opisywanych przykładach posłużymy się serwerem WampServer. Po jego pobraniu i zainstalowaniu tworzone strony należy umieścić w katalogu c:\wamp\www (chyba że podczas instalacji wybraliście inny katalog — w takim wypadku ścieżkę należy odpowiednio zmienić). Jest to o tyle istotne, iż strony zawierające skrypty php nie będą działać, o ile nie uruchomi się ich na serwerze. Aby to zrobić, po uruchomieniu serwera w oknie przeglądarki internetowej wpisujemy http://localhost/nazwastrony.php. To jednak nie wszystko. Można już wprawdzie używać skryptów php na swoich stronach, jednak do obsługi funkcji szyfrujących konieczne jest włączenie obsługi odpowiedniej biblioteki.
4.7.1.1. Biblioteka mcrypt Aby posługiwać się funkcjami szyfrującymi, trzeba zainstalować na swoim serwerze obsługę biblioteki mcrypt. Plik ten dostępny jest między innymi pod adresem http://sourceforge.net/projects/mcrypt/files/Libmcrypt/. Dla wersji 5.0 PHP konieczne jest pobranie libmcrypt w wersji 2.5.6 lub nowszej. Po przekopiowaniu pliku należy jeszcze zmienić konfigurację serwera w taki sposób, aby podczas uruchamiania ładowana była biblioteka mcrypt. W tym celu otwieramy plik php.ini, odnajdujemy w nim linię ;extension=php_mcrypt.dll, po czym usuwamy znak komentarza (;). Jeśli podczas instalacji zmieniliście domyślną ścieżkę dostępu do katalogu serwera, trzeba znaleźć również linię zawierającą ścieżkę dostępu do rozszerzeń php. W przypadku serwera WampServer linią tą jest extension_dir = "c:/wamp/bin/php/php5.3.13/ext/". Wpisujemy poprawną ścieżkę, po czym uruchamiamy ponownie serwer. Można teraz przejść do wzbogacania swojej strony o skrypty szyfrujące. W przypadku PHP w wersji nowszej niż 5.3 dla systemu Windows nie ma konieczności pobierania i instalowania pliku .dll oraz modyfikowania pliku php.ini, ponieważ biblioteka mcrypt jest statycznie dowiązana do kodu języka.
4.7.1.2. Dostępne algorytmy Po włączeniu obsługi biblioteki mcrypt do dyspozycji mamy następujące szyfry blokowe: DES i 3DES, IDEA, Twofish, Blowfish, RC2, CAST (128 – 256), SaferPlus, 3-WAY, GOST, Rijndael (AES) (128 – 256), XTEA, Serpent.
Rozdział 4. Kryptografia w praktyce
231
Dostępne są także szyfry strumieniowe PANAMA, WAKE, RC4 i ENIGMA. Szyfry blokowe można stosować w trybach ECB, CBC, CFB oraz OFB.
4.7.1.3. Wywoływanie funkcji szyfrujących Omówię teraz funkcje php oparte na bibliotece mcrypt, które posłużą do zaszyfrowania danych. Następnym krokiem będzie użycie ich do skonstruowania prostego skryptu szyfrującego i deszyfrującego zadeklarowaną zmienną algorytmem AES. Wspomniane funkcje to: mcrypt_module_open (nazwa_algorytmu, katalog_algorytmu, tryb, katalog_trybu) — funkcja służy do uruchamiania modułu szyfrowania o podanych parametrach. Wszystkie parametry zawarte w nawiasie muszą być typu string
(ciąg znaków). Jako pierwszą podajemy nazwę algorytmu, którego chcemy użyć. katalog_algorytmu i katalog_trybu definiują katalogi serwera, w których zawarte są dane na temat algorytmu i stosowanego trybu. Wpisuje się tam nazwę stosownego katalogu, jeśli zmieniliście domyślne ustawienia. W przeciwnym wypadku można pozostawić tzw. pusty ciąg (‘ ’). Parametr tryb służy do określenia trybu, w jakim ma być przeprowadzane szyfrowanie. mcrypt_enc_get_iv_size (źródło) — służy do określania wielkości wektora IV odpowiedniej dla parametrów szyfrowania zdefiniowanych w danej źródło.
Można w niej podać zmienną, w której zadeklarowaliście odpowiedni moduł, lub po prostu wpisać nazwę algorytmu i jego tryb oddzielone przecinkami. mcrypt_create_iv (rozmiar, źródło) — tworzy wektor IV o podanym rozmiarze na podstawie danych losowych pobieranych ze źródła. Obie zmienne podane w charakterze parametrów muszą być typu int (liczba całkowita). W systemie
Windows jako źródło danych losowych można wykorzystać generatory: MCRYPT_RAND, MCRYPT_DEV_RANDOM oraz MCRYPT_DEV_URANDOM. mcrypt_generic_init (źródło, klucz, wektor_iv) — inicjuje szyfrowanie według parametrów podanych w źródle z wykorzystaniem zadeklarowanego klucza i wektora IV. mcrypt_generic (źródło, dane) — szyfruje dane zgodnie z podanymi w źródle parametrami. Dane są uzupełniane zerami w celu uzyskania długości
podzielnej przez długość bloku. mdecrypt_generic (źródło, dane) — deszyfruje dane zgodnie z parametrami podanymi w zmiennej źródło. mcrypt_generic_deinit (źródło) — kończy szyfrowanie o parametrach określonych przez zmienną źródło. Oznacza to wyczyszczenie odpowiednich
buforów pamięci, ale nie zamknięcie samego modułu. mcrypt_module_close (źródło) — zamyka moduł o określonych w źródle
parametrach. Wszelkie niezamknięte moduły są również zamykane na końcu skryptu, można jednak posłużyć się tą funkcją, jeśli chcecie to zrobić wcześniej.
232
Podstawy kryptografii
Teraz opisane funkcje posłużą do zaszyfrowania zmiennej. Poniżej podano cały skrypt, łącznie z odpowiednimi znacznikami html:
Szyfrowanie algorytmem AES
Skrypt ograniczony jest znacznikami . Deklarowane zmienne poprzedzane są znakiem $, natomiast komenda echo służy do wyświetlania napisów. Jak widać, w pierwszej kolejności deklarowane są zmienne tekst_jawny oraz klucz. Tekst jawny wpisywany jest na ekranie. Oczywiście zamiast deklarować zmienne w skrypcie, można je pobrać z bazy danych, z wypełnionego przez użytkownika formularza lub dowolnego innego źródła obsługiwanego przez PHP. Następnie otwierany jest moduł szyfrowania dla szyfru AES o długości bloku 256 bitów i trybu OFB, po czym wygenerowany zostaje wektor IV o odpowiedniej długości. Rozpoczyna się proces szyfrowania i wywołana zostaje funkcja szyfrująca z odpowiednimi parametrami. Tekst tajny wpisywany jest na ekranie, po czym proces szyfrowania kończy się. Następnie po raz kolejny inicjowany jest proces szyfrowania — tym
Rozdział 4. Kryptografia w praktyce
233
razem z wywołaniem funkcji deszyfrującej. Po zakończeniu operacji dane wyjściowe są wpisywane na ekranie dla porównania z oryginalnym tekstem jawnym. Ostatnim krokiem jest zakończenie procesu szyfrowania i zamknięcie modułu. Teraz strona po uruchomieniu na serwerze powinna wyglądać mniej więcej tak jak na rysunku 4.69. Rysunek 4.69. Szyfrowanie zmiennej algorytmem AES
Zaszyfrowaną zmienną można teraz zapisać w bazie danych, przesłać do kolejnego skryptu lub poddać dalszym przekształceniom. Możliwości jest mnóstwo, dlatego nie będę się tutaj nimi zajmować, tym bardziej że jest to już wiedza związana bardziej ze znajomością samego PHP, a nie kryptografii. Zainteresowanych rozwijaniem swoich umiejętności w tej dziedzinie odsyłam do wspomnianej już książki PHP i MySQL. Tworzenie stron WWW. Vademecum profesjonalisty. Opisano tam wiele możliwości, które stwarza język PHP w połączeniu z bazą danych MySQL. Prawdziwą kopalnią wiedzy na temat PHP jest również strona http://www.php.net/.
4.7.1.4. Kilka pożytecznych uwag I na koniec kilka ogólnych wskazówek. Po pierwsze, warto zaznajomić się z nazwami szyfrów, które wpisywać będziecie w polu nazwa_algorytmu podczas używania funkcji mcrypt_module_open. Można je bowiem wpisywać tak jak w skrypcie (MCRYPT_NAZWA) lub wpisać samą nazwę ujętą w apostrofy (‘nazwa’). W pierwszym przypadku odpowiednią listę nazw znajdziecie na stronie http://php.net/manual/en/mcrypt.ciphers.php. Wpisanie niepoprawnej nazwy algorytmu spowoduje błąd skryptu. Kolejna pułapka wiąże się z wpisywaniem zaszyfrowanych zmiennych do bazy danych. W takim przypadku należy zarezerwować w bazie odpowiednią ilość miejsca. Jeśli na przykład stosujecie algorytm o długości bloku równej 8 znakom (64 bity), w bazie zadeklarowaliście wartość o długości 20 znaków, a szyfrowana w skrypcie zmienna zawiera 18 znaków, nie wystarczy Wam miejsca. Stanie się tak, ponieważ zmienna jest uzupełniana zerami do długości równej wielokrotności bloku, a więc do 24 znaków — i tyle też będzie miała po zaszyfrowaniu. Odszyfrowana zmienna również będzie miała długość 24 znaków, ponieważ dopełnienie nie jest w trakcie całej operacji usuwane. Można je jednak usunąć, używając funkcji rtrim(). Warto również pamiętać, iż jeśli dane wpisywane są w polu bazy danych typu varchar, dopełnienie zostanie automatycznie usunięte jako pusta przestrzeń. Uszkodzi to wpisywane dane, dlatego też zaleca się stosowanie pól typu text lub blob.
234
Podstawy kryptografii
4.7.2. Szyfrowanie danych w MySQL Przejdę teraz do algorytmów szyfrujących zaimplementowanych w systemie zarządzania bazami danych MySQL. Tutaj możliwości są mniejsze niż w przypadku PHP, nadal jednak można uzyskać bezpieczeństwo na wysokim poziomie. Dodatkowo pokażę, jak wykorzystać darmowy program MySQL Front, który znacznie ułatwia pracę z bazą danych SQL.
4.7.2.1. Przykładowe funkcje W MySQL zaimplementowano kilkanaście funkcji pozwalających na szyfrowanie i deszyfrowanie danych. Najważniejsze z nich to: aes_encrypt (dane, klucz) — pozwala na zaszyfrowanie danych wybranym
kluczem. Jest to najbezpieczniejsza z dostępnych w MySQL funkcji. aes_decrypt (kryptogram, klucz) — deszyfruje kryptogram powstały w wyniku działania funkcji aes_encrypt przy użyciu podanego klucza. des_encrypt (dane, klucz) — szyfruje dane z zastosowaniem algorytmu 3DES i wybranego klucza. des_decrypt (kryptogram, klucz) — przekształca kryptogram z powrotem do postaci tekstu jawnego przy użyciu podanego klucza. Szyfrowanie
algorytmem DES jest dostępne w MySQL od wersji 4.0.1. MD5 (dane) — tworzy skrót na podstawie danych przy użyciu jednokierunkowej
funkcji skrótu MD5. SHA (dane) — również tworzy skrót na podstawie danych, jednak
z wykorzystaniem funkcji skrótu SHA. Można tu również używać zapisu SHA1 (dane). SHA2 (dane, długość skrótu) — tworzy skrót danych z wykorzystaniem
algorytmu SHA2. Jako drugi parametr podajemy pożądaną długość skrótu. Dostępne opcje to 224, 256, 384, 512 oraz 0 (odpowiadające długości 256). Ta funkcja jest obecnie uznawana za najbezpieczniejszą i zaleca się stosowanie jej zamiast MD5 oraz pozostałych funkcji skrótu.
4.7.2.2. Szyfrowanie danych Posłużę się teraz prostym przykładem, aby zademonstrować działanie algorytmów kryptograficznych w MySQL. W poniższym przykładzie dysponujemy prostą, składającą się z jednej tabeli bazą danych, zawierającą dane dwóch użytkowników (patrz rysunek 4.70). Dane pierwszego użytkownika zaszyfrowane zostaną algorytmem AES, natomiast dane drugiego — przekształcone w skrót przy użyciu funkcji SHA2. Stosowne komendy MySQL oraz wygląd tabeli po zaszyfrowaniu danych zobaczyć można na rysunku 4.71.
Rozdział 4. Kryptografia w praktyce
235
Rysunek 4.70. Baza przed zaszyfrowaniem danych
Rysunek 4.71. Baza po zaszyfrowaniu danych
Dane można również szyfrować już podczas wprowadzania ich do bazy. Stosuje się wówczas zapis: insert into nazwa_tabeli values (….,AES_ENCRYPT('szyfrowany_tekst','klucz')….);
przy czym wykropkowane miejsca oznaczają pozostałe rekordy wprowadzane do bazy. W przytoczonym przykładzie dane pierwszego użytkownika można odszyfrować, stosując funkcję aes_decrypt(), natomiast danych drugiego użytkownika nie da się przekształcić z powrotem do postaci jawnej. Można je jednak porównywać z wynikami przekształceń innych danych przez funkcję SHA i sprawdzać w ten sposób, czy użytkownik zna zaszyfrowaną wiadomość. Jest to częsty sposób wykorzystania jednokierunkowych funkcji skrótu w kryptografii (patrz rozdział 2.). Jak widać, aby utrudnić kryptoanalizę, przed zaszyfrowaniem danych algorytmem AES hasło przekształcane jest do losowej postaci za pomocą funkcji SHA2. Przechowywanie w bazie danych skrótu informacji znanej jedynie użytkownikowi to bardzo często stosowana forma ochrony hasła dostępu do systemu. Podczas logowania użytkownik podaje hasło, skrypt generuje skrót i porównuje go ze skrótem przypisanym w bazie do użytkownika. Jeśli wartości się zgadzają, system zostaje przyznany. W przypadku złamania zabezpieczeń bazy włamywacz będzie miał dostęp jedynie do skrótów haseł, a jak wiadomo, na ich podstawie nie da się odtworzyć oryginalnego tekstu.
236
Podstawy kryptografii
Wydaje się to bardzo dobrym rozwiązaniem, ale niestety na chwilę obecną ma ono jedną bardzo poważną wadę — istnieje ryzyko ataku tablicowego. Scenariusz takiego ataku zakłada, że włamywacz uzyskuje dostęp do skrótów haseł, które następnie porównuje z tablicą skrótów wygenerowanych wcześniej dla setek tysięcy potencjalnych haseł. Jest to de facto atak słownikowy na funkcję skrótu. W sieci można znaleźć wiele „łamaczy” skrótów, w których po podaniu wyniku przekształcenia np. przez funkcję SHA otrzymujemy oryginalną postać tekstu. Skrypty te nie przekształcają tak naprawdę skrótu w przeciwnym kierunku, a jedynie porównują go z dostępną im bazą par hasło i skrót i podają to pierwsze, jeśli zostanie znalezione. Niemniej jest to spore zagrożenie, tym bardziej że jak już wcześniej wspomniałem, wielu użytkowników nie wybiera zbyt silnych haseł i jest spora szansa, że hash do hasła Marcin123 zostanie błyskawicznie „złamany”. Paradoksalnie wielka zaleta funkcji skrótu — ich szybkość — działa tu na korzyść agresora, umożliwiając mu szybsze generowanie tablic. Co zatem zrobić? Zachęcanie użytkowników do wybierania mocniejszych haseł na pewno nie zawadzi, ale konieczne jest również wprowadzenie ogólnego, programistycznego zabezpieczenia. Przede wszystkim możemy wzbogacić procedurę generowania skrótu o sól, czyli losowy, przypisany do danego użytkownika ciąg znaków, utrudniający włamywaczowi zadanie. Sól dodajemy do hasła przed każdym wygenerowaniem skrótu, dzięki czemu oryginalny ciąg znaków staje się znacznie trudniejszy do odtworzenia z użyciem ogólnodostępnych „łamaczy skrótów”. Jest to rozwiązanie jak najbardziej godne polecenia, jeśli jednak zakładamy najczarniejszy scenariusz (uzyskanie przez osobę niepowołaną dostępu do danych w bazie), musimy również założyć, że takie zabezpieczenie jedynie spowolni przeciwnika — może on teraz stworzyć nowe tablice, dodając wartości soli do wybieranych słownikowo potencjalnych haseł. W odpowiedzi na ten typ zagrożenia pojawiły się dwa godne uwagi zabezpieczenia — bcrypt oraz pbkdf2.
PBKDF2, czyli oparta na haśle funkcja wyprowadzania klucza (ang. Password Based Key Deriviation Function) wykorzystuje wybraną funkcję skrótu, hasło oraz sól w celu stworzenia tzw. rozszerzonego klucza (ang. stretched key). Jej ogólna postać przedstawia się następująco: WK = PBKDF2 (FPS, hasło, sól, i, dlk) gdzie: WK — wyprowadzony klucz; FPS — wybrana funkcja pseudolosowa (md5, sha, gost itp.); hasło — ciąg znaków, na podstawie którego wygenerowany zostanie rozszerzony
klucz; sól — sól zwiększająca losowość hasła; i — liczba iteracji; dlk — pożądana długość klucza.
Rozdział 4. Kryptografia w praktyce
237
Taki klucz (hasło) jest znacznie odporniejszy na złamanie, ponieważ w ramach jego tworzenia skrót jest generowany bardzo wiele razy. Liczba powtórzeń funkcji skrótu określana jest przez parametr i (iteracje). W rezultacie osoba próbująca stworzyć tablice potrzebowałaby znacznie większej mocy obliczeniowej niż w przypadku szybkich, zastosowanych jednokrotnie funkcji skrótu. Jak widać, zabezpieczenie w tym przypadku nie opiera się na nowym, zmyślnym algorytmie szyfrowania, a na takim spowolnieniu procesu generowania skrótu, by stworzenie tablic zawierających ogromną liczbę potencjalnych kluczy stało się bardzo wymagające sprzętowo. W PHP funkcja ta jest dostępna pod postacią hash_pbkdf2(), ale twórcy języka zalecają wykorzystanie do ochrony haseł funkcji bcrypt. Funkcja bcrypt opiera się na podobnym założeniu jak PBKDF2 (spowolnienie procesu tworzenia skrótu jako zabezpieczenie przed atakiem tablicowym), ale zamiast ze standardowych funkcji skrótu korzysta z mechanizmu tworzenia klucza zaprojektowanego w ramach algorytmu Blowfish (patrz dodatek B). Blowfish jest znany z czasochłonności tego elementu szyfrowania, a bcrypt daje dodatkowo możliwość (podobnie jak w PBKDF2) określenia liczby powtórzeń tego etapu tworzenia skrótu (określanych jako koszt). Bcrypt automatycznie stosuje również sól kryptograficzną. Ogólna postać funkcji wygląda więc następująco: WK = bcrypt (hasło, koszt, sól) W PHP (od wersji 5.3) do implementacji algorytmu bcrypt wykorzystywana jest generująca skróty funkcja crypt(). Pobiera ona dwa parametry — hasło oraz sól — przy czym ten drugi określa zarazem stosowaną funkcję skrótu. Aby wykorzystać funkcję MD5, sól musimy rozpocząć od sekwencji znaków $1$, dla SHA256 będzie to $5$, a dla SHA512 — $6$. Przykładowe wywołanie tworzące skrót hasła podanego w parametrze $password za pomocą SHA2 przyjmie więc postać: crypt ($password, '$6$losowasolkryptograficzna$ ')
Co ciekawe, w przypadku SHA256 i SHA512 również możemy sobie zażyczyć, aby wykonanie funkcji skrótu było powtórzone określoną liczbę razy. Wartość tę określamy za pomocą parametru rounds, również podawanego w soli. I tak dla 5000 powtórzeń powyższe wywołanie przyjmuje postać: crypt ($password, '$6$rounds=5000$losowasolkryptograficzna$ ')
Dla bcrypt wywołanie przyjmuje postać: crypt ($password, '$2y$12$losowasolkryptograficzna$ ')
Pierwszy z parametrów przekazanych w ramach soli ($2y) wskazuje algorytm Blowfish (czy też, dla ścisłości, wykorzystywany w jego ramach mechanizm ekstrapolacji klucza). Kolejny ($12) to wspomniany wcześniej koszt. Dla SHA była to po prostu liczba rund, tutaj natomiast określamy wartość logarytmu o podstawie 2 z liczby pożądanych iteracji. Dla wybranej wartości otrzymujemy więc: log2i = 12 liczbę iteracji możemy więc obliczyć jako i = 212 = 4096. Jak łatwo zauważyć, podniesienie tego parametru funkcji o 1 podwaja koszt obliczeniowy generowania skrótu. Koszt może przyjmować wartości z zakresu od 04 do 31. Po zakończeniu działania
238
Podstawy kryptografii
funkcja zwraca ciąg znaków zawierający zadeklarowane parametry, wykorzystaną sól oraz utworzony skrót. Podczas ponownego uwierzytelniania pobieramy ze wspomnianego ciągu parametry i przeprowadzamy proces tworzenia skrótu ponownie. Jeśli wynik zgadza się z rezultatem przechowywanym w bazie, dostęp może zostać przyznany. Zapewne część z czytelników zadaje sobie teraz pytanie: „No dobrze, ale jaka liczba iteracji będzie najodpowiedniejsza?”. Na to pytanie nie da się odpowiedzieć, podając konkretną wartość parametru — już sama konstrukcja funkcji PBKDF2 i bcrypt wskazuje, że poziom bezpieczeństwa powinien być ustalany indywidualnie. Po pierwsze, należy pamiętać, że moc obliczeniowa komputerów stale rośnie, a co za tym idzie, rosną możliwości potencjalnych włamywaczy. Warto więc co jakiś czas (np. co rok lub co 6 miesięcy) zwiększyć wartość kosztu (co może się wiązać z koniecznością zwiększenia mocy obliczeniowej systemu przez zakup nowego sprzętu). Inny czynnik to waga przechowywanych informacji i potencjalny zysk z uzyskania do nich nielegalnego dostępu (patrz rozdział 3.). Generalnie koszt powinien wynosić tyle, ile tylko może „udźwignąć” nasz system bez widocznego i uciążliwego spowolnienia procesu logowania, ale jeśli spełnienie tego warunku wiąże się z ustaleniem kosztu na 7 lub 8, to zdecydowanie warto rozważyć zainwestowanie w nowy sprzęt i optymalizację kodu. Można również przeprowadzić symulację tworzenia tablic dla wykorzystywanych parametrów w celu określenia, ile czasu zajęłoby to w przypadku sprzętu, jakim mógłby się posłużyć potencjalny agresor, i zwiększyć koszt, jeśli uznamy, że zadanie zostało wykonane zbyt szybko.
4.7.3. Kolejne udoskonalenia Kryptograficzne zabezpieczanie baz danych to zagadnienie na tyle złożone, że poświęcane mu są osobne publikacje. Bezpieczeństwo nie sprowadza się w tym przypadku jedynie do zaszyfrowania danych odpowiednim algorytmem i ukrycia klucza. Konieczne jest sporządzenie odpowiedniego projektu dotyczącego struktury całego systemu opartego na bazie danych (Kto ma mieć dostęp do tajnych informacji? Kiedy? Za pośrednictwem jakich aplikacji? Jak przeprowadzamy uwierzytelnianie?). Po opracowaniu zestawu odpowiednich reguł i standardów należy zadbać o ich właściwą implementację, a następnie przestrzeganie (patrz podrozdział 3.1). Przeszukiwanie zaszyfrowanych danych może nastręczyć pewnych trudności. Odszyfrowywanie wszystkich rekordów w celu wyszukania tylko jednego z nich jest niezwykle czasochłonne. Problem ten zwykle rozwiązuje się, pozostawiając niewielki fragment danych (na przykład inicjały klienta lub użytkownika) niezaszyfrowany. W trakcie przeszukiwania najpierw wybierane są wiersze pasujące do podanego warunku na podstawie niezaszyfrowanego elementu. W ten sposób możemy znacznie zmniejszyć ilość odszyfrowywanych danych. Osobnym zagadnieniem jest zarządzanie kluczami. W przypadku dużych baz danych bardzo szybko następuje zmęczenie stosowanych kluczy — zwłaszcza jeśli mają one szeroki zakres (są stosowane do wielu kolumn w bazie danych). Konieczne jest zatem ich regularne wymienianie, które wymaga odszyfrowania tajnych danych, zaszyfrowania ich nowym kluczem i ponownego zapisania w bazie. Problemy związane ze zmęczeniem kluczy również można minimalizować, dzieląc dane na osobne tabele
Rozdział 4. Kryptografia w praktyce
239
korzystające z indywidualnych kluczy. Dobrym pomysłem jest również zmniejszenie zakresu poszczególnych kluczy (można nawet stosować osobne klucze dla każdej z kolumn). Pojawia się zatem problem zarządzania tak dużą liczbą kluczy. Rozwiązać go można za pomocą tzw. sejfu na klucze. Jest to osobny element systemu, często umieszczony na dedykowanym sprzęcie. Pozwala on na dostęp do kluczy wyłącznie oprogramowaniu kryptograficznemu oraz wybranym osobom odpowiedzialnym za bezpieczeństwo. Maszyna dedykowana jest bardziej kosztowna (wymaga osobnego sprzętu i indywidualnej instalacji) od maszyny lokalnej (stanowiącej po prostu dodatkową bibliotekę dla aplikacji), ma jednak następujące zalety: Zapewnia większe bezpieczeństwo poprzez umieszczenie i zabezpieczenie
klucza z dala od aplikacji, co ogranicza niepowołany dostęp. Szyfrowanie przenoszone jest na inny procesor, często zaprojektowany z myślą
o wykonywaniu określonego algorytmu, co zwiększa ogólną wydajność systemu. Pamięć maszyny nie jest współdzielona z innymi aplikacjami, co również
ogranicza potencjalne możliwości ataku. Popularnym rozwiązaniem jest również zastosowanie klucza do szyfrowania kluczy. Może się to wydawać dziwne, jednak kryptografia sprowadza się do zastępowania wielu sekretów jednym, który łatwiej ukryć. Dlaczego więc nie mielibyśmy zabezpieczyć w ten sposób również dużej liczby kluczy? Dodatkowym utrudnieniem jest konieczność wykonywania kopii zapasowych przechowywanych danych. Muszą one podlegać równie ścisłej ochronie co dane na bieżąco wykorzystywane w systemie. Dotyczy to zwłaszcza kopii zapasowych kluczy szyfrowania. Klucze wycofane z użytku warto przechowywać (przynajmniej przez pewien czas) w osobnym, dobrze zabezpieczonym archiwum — na wypadek gdyby w trakcie ponownego szyfrowania powiązanych z nimi danych nowymi kluczami pominięto niektóre kolumny. Gdyby tak się zdarzyło, brak starego klucza oznaczał będzie brak dostępu do określonych danych. Mnogość operacji związanych z kluczami wymusza konieczność opracowania specjalnego oprogramowania umożliwiającego zarządzanie nimi — menedżera kluczy. Umożliwia on zautomatyzowanie licznych operacji związanych z tworzeniem, aktualizowaniem i usuwaniem kluczy, jednak sam również musi być dobrze zabezpieczony. Jak widać, kryptograficzne zabezpieczanie baz danych jest zagadnieniem niezwykle skomplikowanym. Nie wystarczy zastosować bezpieczny algorytm w odpowiednim trybie szyfrowania. Konieczne jest opracowanie systemu o odpowiedniej (ograniczającej niepowołany dostęp) strukturze, jego odpowiednia implementacja i stałe kontrolowanie. Pozycja Kryptografia w bazach danych. Ostatnia linia obrony (patrz Bibliografia) została w całości poświęcona tym właśnie zagadnieniom.
240
Podstawy kryptografii
Podsumowanie Historia kryptografii uczy, iż nie ma szyfrów doskonałych. Owszem, istnieje szyfr z kluczem jednorazowym, oferujący doskonałe bezpieczeństwo, jednak posiada on wady uniemożliwiające stosowanie go na szerszą skalę. Idealne kryptosystemy istnieją jedynie na papierze. W rzeczywistości ich założenia nie sprawdzają się już tak dobrze. Przyczyny tego stanu rzeczy mogą być różne. Czasem winę ponosi projektant systemu, który nie przewidział danego zagrożenia. Należy jednak pamiętać, iż przewidzenie każdego potencjalnego ataku jest po prostu niemożliwe. Współczesne systemy komputerowe są zwyczajnie zbyt złożone, by móc analizować każdą ewentualność. Wprowadza się więc zabezpieczenia przed znanymi atakami, a także tymi wszystkimi, które da się przewidzieć. Zwykle jednak wkrótce pojawia się kolejna możliwość, o której nikt (z wyjątkiem włamywacza) nie pomyślał. Bez przerwy słyszymy o kolejnych „dziurach” w systemach operacyjnych lub oprogramowaniu, wykorzystanych przez włamywaczy w celu wyrządzenia szkód lub zdobycia tajnych informacji. Z tej przyczyny nawet świetnie dopracowany algorytm szyfrujący może okazać się bezużyteczny. Tworzenie takiego algorytmu to zupełnie inna historia. Kwestii pisania programów szyfrujących poświęcono wiele książek, co jest najlepszym dowodem na to, jak długa i skomplikowana droga dzieli nas od doskonałej, matematycznej postaci szyfru do jego implementacji w postaci programu. Tak naprawdę pewność co do jakości programu uzyskać można dopiero po długim okresie testowania. Z tego względu twórcy nowych algorytmów często wyznaczają nagrodę za ich złamanie i prezentują je na różnych konferencjach tematycznych, gdzie poddawane są one wnikliwej analizie. Taka „próba czasu” to najlepszy sposób oceny bezpieczeństwa produktu. Dopiero jeśli algorytm ją przetrwa, można uznać go za bezpieczny. Kolejny problem to sposoby użytkowania systemu, a ściślej mówiąc — jego użytkownicy. W rozdziale 4. była mowa o znaczeniu czynnika ludzkiego w zabezpieczaniu danych. Udostępnianie haseł lub kluczy, nadmierne zaufanie w stosunku do innych użytkowników, a czasem nawet obcych osób, zdradzanie poufnych informacji, nieprzestrzeganie procedur bezpieczeństwa i wiele innych czynników wynikających z braku znajomości lub lekceważenia zagrożeń może doprowadzić do wycieku poufnych danych.
242
Podstawy kryptografii
Niebagatelną rolę w tym wszystkim odgrywa podejście producentów oprogramowania. Tak naprawdę nie mają oni bowiem interesu w produkowaniu naprawdę bezpiecznych systemów. Za bezpieczeństwo sieci odpowiedzialny jest administrator, a nie producent stosowanego w niej oprogramowania. Ten drugi może obawiać się jedynie kilku zgryźliwych artykułów w prasie i utraty paru klientów na rzecz konkurencji. Jeśli jednak wziąć pod uwagę koszty tworzenia bezpiecznego oprogramowania, jest to ryzyko jak najbardziej opłacalne. Kwestie bezpieczeństwa rozwiązuje się więc „doraźnie”, wypuszczając uaktualnienia lub nowe wersje programów. Opisany problem jest jednak bardziej kwestią odpowiednich aktów prawnych (umożliwiających pociągnięcie do odpowiedzialności producentów oprogramowania) niż rozwiązań technologicznych. Być może większe ryzyko finansowe w wypadku kompromitacji systemu uczyni opłacalnymi wydatki na tworzenie systemów bezpiecznych. Wspomniana wcześniej złożoność to równie istotny czynnik. Generalnie im bardziej złożony system, tym mniejsze jego bezpieczeństwo. Trzeba jednak pamiętać, iż złożoność systemów wynika z chęci uczynienia ich bardziej przyjaznymi dla użytkownika. Ograniczenie złożoności sprowadzałoby się do zlikwidowania wielu opcji, udogodnień i „bajerów”, które użytkownicy czasem bardzo lubią i do których zdążyli się już przyzwyczaić. W związku z tym system taki byłby znacznie mniej atrakcyjny i cieszyłby się mniejszym powodzeniem. Również dlatego produkowanie bezpiecznego oprogramowania jest mniej opłacalne. Tak naprawdę do rzadkości należą ataki na algorytmy szyfrujące. Z reguły o wiele prostszym i bardziej opłacalnym sposobem jest wykorzystanie wspomnianych błędów w systemie operacyjnym, zastraszenie lub wykorzystanie naiwności użytkowników, podsłuchiwanie, grzebanie w śmieciach firmy itp. Wszystko to uzmysławia, iż kryptografia jest tylko niewielką częścią systemu zabezpieczania informacji. Niewielką, ale za to niezwykle istotną. Osiągnięcia w tej właśnie dziedzinie doprowadziły do powstania programów takich jak PGP, dzięki którym każdy z nas może w profesjonalny sposób zabezpieczyć swoje dane. Zwiększyły również bezpieczeństwo komunikacji i dały nowe możliwości twórcom systemów zabezpieczania danych. W ten sposób dotarliśmy do końca książki. Ufam, iż spełniła ona swoje zadanie i rozumiecie już teraz, czym jest kryptografia, co można dzięki niej uzyskać i jak najefektywniej wykorzystać drzemiący w niej potencjał. Być może zmobilizowała Was ona również do rozpoczęcia własnych poszukiwań i badań na tym polu. Jeśli tak, z pewnością przyda Wam się literatura wymieniona w Bibliografii. Mam nadzieję, iż książka ta okazała się dla Was zarówno pouczającą, jak i satysfakcjonującą lekturą.
Dodatek A
Jednokierunkowe funkcje skrótu W tym dodatku przedstawione zostały najpopularniejsze spośród jednokierunkowych funkcji skrótu — MD5, SHA-1, SHA-2 oraz SHA-3. Mogą one być implementowane w niezależnych programach, jeśli tylko są zdefiniowane w bibliotekach stosowanego języka. W poprzednich rozdziałach książki wspomniałem już, że służą one do generowania skrótów dużych wiadomości, co ułatwia dokonywanie podpisów i sprawdzanie poprawności przesyłanych danych.
A.1. MD5 Algorytm MD5 (skrót od ang. Message Digest — skrót wiadomości) został opracowany przez Rona Rivesta, współtwórcę algorytmu RSA. Algorytm ten jest funkcją skrótu przekształcającą 512-bitowe bloki danych w bloki 128-bitowe. Wykorzystano go m.in. w pakiecie PGP i protokole SSL.
A.1.1. Przekształcenia początkowe Tekst jawny uzupełniany jest ciągiem bitów w taki sposób, aby był o 64 bity krótszy od wielokrotności 512. Uzupełnienia dokonuje się, wstawiając na końcu wiadomości jedynkę i stosowną liczbę zer. Następnie dołączane są 64 bity określające pierwotną długość algorytmu. Po przygotowaniu ciągu wejściowego inicjowane są cztery zmienne łańcuchowe o następujących wartościach: A = 0x01234567 B = 0x89abcdef C = 0xfedcba98 D = 0x76543210
244
Podstawy kryptografii
512-bitowe bloki wiadomości są dzielone na trzydzieści dwie 16-bitowe części i rozpoczyna się główna pętla algorytmu.
A.1.2. Pętla główna MD5 Pętla szyfrowania MD5 dla pojedynczego bloku składa się z czterech cykli (patrz rysunek A.2). Każdy z nich oparty jest na innej funkcji nieliniowej i składa się z szesnastu operacji. Przed rozpoczęciem pierwszego cyklu wartości zmiennych A, B, C, D są przypisywane zmiennym: a, b, c, d. W poszczególnych cyklach wykorzystywane są następujące funkcje: F ( X , Y , Z ) ( X Y ) (X ) Z G ( X , Y , Z ) ( X Z ) (Y (Z )) H ( X ,Y , Z ) X Y Z I ( X , Y , Z ) Y ( X (Z ))
Rysunek A.1. Podstawowa pętla algorytmu MD5
gdzie: — sumowanie modulo 2 (XOR), — iloczyn logiczny, — suma logiczna, ¬ — negacja. W każdym cyklu wykonywanych jest szesnaście operacji matematycznych (patrz rysunek A.3) określonych następującymi wzorami: FF (a, b, c, d , M j , s, t ) a b ((a F (b, c, d ) M j ti ) s ) GG (a, b, c, d , M j , s, t ) a b ((a G (b, c, d ) M j ti ) s )
Dodatek A Jednokierunkowe funkcje skrótu
245
HH (a, b, c, d , M j , s, t ) a b ((a H (b, c, d ) M j ti ) s ) II (a, b, c, d , M j , s, t ) a b ((a I (b, c, d ) M j ti ) s )
gdzie: Mj — podblok wiadomości, ti — stała zależna od cyklu,