Zastosowania i możliwości współczesnej kryptografii

Współczesna kryptografia daje dziś ogromne możliwości zarówno w sferze ochrony danych jak i kontroli dostępu. Choć podstawowe koncepcje pozostały niezmienione na przestrzeni lat, to błyskawiczny rozwój konkretnych technologii sprawił, że kryptografia stała się niemal odrębną dziedziną wiedzy.

Stronę tą tworzymy w celu prezentacji poszczególnych mechanizmów kryptograficznych przez pryzmat ich praktycznych zastosowań.

Spis treści:

Funkcje skrótu

Problem: Wyobraźmy sobie bazę danych, która przechowuje duże obiekty binarne (na przykład zdjęcia). Ich bezpośrednie wyszukiwanie w bazie jest bardzo czasochłonne. Dlatego warto byłoby dysponować jakimś niewielkim obiektem, niejako odciskiem palca tego dużego. Wtedy wyszukiwanie można prowadzić po mniejszych obiektach, a porównanie dużych obiektów byłoby wykonywane jedynie w przypadku zgodnych odcisków.

Rozwiązanie: Własności idealne do tego zastosowania mają kryptograficzne funkcje skrótu. Ich zasadniczym celem jest wygenerowanie takiego odcisku palca. Dodatkową ich własnością jest to, że na podstawie samego odcisku palca trudno jest znaleźć obiekt, do którego on należy. Czy ma to jakiekolwiek znaczenie? Okazuje się, że w pewnych przypadkach własność ta jest bardzo istotna. Co jakiś czas pojawiają się bowiem ataki na bazy danych, które używają słabych, z kryptograficznego punktu widzenia, funkcji skrótu. Typowy atak polega na umieszczeniu w bazie wielu różnych danych o tym samym skrócie. Efektem tego jest spowolnienie działania całego systemu, czasami tak duże, że zupełnie traci on swoją funkcjonalność. Dlatego też warto w takich przypadkach stosować jedynie kryptograficzne funkcje skrótu.

Protokoły uwierzytelniania

Problem: Powiedzmy, że projektujesz system, który dysponuje bardzo ograniczonymi zasobami. Przyjmijmy też, że jednym z wymogów jakie musisz spełnić jest możliwość wzajemnego uwierzytelniania się jego składników. Najbardziej oczywistym sposobem rozwiązania takiego problemu jest zastosowanie podpisu elektronicznego. Praktyczna realizacja może jednak być niemożliwa ze względu na małą ilość pamięci lub niewielką moc obliczeniową. Czy w takiej sytuacji jesteś zmuszony do rezygnacji z wymagań postawionych w tym zakresie?

Rozwiązanie: Przy nietypowych projektach polecamy wybór odpowiedniego rozwiązania z całej gamy protokołów uwierzytelnienia. Dają one możliwość takiego manipulowania parametrami, które pozwoli na:

Pamiętaj, że podpis elektroniczny nie jest jedyną metodą, która pozwala na uwierzytelnianie się stron. Dobieraj takie rozwiązania, które będą optymalne pod kątem wykorzystania w Twoim systemie (zwłaszcza jeśli ma on zamkniętą architekturę).

Proof of Work

Problem: Wyobraź sobie, że tworzysz rozwiązanie typu klient-serwer, które ma funkcjonować również w sieci internet. Do zabezpieczenia przesyłanych danych możesz użyć algorytmów szyfrowania i podpisu elektronicznego. W wielu przypadkach wystarczające jest wykorzystanie protokołu TLS. Protokół ten nie zawiera jednak żadnego mechanizmu chroniącego przed atakami DoS (Denial of Service). W tym przypadku atak może polegać na zmuszeniu serwera do wykonania setek zbędnych operacji kryptograficznych. W efekcie serwer stanie się praktycznie niedostępny, co uniemożliwi normalną pracę użytkownikom systemu.

Rozwiązanie: Jedną z najbardziej skutecznych metod ochrony przed atakiem na opisany system będzie wprowadzenie mechanizmu Proof of Work. Jego idea polega na tym, że przed rozpoczęciem jakichkolwiek obliczeń serwer wysyła klientowi polecenie wykonania pewnego zadania. Zadanie to jest skonstruowane w taki sposób, że znalezienie rozwiązania jest dość czasochłonne, a weryfikacja odpowiedzi bardzo szybka. W ten sposób serwer zmusza nieuczciwych klientów do wykonywania skomplikowanych obliczeń, co znacznie ogranicza możliwości atakującego. Dobór odpowiedniego zadania nie jest jednak rzeczą łatwą i wymaga wykorzystania odpowiednich mechanizmów kryptograficznych.

Protokoły uzgadniania kluczy

Problem: Rozważmy projekt urządzeń, które mają mieć zapewnioną możliwość nawiązania bezpiecznego połączenia z serwerem. Najprostszą metodą zrealizowania takiej funkcjonalności jest zaszycie we wszystkich urządzeniach tego samego klucza. Jest to również najtańsza opcja, jeżeli brać pod uwagę jedynie koszt budowy systemu. Należy jednak zauważyć, że uzyskanie dostępu do klucza w którymkolwiek urządzeniu rozkłada cały system. Co można zrobić w takiej sytuacji?

Rozwiązanie: Można do każdego urządzenia załadować inny klucz, ale to zmusza nas do trzymania wszystkich kopii kluczy na serwerze. W niektórych przypadkach zarządzanie tymi kluczami może się okazać zbyt kłopotliwe. Rozwiązaniem jest wtedy zastosowanie protokołów uzgadniania kluczy (na przykład protokół Diffiego-Hellmana). Ich idea polega na wymianie pomiędzy stronami informacji publicznych, które są następnie przetwarzane przez każdą ze stron. Podczas tych obliczeń obie strony protokołu są w stanie uzgodnić wspólną wartość, która jest nieznana innym i może stanowić zalążek klucza. Do takiego systemu wystarczy jeszcze dodać podpis elektroniczny lub protokół uwierzytelnienia, aby otrzymać pożądany efekt.

Bezpieczne obliczenia wielostronne

Problem: Rozważmy problem wyznaczania średniej pensji w grupie trzech lub więcej osób. Oczywiście najprostszym sposobem jej wyznaczenia jest podanie wynagrodzenia każdej osoby w postaci jawnej, zsumowanie danych i wyznaczenie średniej. Jest to oczywiście rozwiązanie najprostsze tylko w przypadku, gdy wszyscy uczestnicy zdecydują się podać swoje zarobki do wiadomości publicznej, co już nie jest takie oczywiste. Czy można ten problem rozwiązać inaczej?

Rozwiązanie: Z pomocą przychodzą tutaj metody bezpiecznych obliczeń wielostronnych. Polegają one na wyznaczaniu wartości pewnej funkcji (w tym przypadku średniej arytmetycznej) na zbiorze poufnych danych. Aby lepiej zrozumieć ich ideę rozważmy następujący sposób postępowania w przypadku wyznaczania średniej pensji

Powyższy schemat postępowania ma się oczywiście nijak do metod wykorzystujących obliczenia komputerowe. Niemniej jednak dobrze obrazuje możliwości systemów wykonujących bezpieczne obliczenia wielostronne.

Szyfry homomorficzne

Problem: Załóżmy, że mamy do czynienia z koniecznością przekazania komuś dość wrażliwych informacji (na przykład profili DNA). Informacje takie w postaci jawnej mogą być wykorzystane również do innych celów (identyfikacyjne profile DNA mogą służyć do uzyskania danych biomedycznych). W takiej sytuacji rodzi się pytanie, czy możliwe jest przekazanie danych w taki sposób, aby:

Rozwiązanie: Idealnym rozwiązaniem tego problemu są tak zwane szyfry homomorficzne. Są one tak skonstruowane, że wykonywanie pewnych operacji na szyfrogramach daje taki sam efekt jak wykonanie operacji na treści jawnej. Jeśli h jest funkcją szyfrującą o tej własności, a x i y są tekstami jawnymi, to

h(x) + h(y) = h(x * y).

Możemy więc w odpowiedni sposób zaszyfrować cały zestaw liczb, a ktoś inny może na tych szyfrogramach wykonać funkcję odpowiadającą operacji dodawania wartości jawnych. Gdy odszyfrujemy wynikowy szyfrogram okaże się, że przedstawia on sumę wcześniej wybranych liczb. Jest to więc metoda, która pozwala na udostępnienie operacji na konkretnych danych, bez konieczności przekazywania ich w postaci jawnej.

Podział sekretu

Problem: Przyjmijmy, że chcesz stworzyć pewną funkcjonalność, która może być wykorzystana jedynie w przypadku, gdy dwie spośród trzech uprawnionych osób wyrażą na to zgodę. Z tego typu problemami mamy zazwyczaj do czynienia w dużych organizacjach, które chcą wyeliminować możliwość ewentualnych nadużyć.

Rozwiązanie: Z pomocą przychodzą nam tym przypadku mechanizmy podziału sekretu. Pozwalają one w taki sposób podzielić poufną informację (na przykład hasło zabezpieczające daną funkcjonalność), że jedynie określona grupa osób będzie w stanie ją odtworzyć. Taki mechanizm pozwala na budowanie skomplikowanych systemów kontroli dostępu, które wymuszają na użytkownikach konieczność stosowania określonych procedur.