Praktyczne protokoły prywatnego pozyskiwania informacji
Transkrypt
Praktyczne protokoły prywatnego pozyskiwania informacji
Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki Tomasz Jadachowski Nr albumu: 181263 Praktyczne protokoły prywatnego pozyskiwania informacji Praca magisterska na kierunku INFORMATYKA w zakresie OPROGRAMOWANIA I METOD INFORMATYKI Praca wykonana pod kierunkiem dra Stefana Dziembowskiego Instytut Informatyki Styczeń 2005 Oświadczenie kierującego pracą Oświadczam, że niniejsza praca została przygotowana pod moim kierunkiem i stwierdzam, że spełnia ona warunki do przedstawienia jej w postępowaniu o nadanie tytułu zawodowego. Data Podpis kierującego pracą Oświadczenie autora pracy Świadom odpowiedzialności prawnej oświadczam, że niniejsza praca dyplomowa została napisana przeze mnie samodzielnie i nie zawiera treści uzyskanych w sposób niezgodny z obowiązującymi przepisami. Oświadczam również, że przedstawiona praca nie była wcześniej przedmiotem procedur związanych z uzyskaniem tytułu zawodowego w wyższej uczelni. Oświadczam ponadto, że niniejsza wersja pracy jest identyczna z załączoną wersją elektroniczną. Data Podpis autora pracy Streszczenie W pracy tej rozważamy protokoły prywatnego pozyskiwania informacji, koncentrując się na ich praktycznych aspektach. Rozpoczniemy od zdefiniowania zagadnienia i opisania co oznacza, że protokół prywatnego pozyskiwania informacji jest bezpieczny w różnych modelach obliczeniowych. Następnie, koncentrując się na modelu obliczeniowym, zaprezentujemy protokoły prywatnego pozyskiwania informacji i udowodnimy ich bezpieczeństwo opierając się na trudności rozwiązania problemu należenia do podgrupy. Przedstawimy też protokoły prywatnego wyszukiwania słów kluczowych, umożliwiające bardziej praktyczne wykorzystanie protokołów prywatnego pozyskiwania informacji. Wszystko to wykorzystamy do zaprezentowania praktycznej aplikacji implementującej wyżej wymienione protokoły. Opiszemy także użyte optymalizacje protokołów i osiągnięte wyniki wydajnościowe na praktycznym zbiorze danych oraz wskażemy przyszłe kierunki rozwoju, tej stosunkowo młodej dziedziny jaką jest prywatne pozyskiwanie informacji. Słowa kluczowe Private Information Retrieval, PIR, Symmetrically Private Information Retrieval, SPIR, Subgroup Membership Problem, PERKY, prywatne pozyskiwanie informacji, symetryczne prywatne pozyskiwanie informacji, wyszukiwanie po słowach kluczowych, problem należenia do podgrupy, reszty kwadratowe, decyzyjny problem Diffiego-Hellmana Dziedzina pracy (kody wg programu Socrates-Erasmus) 11.3 Informatyka Klasyfikacja tematyczna 68 Computer Source 68P Theory of Data 68P20 Information storage and retrieval 68P25 Data encryption Spis treści Wstęp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1. Wprowadzenie do prywatnego pozyskiwania informacji . . . . . . . . . 1.1. Nieformalnie o prywatnym pozyskiwaniu informacji . . . . . . . . . . . . . 1.2. Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Motywacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Podstawowe definicje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1. Prywatne pozyskiwanie informacji (Private Information Retrieval) 1.4.2. Bezpieczeństwo PIR . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.3. Decyzyjny problem reszt kwadratowych . . . . . . . . . . . . . . . 1.4.4. Decyzyjny problem Diffiego-Hellmana . . . . . . . . . . . . . . . . 1.4.5. Problem należenia do podgrupy . . . . . . . . . . . . . . . . . . . . 1.5. Warianty prywatnego pozyskiwania danych . . . . . . . . . . . . . . . . . 1.5.1. Teorio-informacyjny 1-serwerowy PIR . . . . . . . . . . . . . . . . 1.5.2. Inne modele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 8 9 9 10 10 12 14 15 15 16 2. 1-serwerowy obliczeniowy PIR . . . . . . . . . . . 2.1. Uogólniony protokół Kushlevitza i Ostrovskyego 2.1.1. Uproszczona wersja protokołu . . . . . . . 2.1.2. Właściwy protokół . . . . . . . . . . . . . 2.1.3. Przykład . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 19 21 24 3. Prywatne wyszukiwanie słów kluczowych . . . . . . . . . . . . . . . . . . . . 3.1. Praktyczne zastosowanie uogólnionego protokołu Kushlevitza i Ostrovskyego 3.2. Podstawowe definicje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1. Uogólniony PIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2. PERKY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3. Porównanie PIR i PERKY . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Wyszukiwanie informacji po słowach kluczowych . . . . . . . . . . . . . . . . 3.3.1. Wyszukiwanie binarne . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2. Wyszukiwanie prefiksowe . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3. Wzmocnienie protokołu PERKY (wyszukiwanie prefiksowe) . . . . . . 27 27 27 28 28 28 29 29 29 31 4. Implementacja . . . . . . . . . . . . . . . . 4.1. Narzędzia . . . . . . . . . . . . . . . . . 4.2. Przyjęte założenia . . . . . . . . . . . . 4.2.1. Długość klucza . . . . . . . . . . 4.3. Architektura implementacji . . . . . . . 4.3.1. Dekompozycja logiczna systemu 33 33 33 33 34 34 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2. Najważniejsze komponenty . . . . . . . . . . . . . . . . . . . . . . . . 4.4. Osiągnięte rezultaty (testy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 36 5. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1. Wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Kierunki rozwoju . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 41 A. Zawartość płyty CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 B. Działanie aplikacji . . B.1. Kompilacja . . . . B.2. Uruchamianie . . . B.3. Działanie aplikacji . . . . 45 45 45 47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wstęp W ciągu ostatnich lat obserwujemy znaczny wzrost liczby użytkowników sieci Internet na całym świecie. Coraz więcej spraw załatwianych jest drogą elektroniczną. Szeroko stosowane są techniki kryptograficzne, w tym podpis elektroniczny i szyfrowanie kluczem publicznym, jednak i one są niewystarczające. Większość używanych dziś internetowych systemów informatycznych, takich jak sklepy internetowe czy serwisy informacyjne, korzysta z architektury klient - serwer. Systemy te są coraz bardziej liczne i mają coraz więcej użytkowników (klientów). Wiedza o preferencjach użytkownika nabiera więc coraz większej wartości. Może być jednak ona wykorzystana przeciwko użytkownikowi. Przez długi czas przyjmowano, że będzie ona tajemnicą dla wszystkich za wyjątkiem serwera. Zakładano, że serwer nie zastosuje wiedzy o użytkowniku przeciwko niemu. Założenie to jest jednak bezpodstawne. Jedna z największych firm zajmujących się sprzedażą online (szczegóły można znaleźć w [1]) uznała, że jej baza zawierająca miliony profili użytkowników i ich preferencji handlowych jest częścią kapitału firmy, a zatem może stać się przedmiotem umowy handlowej. W szczególności baza może więc być sprzedana innej firmie bez zgody użytkowników. Jest nawet gorzej. Serwer, choć uczciwy, może mieć poważne luki w zabezpieczeniach, co pozwala na kradzież informacji o użytkownikach. Ocenia się, że około 50% największych serwerów internetowych naraża w ten sposób prywatność swoich użytkowników na szwank. Firma może być również zmuszona do sprzedaży bazy z informacjami o użytkownikach na skutek bankructwa. W dzisiejszych czasach bezpieczeństwo preferencji użytkownika zależne jest więc w dużej mierze od dobrej kondycji firmy, od zabezpieczeń przez nią stosowanych, a także jej uczciwości. Jasne jest, że czynniki te nie będą wszystkie wiecznie spełnione. Choć wydaje się to niemożliwe, krokiem w kierunku rozwiązania tego problemu jest technika pozwalająca użytkownikowi utrzymywać swoje preferencje w tajemnicy przed serwerem. Nazywana jest ona w literaturze prywatnym pozyskiwaniem informacji ( ang. Private Information Retrieval) w skrócie PIR. Ogólnie i nieformalnie mówiąc, prywatne pozyskiwanie informacji umożliwia użytkownikowi pobranie pewnych informacji od serwera, zgodnie z jego preferencjami, w taki sposób, że serwer nie wie jakie to informacje pobiera użytkownik. By to osiągnąć klient koduje swoje zapytanie i przesyła je do serwera, który to przetwarza je, a następnie powstałą odpowiedź wysyła do klienta. Następnie klient odkodowuje odpowiedź i poznaje rezultat zapytania. Od momentu sformalizowania w 1995 roku pierwszego protokołu PIR, powstały setki prac, z wieloma analizami i nowymi protokołami. Większość z nich dotyczy jednak przypadku gdzie zakłada się istnienie kilku serwerów, posiadających tę samą kopię bazy danych i nie mogących komunikować się ze sobą. My skoncentrujemy się tylko na przypadku, w którym istnieje tylko jeden serwer, podając tylko niektóre fakty w formie ogólniejszej. Przypadek ten jest najbardziej praktyczny i bezpieczny, gdyż nie musimy zakładać wtedy braku komunikacji 5 pomiędzy serwerami. W pracy tej dokonamy krótkiego przeglądu jednoserwerowych protokołów prywatnego pozyskiwanie informacji i szczegółowo zanalizujemy jeden z nich. Wybór protokołu będzie uzasadniony jego dużym bezpieczeństwem (przedstawiony będzie jego pełny dowód bezpieczeństwa) i łatwością zaaplikowania do rzeczywistych warunków. Postawimy sobie za zadanie, zbadanie przy jakiej ilości informacji serwer jest w stanie, w rozsądnym czasie udzielić odpowiedzi i jak dużo danych musi przekazać w odpowiedzi na zapytanie użytkownika oraz jak duże musi być to zapytanie. Pokażemy również jak można wykorzystać protokoły PIR w praktyce, poprzez zaprezentowanie aplikacji z opisanymi w pracy protokołami. W rozdziale 1 przedstawimy podstawowe definicje wprowadzające do tematyki PIR. Rozdział 2 przedstawia opis uogólnionego protokołu PIR Kushlevitza i Ostrovskyego. W rozdziale 3 przedstawimy protokół umożliwiający prywatne wyszukiwanie informacji po słowach kluczowych. W kolejnym rozdziale 4 przedstawimy ogólną architekturę aplikacji implementującej przedstawione wcześniej protokoły oraz zaprezentujemy jej analizę wydajnościową. W ostatnim rozdziale 5 podsumujemy otrzymane rezultaty oraz wskażemy co obecnie jest wąskim gardłem protokołów PIR. 6 Rozdział 1 Wprowadzenie do prywatnego pozyskiwania informacji 1.1. Nieformalnie o prywatnym pozyskiwaniu informacji PIR jest pojęciem charakteryzującym protokoły pomiędzy dwiema stronami, serwerem (w ogólności serwerów może być kilka, ale dla zaprezentowania idei założymy, że jest tylko jeden) zarządzającym bazą danych i użytkownikiem chcącym dowiedzieć się pewnych informacji z bazy danych. Informacje te, użytkownik chce otrzymać w taki sposób, by serwer nie dowiedział się ”nic” o preferencjach użytkownika. Najprostszym rozwiązaniem tak postawionego problemu jest wysłanie przez serwer do użytkownika całej zawartości bazy danych. W ten sposób użytkownik pozna informację którą chciał uzyskać, bo pozna całą zawartość bazy danych. Jasne jest, że takie rozwiązanie jest nie do przyjęcia z dwóch powodów: • po pierwsze baza danych może być zbyt duża, żeby w rozsądnym czasie dało się ją przesłać łączem internetowym, • a po drugie serwer może nie chcieć zdradzać wszystkich informacji zawartych w bazie danych (np. w przypadku dokonywania płatności za każdą pobraną informację przez użytkownika), poza jedną. Zadaniem praktycznych protokołów PIR jest więc minimalizacja komunikacji pomiędzy serwerem i użytkownikiem, a także utajnianie informacji zawartych w bazie danych, poza jedną informacją, którą użytkownik chce poznać. Gdy mamy doczynienia z większą ilością serwerów, każdy z nich przechowuje tę samą kopię bazy danych. Zakłada się wtedy brak współpracy (wymiany informacji o komunikacji z użytkownikiem) ze strony tych serwerów. Jest to dość silne założenie, lecz w pewnych przypadkach model ten jest akceptowalny. Zwykle bazę danych traktuje się jako wektor n bitów, natomiast zapytanie użytkownika jako pytanie o wartość i-tego bitu. Napotykamy jednak tutaj na pewien problem. Skąd użytkownik ma wiedzieć który bit go interesuje? W dalszej części pracy pokażemy w jaki sposób korzystając z protokołów PIR, skonstruować protokół wyższego poziomu, dzięki któremu możemy dowiedzieć się gdzie znajduje się interesujący nas bit. 1.2. Historia Prywatne pozyskiwanie informacji jest stosunkowo nową dziedziną kryptografii, sformalizowaną przez Chora, Goldreicha, Kushlevitza i Sudana ([2]) w 1995 roku. Przedstawili oni wte7 dy protokół PIR, bezpieczny w modelu teorio-informacyjnym. Niestety schemat ten nie jest zbyt praktyczny ponieważ wymaga więcej niż jednego serwera przechowującego tę samą bazę danych, przy założeniu braku komunikacji pomiędzy poszczególnymi serwerami. Niepraktyczność tego protokołu jest również wynikiem wyboru modelu teorio-informacyjnego, w którym przyjmuje się, że serwery posiadają nieskończoną moc obliczeniową. W takim przypadku (jak pokazano również w tej pracy), gdy istnieje jeden serwer, niemożliwe jest skonstruowanie bezpiecznego protokołu PIR o lepszej złożoności komunikacyjnej niż protokół przesyłający całą zawartość bazy danych do użytkownika. W 1997 roku Chor i Gilboa ([3]) przedstawili protokół PIR bezpieczny w modelu obliczeniowym, czyli zakładając pewne ograniczenia na moc obliczeniową serwerów. Niestety i ten protokół wymagał istnienia więcej niż jednego serwera. Przełomowa pod tym względem okazała się praca Kushlevitza i Ostrovskyego ([4]) z 1997 roku, w której to autorzy pokazali schemat prywatnego pozyskiwania informacji w modelu obliczeniowym z jednym serwerem. Złożoność komunikacyjna tego protokołu wynosi O(n² ), dla dowolnie małego epsilon, gdzie n oznacz ilość bitów w bazie danych. Bezpieczeństwo tego protokołu bazuje na trudności odróżnienia reszt od niereszt kwadratowych. Protokół ten został następnie uogólniony przez Akihiro Yamamure i Taiichi Saito ([5]) na dowolny problem należenia do podgrupy. Właśnie między innymi tym protokołem będziemy zajmować się w naszej pracy. Dowód bezpieczeństwa opisanego przez Akihiro Yamamure i Taiichi Saito protokołu PIR został przez nich pominięty. Dlatego też w naszej pracy przedstawimy pełny jego dowód. Pierwszym w literaturze protokołem PIR o złożoności polilogarytmicznej jest protokół przedstawiony przez Christian Cashin, Silvio Micali i Markusa Stadlera ([6]) w 1999 roku. Protokół ten bazuje na założeniu o trudności rozwiązania problemu φ-Hiding (na dzień dzisiejszy nie można powiedzieć, że ten problem został należycie zbadany by uznać, że nie da się go rozwiązać w stosunkowo łatwy sposób), który ogólnie rzecz ujmując polegał na sprawdzeniu czy pewna mała liczba pierwsza dzieli φ(m), dla pewnej złożonej liczby naturalnej m o nieznanej faktoryzacji. Następnie w 2001 roku Aggelos Kiayias i Moti Yung w pracy ”Secure Games with Polynomial Expressions” ([7]) zaprezentowali polilogarytmiczny protokół PIR (efektywniejszy od protokołu Micali i Stadlera), dodatkowo umożliwiający w trakcie jednego wykonania pobranie bloku bitów zamiast tylko jednego. Bezpieczeństwo tego protokołu opierało się na trudności rozwiązania problemu wieloinstancyjnej rekonstrukcji wielomianu (ang. Multisample Polynomial Reconstruction). Niestety założenie o trudności tego problemu okazało się fałszywe, gdyż Don Coppersmith i Madhu Sudan zademonstrowali w pracy ”Reconstructing Curves in Three (and Higher) Dimensional Space from Noisy Data” ([8]) efektywny probabilistyczny algorytm rozwiązujący ten problem. W lutym 2004 roku został zaprezentowany pierwszy protokół PIR o złożoności komunikacyjnej logarytmicznej w pracy ”Single Database Private Information Retrieval with Logarithmic Communication” ([9]) autorstwa Yan-Cheng Changa. Protokół ten bazuje na dość dobrze zbadanym kryptosystemie Pailliera. Jak widzimy, z zaprezentowanego przeglądu prac, dziedzina prywatnego pozyskiwania informacji przeżywa burzliwy rozwój. Wciąż powstają nowe protokoły, niestety dla większości z nich bezpieczeństwo nie jest dość dobre, gdyż bazuje na niedogłębnie zbadanych założeniach. 1.3. Motywacja Przedstawimy teraz kilka przykładów zastosowania protokołów PIR w praktyce. 8 Zazwyczaj firmy farmaceutyczne zajmują się wynajdowaniem nowych leków lub też zbieraniem informacji na temat składników, z których tworzy się leki. Proces tworzenia nowego leku wymaga informacji o właściwościach jego podstawowych składników, które to zwykle znajdują się w bazie danych, będącej w posiadaniu innej firmy. W celu ukrycia planów, koncerny farmaceutyczne kupują więc często całą bazę danych, by w ten sposób ukryć swoje plany na temat nowego środka. W wyniku tego ponoszą bardzo duże wydatki, których można by uniknąć, stosując protokoły prywatnego pozyskiwania informacji do kupienia tylko interesujących ich informacji na temat kilku składników. Przedstawimy teraz sytuację zaproponowaną przez Isabell Duchesnay w [10]. Rozważmy szpiega posiadającego wiele sekretów, z których każdy ma swój tytuł, jak na przykład ”gdzie jest Bin Laden”. Oczywiście szpieg nie chciałby zdradzać dwóch sekretów za cenę jednego. Nawet częściowy wyciek informacji o innym sekrecie niż ten sprzedawany jest dla niego nie do przyjęcia. Potencjalny kupiec, może też chcieć utrzymać w tajemnicy informację o tym czego szuka, ponieważ wiedza na ten temat może być wartościowa dla szpiega i może być dalej sprzedana pod tytułem ”kto szuka Bin Ladena”. W przedstawionej sytuacji stosując protokoły prywatnego pozyskiwania informacji możemy zadowolić obie strony - kupca i szpiega. Na koniec przedstawimy jeszcze jeden przykład zastosowania protokołu PIR. Rozważmy bazę danych z patentami i użytkownika chcącego sprawdzić czy dany patent znajduje się w wyżej wymienionej bazie. Przypuśćmy, że tym użytkownikiem jest pewien naukowiec, który odkrywa genialny wzór: ’2 + 2 = 4’. Oczywiście chce go opatentować. W tym celu sprawdza najpierw w bazie danych patentów czy wzór ten już tam jest. Administrator takiej bazy danych, może z łatwością poznać zapytanie naukowca. Następnie może spróbować opatentować jako pierwszy skradziony wzór. Nawet jeśli wzór ten okaże się niezbyt zachęcający do opatentowania, administrator bazy danych dowiaduje się czego dotyczą badania prowadzone przez naukowca. 1.4. Podstawowe definicje W sekcji tej przedstawimy podstawowe definicje potrzebne do zrozumienia dalszej części pracy. Ograniczymy się tutaj do zdefiniowania obliczeniowego prywatnego pozyskiwania danych z jednym serwerem. W dalszej części pracy pisząc o obliczeniowym prywatnym pozyskiwaniu danych mamy zazwyczaj na myśli istnienie tylko jednego serwera, chyba że wyraźnie zaznaczymy, że jest inaczej. 1.4.1. Prywatne pozyskiwanie informacji (Private Information Retrieval) Prywatne pozyskiwanie informacji jest protokołem pomiędzy dwiema stronami: • S - serwer zarządzający bazą danych, • U - użytkownik chcący poznać pewne informacje z tej bazy. → Przyjmujemy, że baza danych posiadana przez serwer S jest wektorem − x = [x0 , x1 , ..., xn−1 ] n ∈ {0, 1} złożonym z n bitów. Użytkownik posiada zaś liczbę naturalną i ∈ {0, ..., n − 1}. W wyniku działania protokołu użytkownik powinien poznać bit xi , w taki sposób by serwer nie poznał wartości i. U możemy formalnie zdefiniować jako probabilistyczną i interaktywną maszynę Turinga z jedną taśmą tylko do odczytu, jedną tylko do zapisu, jedną taśmą tylko do odczytu z zapisanymi losowymi bitami i dwiema komunikacyjnymi taśmami: 9 • tylko do zapisu, przeznaczona do wysyłania wiadomości do S. • tylko do odczytu, przeznaczona do czytania wiadomości od S Analogicznie definiujemy S z tą różnicą, że S posiada dodatkową taśmę z zapisanym na → niej wektorem − x , a komunikacja poprzez taśmy odbywa się z U. Przedstawimy teraz schemat protokołu PIR: 1. Na początku U i S mają na swojej taśmie do odczytu ten sam parametr bezpieczeństwa 1k , natomiast taśma z losowymi bitami używana przez U jest znana tylko jemu. 2. U oblicza zapytanie Query(i), używając jego losowej taśmy, a następnie przesyła (poprzez zapisanie na odpowiedniej taśmie) je do S 3. S odbiera Query(i) i wykonuje w wielomianowym czasie obliczenia dla danych wejścio→ wych − x , Query(i) i jego losowej taśmy. Wynikiem tych obliczeń jest odpowiedź → Answer(− x , Query(i)), którą wysyła do U. → 4. U odbiera odpowiedź Answer(− x , Query(i)) i wykonuje na niej i na swojej prywatnej taśmie z losowymi bitami w wielomianowym czasie obliczenia. W wyniku tych obliczeń → U poznaje i-ty bit xi z bazy danych, czyli z wektora − x. W ogólności schemat protokołu PIR może przebiegać w wielu rundach. Oznacza to tylko tyle, że U i S mogą wysyłać i odbierać od siebie wiele zapytań i odpowiedzi. − Mówimy, że PIR jest poprawny, jeśli dla każdego wektora → x tworzącego bazę danych i → − każdego zapytania Query(i) o i-ty bit z wektora x , U zna xi po zakończeniu protokołu. Mówimy, że PIR jest nietrywialny, jeśli komunikacja między U i S jest mniejsza od n (ilość bitów w bazie danych). Dokładniej wartość funkcji CC(n, k) = maxi (|Query(i)| + → |Answer(− x , Query(i))|) musi być mniejsza niż n, przynajmniej dla pewnych n i k. Z oczywistych względów, w niniejszej pracy zajmujemy się przede wszystkim protokołami nietrywialnymi i poprawnymi. 1.4.2. Bezpieczeństwo PIR Definicja bezpieczeństwa PIR w modelu obliczeniowym, opiera się na założeniu, że S ma ograniczoną moc obliczeniową. Nieformalnie, obliczeniowe bezpieczeństwo oznacza, że S nie potrafi odróżnić dwóch zapytań, w wielomianowym czasie względem długości bazy danych i parametru bezpieczeństwa, z większym niż zaniedbywalne prawdopodobieństwo. Formalnie, dla każdej stałej c, dla każdej bazy danych długości n, dla każdego i i j spełniających 0 ≤ i, j < n i dla każdej wielomianowej wielkości rodziny obwodów logicznych, istnieje stała K taka, że dla każdego k > K zachodzi: |P (Ck (Query(i)) = 1) − P (Ck (Query(j)) = 1)| < σ, gdzie k jest parametrem bezpieczeń1 stwa protokołu, a σ = (max(k,n)) c 1.4.3. Decyzyjny problem reszt kwadratowych Definicja 1.1 Niech m, n ∈ Z oraz n > 0, Niech teraz a ∈ Z oraz N W D(a, n) = 1. 10 Liczbę a nazywamy resztą kwadratową modulo n, jeśli istnieje liczba x taka, że x2 ≡ a (mod n). W przeciwnym przypadku liczbę a nazywamy nieresztą kwadratową modulo n. Definicja 1.2 Niech Zn∗ = {x|1 ≤ x ≤ n, N W D(n, x) = 1}, gdzie n jest liczbą naturalną. Zdefiniujmy predykat Qn mówiący czy podana liczba jest resztą kwadratową modulo n: • ∃w ∈ Zn∗ w2 = y ⇒ Qn (y) = 0 • ∀w ∈ Zn∗ w2 6= y ⇒ Qn (y) = 1 Decyzyjny problem reszt kwadratowych polega na trudności obliczenia predykatu Qn dla zadanej wartości y. Problem ten uważa się za najtrudniejszy gdy n jest iloczynem liczb pierwszych tej samej długości. Niech Hk = {n|n = p ∗ q gdzie p i q to liczby pierwsze oraz |p| = |q| = k }. 2 Jeśli znany jest rozkład na czynniki pierwsze liczby n ∈ Hk , wtedy istnieje efektywny algorytm na obliczenie Qn (y). By bliżej przybliżyć tę kwestię przypomnimy kilka znanych faktów z teorii liczb (ich dowody można znaleźć np. w [11]). Definicja 1.3 Niech p będzie nieparzystą liczbą pierwszą i niech a będzie liczbą całkowitą niepodzielną przez p. Symbol Legendrea definiujemy w następujący sposób: ³ ´ • ap = 1 jeśli a jest resztą kwadratową modulo p, ³ ´ • a p = −1 jeśli a jest nieresztą kwadratową modulo p. Twierdzenie 1.1 (Kryterium Eulera) Niech p będzie nieparzystą liczbą pierwszą i niech a będzie dodatnią liczbą całkowitą niepodzielną przez p. Wtedy ³a´ p−1 ≡ a 2 (mod p). p Definicja 1.4 Niech n będzie liczbą całkowitą nieparzystą oraz niech n = pα1 1 ∗ pα2 2 ∗ ... ∗ pαk k . ³ ´ Niech a będzie liczbą całkowitą względnie pierwszą z n. Symbol Jacobiego ³a´ n = a n określa wzór: ³ a ´α1 ³ a ´α2 ³ a ´αk ∗ ∗ ... ∗ , p1 p2 pk gdzie czynniki stojące z prawej strony równania są symbolami Legendrea. Powodem dla którego rozpatrujemy symbol Jacobiego jest to, że można go efektywnie obliczyć (istnieje algorytm wielomianowy ze względu na |n|) nie znając rozkładu na czynniki liczby n. 11 Twierdzenie 1.2 Liczba a jest resztą kwadratową modulo n = p ∗ q wtedy i tylko wtedy gdy a jest resztą kwadratową modulo p i a jest resztą kwadratową modulo q. Dowód: Załóżmy, że a jest resztą kwadratową modulo n, czyli ∃x x2 ≡ a mod n. Niech x1 = x mod p i x2 = x mod q. Zachodzą kongruencje: • x21 ≡ x2 ≡ a (mod p) • x22 ≡ x2 ≡ a (mod q) Z powyższych kongruencji wynika, że a jest także resztą kwadratową modulo p i modulo q. Załóżmy teraz, że a mod p i a mod q są resztami kwadratowymi odpowiednio modulo p i modulo q. Mamy więc a mod p ≡ x21 (mod p) oraz a mod q ≡ x22 (mod q). Z Chińskiego Twierdzenia o Resztach wynika, że ∃x x ≡ x1 (mod p) i x ≡ x2 (mod q). Dodatkowo wiadomo, że istnieje tylko jedno takie x < n. Zachodzą więc równości: • x2 ≡ a mod p (mod n) • x2 ≡ a mod q (mod n) co daje nam kongruencję x2 ≡ a (mod n) i kończy dowód. ³ ´ ³ ´ ³ ´ ³ ´ Z powyższego twierdzenia i równania na = ap ∗ aq wynika, że gdy na = −1 to ³ ´ a jest na pewno nieresztą kwadratową modulo n. Natomiast z informacji, że na = 1 nie wynika, że a jest resztą kwadratową modulo n. Zdefiniujmy więc zbiór: ³x´ Zn+1 = {x ∈ Zn∗ | = 1}, n gdzie n ∈ Hk dla pewnego k. Zbiór ten ma taką własność, że dokładnie połowa jego elementów jest resztą kwadratową modulo n. Warto jeszcze zaznaczyć, że dla każdego x i y ze zbioru Zn+1 iloczyn x ∗ y jest nieresztą kwadratową tylko wtedy gdy dokładnie jedna z tych liczb jest nieresztą kwadratową. Wynika to z równości: Qn (x ∗ y) = Qn (x) ⊕ Qn (y). 1.4.4. Decyzyjny problem Diffiego-Hellmana Trudność obliczenia logarytmu dyskretnego w pewnych dużych grupach cyklicznych jest podstawą wielu protokołów kryptograficznych, które to od wielu lat wykorzystywane są w praktyce. Jednym z takich protokołów jest protokół Diffiego-Hellmana, uzgadniania wspólnego klucza. Złamanie tego protokołu nie jest trudniejsze od obliczenia logarytmu dyskretnego w grupie Zp∗ . Otwartym zagadnieniem zaś jest, czy problem Diffiego-Hellmana jest równoważny obliczeniowo problemowi logarytmu dyskretnego (Maurer w pracy [12] wskazał pewne zależności między tymi problemami). Bardzo ważnym zagadnieniem w kryptografii jest więc udowodnienie trudności obliczeniowej problemu logarytmu dyskretnego. Niestety dotychczas nie udało się tego udowodnić. Zamiast tego zakłada się trudność obliczeniową pewnych problemów (jak np. trudność obliczeniowa logarytmu dyskretnego) i udowadnia się bezpieczeństwo protokołów korzystając z tego założenia. Jednym z problemów blisko powiązanym z protokołem uzgadniania klucza Diffiego-Hellmana jest założenie o trudności obliczeniowej obliczeniowego problemu Diffiego-Hellmana. 12 Definicja 1.5 Rozpatrzmy cykliczną grupę G i jej generator g oraz dwa elementy a, b ∈ G, gdzie a = g x , b = g y , dla pewnych nieznanych x, y ∈ N. Obliczeniowym problemem DiffiegoHellmana nazywamy zadanie obliczenia wartości c = g xy ∈ G. Definicja 1.6 Przypuszczenie o trudności obliczeniowej problemu Diffiego-Hellmana jest założenie, że każdy probabilistyczny algorytm działający w wielomianowym czasie (względem rozmiaru grupy) rozwiązuje obliczeniowy problem Diffiego-Hellmana z zaniedbywalnym prawdopodobieństwem. Dokładniej dla każdego algorytmu A oraz dla każdego c ∈ N zachodzi: P (A(g, g x , g y ) = g xy ) < 1 , nc gdzie g ∈ G jest generatorem G, x, y ∈ N, n = |G|. Założenie o trudności obliczeniowy problem Diffiego-Hellmana okazało się jednak w wielu przypadkach niewygodnym i za słabym założeniem do udowadniania bezpieczeństwa protokołów. Dlatego też powstało sformułowane założenie o trudności obliczeniowej decyzyjnego problemu Diffiego-Hellmana. Definicja 1.7 Rozważmy grupę G, jej generator g oraz trzy elementy a, b, c ∈ G. Decyzyjnym problemem Diffiego-Hellmana jest zdecydować czy h2 = g2a dla danej czwórki (g1 , h1 , g2 , h2 ) elementów z G, gdzie h1 = g1a dla pewnego a ∈ {1, .., p−1}. Jeśli tak to taką czwórkę nazywamy czwórką Diffiego-Hellmana. Zauważmy, że a jest zapadką (czyli pewną dodatkową informacją, umożliwiającą efektywne rozwiązanie problemy, bez której znajomości problem jest trudny do rozwiązania) dla decyzyjnego problemu Diffiego-Hellmana. Znając a potrafimy efektywnie sprawdzić czy h2 = g2a . Przekształcimy teraz podany decyzyjny problem Diffiego-Hellmana, tak by uzyskać instancję problemu należenia do podgrupy (patrz następny podpunkt). Niech G0 = G × G, wtedy danymi wejściowymi dla decyzyjnego problemu Diffiego-Hellmana może być para elementów x, y ∈ G0 , gdzie x = (g1 , h1 ), y = (g2 , h2 ). Jasne jest, że (g1 , h1 , g2 , h2 ) jest czwórką Diffiego-Hellmana wtedy i tylko wtedy gdy y należy do podgrupy H, grupy G0 generowanej przez x = (g1 , g1a ). Decyzyjny problem Diffiego-Hellmana równoważny jest więc stwierdzeniu czy y ∈ H, czyli problemowi należenia do podgrupy H. Przykładem grupy G dla decyzyjnego problemu Diffiego-Hellmana jest Z∗p , gdzie p jest liczbą pierwszą postaci p = 2 ∗ q + 1, gdzie q jest liczbą pierwszą. Liczba p jest szczególnej postaci, ponieważ w ogólności trudno znaleźć generator dla grupy Z∗p . Gdy p = 2 ∗ q + 1 rząd grupy Z∗p wynosi 2 ∗ q. Twierdzenie 1.3 Niech p = 2 ∗ q + 1 oraz q będą liczbami pierwszymi. Wtedy g ∈ Z∗p jest generatorem grupy Z∗p wtedy i tylko wtedy gdy g q 6= 1 i g 2 6= 1. Z powyższego twierdzenia wynika, że znalezienie generatora w zdefiniowanej w twierdzeniu grupie Z∗p jest proste, ponieważ grupa Z∗p zawiera q − 1 różnych generatorów. Wystarczy więc wybrać losowo element g ∈ Z∗p i sprawdzić czy g q 6= 1 oraz g 2 6= 1. Jeśli test ten zawiedzie, l powtarzamy czynność do skutku. Prawdopodobieństwo porażki w l próbach wynosi ( q+1 2∗q ) , −l co dla bardzo dużych q, jest mniej więcej równe 2 . 13 1.4.5. Problem należenia do podgrupy Sprawdzenie czy dany element pewnej grupy należy do jej podgrupy nie jest zawsze prostym problemem. W ogólności problem ten nie jest rekurencyjny. By zaaplikować to zagadnienie do kryptograficznych protokołów takich jak asymetryczne kryptosystemy potrzebujemy móc efektywnie obliczać należenie do podgrupy. Dodatkowo wymagamy by efektywne obliczenie było wykonalne tylko gdy znamy zapadkę, czyli dodatkową informację bez której nie da się efektywnie rozwiązać problemu należenia do podgrupy. Niech G będzie grupą, a H jej podgrupą. Problemem należenia do podgrupy jest określenie czy dany element g ∈ G należy do H. Zakładamy, że każdy element w G ma binarną postać długości k, a mnożenie dwóch elementów w tej grupie jest wykonywane w wielomianowym czasie względem k. Problem należenia do podgrupy nazwiemy trudnym gdy nie jesteśmy w stanie sprawdzić członkostwa w podgrupie z prawdopodobieństwem znacząco większym niż 1 2 . Dodatkowo zakładamy, że członkostwo w podgrupie można sprawdzić w wielomianowym czasie względem k, jeśli znana jest pewna dodatkowa informacja zwana zapadką. W dalszej części pracy będziemy zajmować się jedynie trudnymi problemami należenia do podgrupy. Niech k będzie parametrem bezpieczeństwa. Dla wejścia 1k niech IG będzie probabilistycznym algorytmem o wielomianowej złożoności czasowej, który zwraca opis grupy G, opis grupy H ⊂ G oraz zapadkę, dzięki której można skonstruować szybki algorytm sprawdzający należenie do podgrupy H w G. Algorytm IG jest nazywany generatorem instancji. Możemy zdefiniować predykat należenia do podgrupy: ½ 1 jeśli x ∈ H M em(G, H, x) = (1.1) 0 jeśli x ∈ G\H, gdzie (G, H) jest wynikiem IG dla 1k , x ∈ G. Jeśli nie istnieje probabilistyczny i wielomianowy algorytm, który oblicza predykat M em z prawdopodobieństwem znacząco większym niż 21 , wtedy możemy powiedzieć, że problem jest trudny obliczeniowo. Zakładamy także, że możemy wybierać elementy z G i H niezależnie i losowo. Twierdzenie 1.4 Niech G będzie grupą, a H jej podgrupą. Dla każdego g ∈ G i h ∈ H zachodzi gh ∈ H ⇔ g ∈ H. Definicja 1.8 Założenie o trudności obliczeniowej problemu należenia do podgrupy: dla każdej stałej c i dla każdej rodziny obwodów logicznych {Ck | k ∈ N} wielomianowej wielkości względem k, istnieje K ∈ N takie, że dla każdego k > K zachodzi: P rob(Ck (G, H, g) = M em(G, H, g)) < 1 1 + c, 2 k (1.2) gdzie prawdopodobieństwo jest dla losowych (G, H) zwracanych przez IG(1k ) oraz losowego b ∈ {0, 1}. Gdy b = 1 to g losowane jest z H, natomiast gdy b = 0 to g losowane jest z G\H. Założenie to mówi, że nie istnieje rodzina obwodów wielomianowej wielkości względem k, która potrafi obliczyć predykat M em. Powyższe założenie można sformułować inaczej: Definicja 1.9 Założenie o trudności obliczeniowej problemu należenia do podgrupy - wersja 2 Dla każdej stałej c i każdej rodziny obwodów logicznych {Ck | k ∈ N} wielomianowej wielkości względem k, istnieje liczba naturalna K taka, że dla każdego k > K zachodzi: |PH − PF | < 14 1 , kc (1.3) gdzie prawdopodobieństwa PH i PF definiują wzory: PH = P rob(Ck (G, H, g) = 1), gdzie (G, H) są wygenerowane przez pewien generator instacji IG(1k ), natomiast g to losowo wybrany element z H PF = P rob(Ck (G, H, g) = 1), gdzie (G, H) są wygenerowane przez pewien generator instacji IG(1k ), natomiast g to losowo wybrany element z F = G\H Przykładami problemu należenia do podgrupy są opisane w poprzednim rozdziale problemy odróżnienia reszt od niereszt kwadratowych, a także decyzyjny problem DiffiegoHellmana. W literaturze (np. [5]) można znaleźć więcej problemów tego typu, ale wymienione tutaj są najbardziej popularne i najlepiej zbadane. 1.5. Warianty prywatnego pozyskiwania danych W literaturze spotykamy wiele różnych wariantów prywatnego pozyskiwania danych. Najbardziej popularnym jest przede wszystkim przypadek gdzie nieistotne jest ile informacji udało się dodatkowo, poza szukanymi, uzyskać użytkownikowi. Protokół PIR, który zapewnia pobranie tylko tej szukanej przez użytkownika (i żadnej innej) informacji jest nazywany symetrycznym PIR. Istnieją metody przekształcające PIR w symetryczny PIR poprzez wydłużenie protokołu tylko o jedną rundę i jedną z takich metod będzie można odnaleźć w dalszej części pracy (3.3.3). 1.5.1. Teorio-informacyjny 1-serwerowy PIR W modelu teorio-informacyjnym nieuczciwa baza danych dysponuje nieograniczoną mocą obliczeniową. Implikuje to zmianę definicji bezpieczeństwa. Mianowicie dla każdej stałej c, dla każdej bazy danych długości n, dla każdego i, j ∈ N spełniających 0 ≤ i, j < n i dla każdej wielomianowej wielkości rodziny obwodów logicznych, istnieje stała K taka, że dla każdego k > K zachodzi: |P (Ck (Query(i)) = 1) − P (Ck (Query(j)) = 1)| = 0, gdzie k jest parametrem bezpieczeństwa protokołu. Przy takich założeniach najlepszym protokołem pod względem złożoności komunikacyjnej jest przesłanie całej zawartości bazy danych do użytkownika. Twierdzenie 1.5 [2] Nietrywialny teorio-informacyjny 1-serwerowy PIR nie istnieje. Zanim podamy dowód tego twierdzenia, wprowadzimy kilka definicji: Definicja 1.10 Transkryptem komunikacyjnym C między partiami nazywamy zapis komunikatów pomiędzy użytkownikiem U i serwerem S. → Inaczej mówiąc transkrypt komunikacyjny C jest wartością funkcji C(ru , i, rs , − x ), gdzie i, → − x są odpowiednio danymi wejściowymi użytkownika i serwera, a ru i rs odpowiednio ich zrandomizowanymi danymi wejściowymi. → Definicja 1.11 Transkrypt komunikacyjny C jest możliwy dla (− x , i) jeśli istnieją ru i rs − → takie, że C = C(ru , i, rs , x ). 15 Nieformalnie mówiąc, powyższa definicja oznacza, że prawdopodobieństwo pojawienia się transkryptu komunikacyjnego C dla danych ru , rs , i, x, nie jest zerowe. → Definicja 1.12 Transkrypt komunikacyjny C jest możliwy dla i, jeśli istnieje taki − x , że → − transkrypt komunikacyjny C jest możliwy dla ( x , i). Dowód: 1. Ustalmy indeks i oraz załóżmy, wbrew twierdzeniu, istnienie nietrywialnego teorio-informacyjnego 1-serwerowego PIR. 2. Dla dowolnego indeksu i z nietrywialności wynika, że możliwych transkryptów dla i jest mniej niż 2n , gdzie n to rozmiar bazy danych. → − 3. Zatem dla ustalonego indeksu i istnieją takie − x, → y i transkrypt komunikacyjny C, że − → − → − → − → x 6= y oraz C jest możliwy dla ( x , i) i ( y , i). 4. Ponieważ serwer dysponuje nieograniczoną mocą obliczeniową, musi zachodzić dla każ− dego j, że C jest możliwe dla (→ x , j). W przeciwnym razie serwer mógłby sprawdzić wszystkie możliwe transkrypty komunikacyjne jakie mogą powstać w trakcie wykony→ wania protokołu i stwierdzić, że C jest niemożliwe dla (− x , j). W ten sposób dowiedziałby się, że użytkownik nie pytał o j-ty bit. → − 5. Analogicznie rozumując dla − y dostajemy, że dla każdego j, C jest możliwe dla (→ y , j). → − 6. Ponieważ − x = 6 → y , więc istnieje j, dla którego xj 6= yj . 7. Dostajemy więc sprzeczność, gdyż szukany przez użytkownika bit zależy od transkryptu komunikacyjnego C i wartości i. Na przykład gdy i = j, xi = 0, yj = 1, użytkownik zwraca dwie różne wartości, co jest niemożliwe, więc dostajemy sprzeczność. 1.5.2. Inne modele Smith i Safford ([13], [14]) rozważali 1-serwerowy PIR przy założeniu istnienia specjalnego urządzenia uniemożliwiającego manipulację po stronie serwera. Żeby dobrze zrozumieć stojącą za tym podstawową ideę, wyobraźmy sobie bezpieczny koprocesor (ang. secure coprocessor) [15, 16, 17] zainstalowany po stronie serwera. Użytkownik koduje zapytanie o i-ty bit i wysyła je do bezpiecznego koprocesora. Bezpieczny koprocesor odkodowuje zapytanie, przetwarza je, a następnie uzyskaną odpowiedź koduje i wysyła do użytkownika. Serwer nie ma żadnych wskazówek na temat zapytania użytkownika, ponieważ: • Główną własnością bezpiecznego koporocesora jest to, że zainstalowany na serwerze, uniemożliwia mu dostęp do wbudowanej pamięci RAM bezpiecznego koprocesora. Dlatego też serwer nie wie jak wygląda odkodowane zapytanie użytkownika. • Żeby przetworzyć zapytanie, bezpieczny koprocesor czyta wszystkie rekordy z bazy danych nie zdradzając w ten sposób preferencji użytkownika. Inne podejście zaprezentowano w pracy [18], w której to przedstawiono protokół PIR, wykorzystujący losowe serwery. Protokół ten dzięki wykorzystaniu dodatkowych serwerów, może przerzucić większość obliczeń z serwera dysponującego bazą danych na inne serwery nie znające zawartości bazy danych. Protokół ten może także zapewnić bezpieczeństwo przy 16 koalicji t dodatkowych serwerów, gdzie t jest parametrem protokołu, wykorzystując obliczenia wielopodmiotowe. Niestety protokół ten nie redukuje złożoności obliczeniowej, lecz odciąża serwer będący w posiadaniu bazy danych, który to w trakcie protokołu wykonuje tylko O(1) obliczeń. Główną zaletą tego protokołu jest więc odciążenie głównego serwera z obliczeń, które to niestety muszą być wykonane przez inny serwer lub serwery. 17 Rozdział 2 1-serwerowy obliczeniowy PIR W rozdziale tym zaprezentujemy nietrywialny 1-serwerowy obliczeniowy protokół PIR. Będzie to protokół Kushlevitza i Ostrovskyego([4]) uogólniony przez Akihiro Yamamure i Taiichi Saito ([5]). Złożoność komunikacyjna tego protokołu to O(n² ), gdzie ² może być dowolnie małe. Protokół ten opiera się na dowolnej instancji problemu należenia do podgrupy. Jest to bardzo ważny fakt, gdyż do tej pory wszystkie efektywne 1-serwerowe obliczeniowe PIR, opierały się tylko na trudności rozkładu pewnych liczb naturalnych na czynniki. 2.1. Uogólniony protokół Kushlevitza i Ostrovskyego Protokół PIR Kushlevitza i Ostrovskyego opiera się na trudności odróżnienia reszty kwadratowej od niereszty kwadratowej (zagadnienie to opisane było w rozdziale 1). My przedstawimy tu uogólnioną wersję tego protokołu i pokażemy czym różni się ona od oryginału. 2.1.1. Uproszczona wersja protokołu Przedstawimy tu prosty protokół, na którego przykładzie zademonstrujemy ideę stojącą za protokołem Kushlevitza i Ostrvskyego. → Rozważmy serwer S obsługujący bazę danych − x = [x0 , x1 , ..., xn−1 ] oraz użytkownika U chcącego poznać i-ty bit. By to osiągnąć U generuje instancję problemu należenia do podgrupy, czyli parę (G, H). Elementy grupy G mają binarną długość k, gdzie k jest parametrem bezpieczeństwa. U traktuje bazę danych jako macierz o wymiarach t × s, określaną dalej jako M . Przy czym M [l, j] = xs∗l+j , gdy s ∗ l + j < n, oraz M [l, j] = 0 gdy s ∗ l + j ≥ n. Natomiast szukany przez U i-ty bit, określają współrzędne (a, b) = (b si c, i mod s). M = x0 xs .. . x1 xs+1 .. . xs∗(t−1) xs∗(t−1)+1 . . . xs−1 . . . x2∗s−1 .. .. . . . . . xs∗t−1 • U wybiera losowo s elementów g0 , g1 , ..., gs−1 z G w taki sposób, że gb ∈ (G\H), a dla każdego j 6= b, zachodzi gj ∈ H. Następnie wysyła wylosowanych s elementów (s ∗ k bitów) do S • Dla każdego z t wierszy S oblicza odpowiednio elementy v0 , v1 , ..., vt−1 , gdzie: x x x s∗j+s−1 vj = g0 s∗j ∗ g1 s∗j+1 ∗ ... ∗ g(s−1) , 19 x i wysyła je do U. Zauważmy, że gdy l 6= b to zawsze zachodzi gl s∗j+l ∈ H. Natomiast x gdy l = b to gl s∗j+l ∈ H wtedy i tylko wtedy gdy xs∗j+l = 0. Wynika z tego, że vj ∈ H wtedy i tylko wtedy gdy M [j, b] = 0. • U bierze pod uwagę tylko element va , odpowiadający w macierzy M wierszowi, w którym stoi pożądany przez niego bit. Ponieważ element va ∈ H ⇔ M [a, b] = 0, więc wystarczy żeby U sprawdził czy va ∈ H, co może efektywnie wykonać. W ten sposób U dowiaduje się czy i-tym bitem jest zero (va ∈ H), czy też jedynka (va ∈ / H). Poprawność protokołu wynika bezpośrednio z jego opisu. Przeanalizujmy złożoność komunikacyjną powyższego protokołu. Ilość przesłanych bitów √ w obie strony (od U do S i od S do U) wynosi (1 + t + s) ∗ k. Przyjmując s = t = n √ otrzymujemy złożoność komunikacyjną postaci (2 ∗ n + 1) ∗ k. Wreszcie ustalając parametr 1 bezpieczeństwa k = n² dostajemy oczekiwaną złożoność komunikacyjną równą O(n 2 +² ). Teraz udowodnimy bezpieczeństwo protokołu. Załóżmy, że dla pewnych dwóch indeksów i and i0 , serwer S potrafi odróżnić zapytania Query(i) o bit xi od zapytania Query(i0 ) o bit xi0 . Użyjemy tego założenia do skonstruowania obwodu logicznego rozwiązującego problem − należenia do podgrupy. Zgodnie z naszym protokołem zapytanie o i-ty bit z wektora → x jest 0 równoważne zapytaniu o element (a, b) z macierzy M . Analogicznie i odpowiada para (a0 , b0 ). Jasne jest, że musi zachodzić b 6= b0 , gdyż w przeciwnym przypadku protokół przebiega identycznie w obu przypadkach i nie ma sposobu na rozróżnienie Query(i) od Query(i0 ). Fakt, że S potrafi odróżnić te dwa zapytania mówi, że istnieje rodzina wielomianowej wielkości obwodów logicznych B takich, że jeśli B dostanie na wejściu Query(i) (czyli jedno z możliwych zapytań wygenerowanych przez U dla bitu i), wtedy B zwraca wynik 1 z pewnym prawdopodobieństwem p, natomiast jeśli B dostanie na wejściu Query(i0 ) (czyli jedno z możliwych zapytań wygenerowanych przez U dla bitu i0 ), wtedy B zwraca wynik 1 z prawdopodobieństwem p + c. Z konstrukcji protokołu wynika, że Query(i) składa się z s − 1 elementów z H oraz jednego elementu z G\H stojącego na pozycji b. Query(i0 ) jest zbudowane analogicznie, z tą różnicą, że element z G\H stoi na pozycji b0 . Para (G, H) jest instancją problemu należenia do podgrupy, wygenerowaną przez U na początku protokołu. Opiszemy teraz obwód logiczny C, który dla danych wejściowych G, H, y, gdzie y ∈ G, oblicza predykat M em (patrz 1.1) z prawdopodobieństwem co najmniej 21 + 2c . Konstrukcja: 1. Wybieramy losowo s−2 (zakładamy ze można wybierać elementy z G i H z jednostajnym rozkładem) elementy z H i ustawiamy je na wszystkich pozycjach od 1 do s poza pozycjami b oraz b0 . 2. Wybieramy losowo jedną z pozycji b lub b0 . Następnie wstawiamy na wylosowaną pozycję y, a na pozycję której nie wylosowaliśmy wstawiamy losowy element z H. 3. Uruchamiamy B na uzyskanym ciągiem elementów. Jeśli w drugim kroku wylosowaliśmy b0 , zwracamy tę samą wartość którą zwróci B. Jeśli natomiast w drugim kroku wylosowaliśmy b, zwracamy odwrotność tego co zwróci B. Policzmy teraz prawdopodobieństwo, że C zwróci 1 mając na wejściu G, H, y takie, że y ∈ H. Wtedy bez względu na to co wybierze B w kroku drugim naszej konstrukcji i tak jego danymi wejściowymi będzie ciąg elementów tylko z H. Dla takich danych wejściowych niech prawdopodobieństwem tego, że B po wykonanych obliczeniach zwróci 1, będzie q. Prawdopodobieństwo, że C zwróci 1 w tym przypadku będzie wynosić 12 ∗ q + 12 ∗ (1 − q) = 21 . Teraz 20 załóżmy, że y ∈ / H. W tym przypadku ciąg stworzony w drugim kroku konstrukcji będzie zawierał tylko jeden element z G\H, stojący na pozycji b lub b0 . Wtedy prawdopodobieństwo, że C zwróci 1 jest w tym przypadku równe 21 ∗ (p + c) + 12 ∗ (1 − p) = 12 + 2c . Z przedstawionego protokołu wynika poniższe twierdzenie: Twierdzenie 2.1 Przy założeniu trudności rozwiązania problemu należenia do podgrupy, 1 istnieje w modelu obliczeniowym protokół PIR o złożoności komunikacyjnej O(n 2 +² ). W porównaniu do modelu teorio-informacyjnego to już jest duży postęp, bo jak pamiętamy w tamtym modelu najlepszy protokół ma złożoność komunikacyjną Ω(n). 2.1.2. Właściwy protokół Metodę którą zastosowaliśmy w poprzedniej sekcji (2.1.1), konstruując protokół o złożono1 ści komunikacyjnej O(n 2 +² ), możemy w specjalny sposób wywoływać rekurencyjnie tworząc protokół PIR o złożoności komunikacyjnej (n² ), dla dowolnego ² > 0. → Tak jak w uproszczonym protokole rozważmy serwer S obsługujący bazę danych − x = n [x0 , x1 , ..., xn−1 ] ∈ {0, 1} oraz użytkownika U chcącego poznać i-ty bit. W celu poznania xi , U generuje instancję problemu należenia do podgrupy, czyli parę (G, H). Elementy grupy G mają binarną długość k, gdzie 1k jest parametrem bezpieczeństwa. Załóżmy, że n = tl , gdzie t, l ∈ N. Jeśli n nie da się przedstawić w postaci n = tl to bierzemy najmniejsze n0 > n takie, że n0 = tl i bazę danych traktujemy jakby miała n0 bitów, gdzie na miejscach od n do n0 − 1 stoją bity 0. • Najpierw U konstruuje zapytanie Query(i) o i-ty bit xi , gdzie 0 ≤ i < n, w następujący sposób. U oblicza t-rozszerzenie i. Mianowicie, niech α0 = i, wtedy t-rozszerzeniem i jest βl βl−1 ...β1 , gdzie α0 = α1 ∗ t + β1 0 ≤ α0 ≤ tl−1 − 1 i 0 ≤ β1 ≤ t − 1 α1 = α2 ∗ t + β2 0 ≤ α1 ≤ tl−2 − 1 i 0 ≤ β2 ≤ t − 1 ... αl−2 = αl−1 ∗ t + βl−1 0 ≤ αl−2 ≤ t − 1 i 0 ≤ βl−1 ≤ t − 1 0 ≤ αl−1 ≤ t − 1 αl = 0 i βl = αl−1 (2.1) Dla każdego u ∈ {1, ..., l}, U wybiera losowo i niezależnie t − 1 elementów g(u,0) , g(u,1) , ..., g(u,βu −1) , g(u,βu +1) , ..., g(u,t−1) z podgrupy H, a także jeden element g(u,βu ) z podgrupy G\H. Zdefiniujmy q(u) jako krotkę (g(u,0) , g(u,1) , ..., g(u,t−1) ) złożoną z wyżej wylosowanych liczb. Wtedy ciąg q(1), q(2), ..., q(l) tworzy zapytanie Query(i), o i-ty bit bazy danych, które U wysyła do S. Ponieważ każde q(u) składa się z t elementów z grupy G, więc q(u) jest reprezentowane przez k ∗ t bitów, a Query(i) przez k ∗ t ∗ l bitów. • S odbiera zapytanie Query(i) i podobnie jak w uproszczonej wersji protokołu rozpatruje bazę danych jako macierz o wymiarach tl−1 × t: x0 x1 . . . xt−1 xt xt+1 . . . x2t−1 (2.2) D(0, λ) = ... xtl −t xtl −t+1 . . . xtl −1 21 gdzie λ oznacza pusty ciąg. Zauważmy, że bit xi ma współrzędne (α1 , β1 ) w macierzy D(0, λ) (gdzie α1 , β1 są wzięte z 2.2) i taki docelowy bit oznaczmy przez T arget(D(0, λ)). Rekurencyjnie definiujemy ”potomków” D(u, s) bazy D(0, λ), gdzie 0 ≤ u ≤ l − 1 oraz s ∈ {0, 1, 2, ..., k − 1}u . Przypuśćmy, że zdefiniowaliśmy bazę danych D(u, s) i jej docelowy bit T arget(D(u, s)) i s ∈ {0, 1, 2, ..., k − 1}u . Baza danych D(u, s) składa się z tl−u bitów, a my rozpatrujemy ją jako macierz o wymiarach tl−u−1 × t: y0 y1 ... yt−1 yt yt+1 . . . y2t−1 . D(u, s) = ... ytl−u −t ytl−u −t+1 . . . ytl−u −1 Skonstruujemy teraz k ”potomków” tej bazy, D(u + 1, s × 0), D(u + 1, s × 1), ..., D(u + 1, s×(k−1)). Pamiętamy, że q(u) składa się z t elementów g(u,0) , g(u,1) , ..., g(u,t−1) z grupy G. Definiujemy element fD(u,s),v ∈ G dla każdego wiersza v ∈ {0, 1, 2, ..., tl−u−1 − 1}: ½ f(v,w) = g(u,v) jeśli D(u, s)[v, w] = 1 1 jeśli D(u, s)[v, w] = 0 (2.3) Niech teraz fD(u,s),v = f(v,0) ∗ f(v,1) ∗ ... ∗ f(v,t−1) (2.4) dla każdego wiersza v ∈ {0, 1, 2, ..., tl−u−1 −1} macierzy D(u, s). Łatwo zauważyć, że dla każdego v, fD(u,s),v ∈ H ⇔ D(u, s)[v, βu ] = 0. Rozważmy r-tego ”potomka” D(u+1, s× r), bazy danych D(u, s). Składa się on z bitów g0 (r), g1 (r), ..., gtl−u−1 −1 (r), gdzie gv (r) oznacza r-ty bit reprezentacji elementu fD(u,s),v . Możemy zapisać następujące równanie macierzowe: fD(u,s),0 fD(u,s),1 = (D(u + 1, s × 0), ..., D(u + 1, s × (k − 1))), (2.5) ... fD(u,s),tl−u−1 −1 gdzie każde fD(u,s),v traktujemy jako wektor wierszowy, a każde D(u + 1, s × r) traktujemy jako wektor kolumnowy. Wynika z tego, że D(u + 1, s × r) składa się z tl−u−1 bitów. Zagłębiając się dalej w rekurencji, rozpatrujemy D(u + 1, s × r) jako macierz o wymiarach tl−u−2 × t, a jej docelowy bit T arget(D(u + 1, s × r)) określają współrzędne (αu+1 , βu+1 ). Postępujemy tak oczywiście dla każdego r ∈ {0, 1, ..., k − 1} i tylko wtedy, gdy D(u + 1, s × r) składa się z więcej niż t bitów. W ostatnim kroku, S dysponuje k l−1 bazami danych D(l−1, s), gdzie s ∈ {1, 2, ..., k}l−1 . Każda z tych baz składa się z t bitów i dla każdej z nich definiujemy element A(s). Tak jak poprzednio(2.3) obliczamy: ½ g(u,v) jeśli D(u, s)[v, w] = 1 f(0,w) = 1 jeśli D(u, s)[v, w] = 0 oraz fD(u,s),v = f(v,0) ∗ f(v,1) ∗ ... ∗ f(v,t−1) = A(s) → Ciąg elementów A(s), gdzie s ∈ {0, 1, 2, ..., k − 1}l−1 tworzy odpowiedź Answer(− x, Query(i)) na zapytanie Query(i), która jest wysyłana przez S do U. 22 → • U otrzymuje odpowiedź Answer(− x , Query(i)), składającą się z A(s), gdzie s ∈ {0,1,2,..., l−1 k − 1} i w wielomianowym czasie względem n i k oblicza bit xi = T arget(D(0, λ)). Sposób obliczenia T arget(D(0, λ)) jest podany poniżej w formie ogólnej. Jeśli U zna już docelowe bity T arget(D(u + 1, s × 0)), T arget(D(u + 1, s × 1)), ..., T arget(D(u + 1, s × (k − 1))) to potrafi obliczyć bit docelowy T arget(D(u, s)). Mianowicie U ma pewne informacje(zapadkę), dzięki której może efektywnie sprawdzić czy dany element z grupy G należy do podgrupy H oraz wie, że g(u,βu ) ∈ F = G\H i g(u,0) , g(u,1) , ..., g(u,βu −1) , g(u,βu +1) , ..., g(u,t−1) ∈ H, gdzie q(u) = (g(u,0) , g(u,1) , ..., g(u,βu −1) , g(u,βu ) , g(u,βu +1) , ..., g(u,t−1) ). Zauważmy, że liczba βu jest prywatną informacją U. Przypomnijmy teraz, że docelowym bitem T arget(D(u, s)) bazy danych D(u, s) jest D(u, s)[αu , βu ]. Dzięki obliczeniom przeprowadzonym przez S (2.4) mamy fD(u,s),αu = f(αu ,0) ∗ ... ∗ f(αu ,t−1) . Z (1.4) oraz (2.3) mamy fD(u,s),αu ∈ H wtedy i tylko wtedy, gdy D(u, s)[αu , βu ] = 0. Co więcej zgodnie z (2.5), fD(u,s),αu jest αu rzędem macierzy (D(u + 1, s × 0), ..., D(u + 1, s × (k − 1)). Zauważmy, że αu -ty bit macierzy D(u + 1, s × r) to D(u + 1, s × r)[αu+1 , βu+1 ], czyli T arget(D(u + 1, s × r)). Ponieważ U zna T arget(D(u+1, s×0)), T arget(D(u+1, s×1)), ...,T arget(D(u+1, s×(k−1))), może wyliczyć wartość fD(u,s),αu . Jeśli już U zna wartość fD(u,s),αu , sprawdza czy należy ona do H. W ten sposób U poznaje, w wielomianowym czasie, docelowy bit T arget(D(u, s)). Jasne jest, że poprzez odpowiednie rekurencyjne wykorzystanie powyższego schematu U może obliczyć T arget(D(0, λ)). Poprawność protokołu wynika bezpośrednio z jego opisu. Opiszemy teraz złożoność komunikacyjną protokołu. W pierwszym kroku U wysyła zapytanie Query(i) = (Q(1), Q(2), ..., Q(l)). Każde Q(u) zawiera t elementów z G. Ponieważ każdy element w G jest reprezentowany przez binarny ciąg długości k, więc ilość bitów wysłana w tej fazie jest równa l ∗ t ∗ k. W drugiej fazie S wysyła odpowiedź Answer(Query(i)) zawierającą k l−1 elementów z G, więc ilość bitów przesłana w tej fazie jest równa k ∗ k l−1 = k l . Złożoność q komunikacyjną określa więc wzór: l ∗ t ∗ k + k l . Przypuśćmy, że k = n² oraz l = O( log(n) log(k) ). q log(n) Wtedy dostajemy l = O( ²∗log(n) ) = O( √1² ). Dalej obliczamy k l = (2log(k) )l = 2l∗log(k) = √ √ √ 1 O(2 log(n)∗log(k) ) = O(2 log(n)∗²∗log(n) ) = O(n ² ). A ponieważ t = n l , dostajemy nierówność l ∗ t ∗ k + k l = k l ∗ (l ∗ k + 1) < k l ∗ k l = O(n² ). Teraz udowodnimy bezpieczeństwo protokołu. Dowód będzie analogiczny do przypadku z uproszczoną wersją. Załóżmy, że dla pewnych dwóch indeksów i and i0 , serwer S potrafi odróżnić zapytania Query(i) o bit xi od zapytania Query(i0 ) o bit xi0 . Użyjemy tego założenia do skonstruowania obwodu logicznego rozwiązującego problem należenia do podgrupy. → Zgodnie z protokołem zapytanie o bit i-ty z wektora − x jest ciągiem elementów z1 , ..., zβ z G, gdzie β = l ∗ t. Dla każdego indeksu i, oznaczmy poprzez Ii podzbiór zbioru {1, ..., β} zawierający pozycje na których występują elementy z G\H. Warto zauważyć, że zbiory Ii są ustalone z góry i niezależne od losowych wyborów dokonywanych przez U. Co więcej dla i 6= i0 musi zachodzić Ii 6= Ii0 , gdyż w przeciwnym przypadku U generuje Query(i) i Query(i0 ) w identyczny sposób więc zapytania te byłyby nierozróżnialne. Fakt, że S potrafi odróżnić dwa zapytania mówi, że istnieje rodzina wielomianowej wielkości obwodów logicznych B takich, że jeśli B dostanie Query(i) (jedno z możliwych zapytań wygenerowanych przez U dla bitu i), wtedy B zwraca wynik 1 z pewnym prawdopodobieństwem p, natomiast jeśli B dostanie Query(i0 ) (jedno z możliwych zapytań wygenerowanych przez U dla bitu i0 ), wtedy B zwraca wynik 1 z prawdopodobieństwem p + c. 23 Opiszemy teraz obwód logiczny C, który dla danych wejściowych G, H, y, gdzie y ∈ G, oblicza predykat M em (patrz 1.1) z prawdopodobieństwem co najmniej 21 + 2c . Konstrukcja: 1. Wybieramy losowo jeden ze zbiorów Ii lub Ii0 . Tworzymy ciąg v1 , ..., vβ , w którym na pozycjach nie należących do wylosowanego zbioru wstawiamy losowo wybrane elementy z H, natomiast na pozostałych pozycjach wstawiamy iloczyn losowo wybranego elementu z H oraz y. 2. Uruchamiamy B na uzyskanym ciągu elementów. Jeśli w pierwszym kroku wylosowaliśmy Ii0 , zwracamy tę samą wartość którą zwróci B. Jeśli natomiast w pierwszym kroku wylosowaliśmy Ii , zwracamy odwrotność tego co zwróci B. Policzmy teraz prawdopodobieństwo, że C zwróci 1 mając na wejściu G, H, y takie, że y ∈ H. Wtedy wszystkie elementy v1 , ..., vβ należą do H. Dla takich danych wejściowych niech prawdopodobieństwem tego, że B po wykonanych obliczeniach zwróci 1, będzie q. Prawdopodobieństwo, że C zwróci 1 w tym przypadku będzie wynosić 21 ∗ q + 12 ∗ (1 − q) = 21 . Teraz załóżmy, że y ∈ / H. W tym przypadku ciąg stworzony w pierwszym kroku konstrukcji będzie tworzył Query(i) lub Query(i0 ) w zależności od dokonanego wyboru w pierwszym kroku. Wtedy prawdopodobieństwo, że C zwróci 1 w tym przypadku jest 12 ∗(p+c)+ 21 ∗(1−p) = 21 + 2c . 2.1.3. Przykład Dla dobrego zrozumienia przedstawionego w poprzednim punkcie protokołu pokażemy mały przykład jego działania. Zakładamy, że ustalona jest już para (G, H) dla pewnego parametru bezpieczeństwa k. Niech baza danych ma postać: − → x = [x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 ] = [0, 1, 0, 1, 0, 1, 1, 1, 0]. Rozmiar bazy danych jest n = 9 = 32 . Przyjmijmy baza danych ma postać: 0 1 1 0 D(0, λ) = 1 1 t = 3, a l = 2. W postaci macierzowej 0 1 0 Przypuśćmy, że użytkownik U chce przeczytać bit x6 (i = 6). Zgodnie ze wzorem 2.1 obliczamy 3-rozszerzenie 6. Dostajemy 6 = 2 ∗ 3 + 0, 2 = 0 ∗ 3 + 2, czyli α0 = 6, α1 = 2, β1 = 0, β2 = 2. U wybiera więc losowo trzy elementy z G: g(1,0) , g(1,1) , g(1,2) , gdzie g(1,1) , g(1,2) należą do H, a g(1,0) należy do G\H(ponieważ β1 = 0). Następnie U wybiera ponownie losowo i niezależnie trzy elementy z G: g(2,0) , g(2,1) , g(2,2) , gdzie g(2,0) , g(2,1) należą do H, a g(2,2) należy do G\H(ponieważ β2 = 2). Zapytanie Query(6) składa się z dwóch krotek q(1) = (g(1,0) , g(1,1) , g(1,2) ) i q(2) = (g(2,0) , g(2,1) , g(2,2) ), które U wysyła do S. Przypuśćmy, że każdy element w grupie G można reprezentować za pomocą 4 bitów (k = 4). S po odebraniu zapytania Query(6) oblicza wartości zgodnie ze wzorem 2.3 dostając f(0,0) = 1, f(0,1) = g(1,1) , f(0,2) = 1, f(1,0) = g(2,0) , f(1,1) = 1, f(1,2) = g(2,2) , f(2,0) = g(3,0) , f(2,1) = g(3,1) , f(2,2) = 1. Następnie korzystając z 2.4 liczy fD(0,λ),0 = f(0,0) ∗ f(0,1) ∗ f(0,2) = g(1,1) , fD(0,λ),1 = f(1,0) ∗ f(1,1) ∗ f(1,2) = g(2,0) ∗ g(2,2) , fD(0,λ),2 = f(2,0) ∗ f(2,1) ∗ f(2,2) = g(3,0) ∗ g(3,1) . Załóżmy teraz, że fD(0,λ),0 , fD(0,λ),1 , fD(0,λ),2 są odpowiednio reprezentowane przez 0110, 1010, 1101. Dla lepszego zobrazowania dalszej części protokołu zapiszemy to w postaci macierzowej: fD(0,λ),0 0 1 1 0 fD(0,λ),1 = 1 0 1 0 . 1 1 0 1 fD(0,λ),2 24 S tworzy cztery bazy danych D(1, 0), D(1, 1), D(1, 2), D(1, 3), gdzie D(1, 0) = (011)T , D(1, 1) = (101)T , D(1, 2) = (110)T , D(1, 3) = (001)T . Zauważmy, że zachodzi równość: fD(0,λ),0 fD(0,λ),1 = (D(1, 0), D(1, 1), D(1, 2), D(1, 3)). fD(0,λ),2 Dla każdej nowo utworzonej bazy danych S oblicza wartości A(0), A(1), A(2), używając otrzymanego na początku q(2) = (g(2,0) , g(2,1) , g(2,2) ). Dla D(1, 0) = (011)T dostaje A(0) = g(2,1) ∗ g(2,2) , dla D(1, 1) = (101)T dostaje A(1) = g(2,0) ∗ g(2,2) , dla D(1, 2) = (110)T dostaje A(2) = g(2,0) ∗ g(2,1) , dla D(1, 3) = (001)T dostaje A(3) = g(2,2) . Następnie S wysyła A(0), → → A(1), A(2), A(3) do U, jako Answer(− x , Query(6)). Po otrzymaniu Answer(− x , Query(6)), U sprawdza które elementy z A(0), A(1), A(2), A(3) należą do H, a ponieważ jest w posiadaniu zapadki, potrafi w wielomianowym czasie to sprawdzić. Po sprawdzeniu dowiaduje się, że elementy A(0), A(1), A(3) ∈ G\H, natomiast A(2) ∈ H i dochodzi do wniosku, że fD(0,λ),2 = 1101. Sprawdzając czy fD(0,λ),2 ∈ H, dowiaduje się, że x6 = 0. 25 Rozdział 3 Prywatne wyszukiwanie słów kluczowych 3.1. Praktyczne zastosowanie uogólnionego protokołu Kushlevitza i Ostrovskyego Główną niedogodnością protokołów PIR jest potrzeba znania fizycznego adresu szukanego elementu. Niestety zazwyczaj użytkownik nie posiada takiej informacji. Zamiast tego jest on w posiadaniu słowa, charakteryzującego szukane informacje, na podstawie którego serwer może wyznaczyć fizyczne miejsce w bazie danych. Na przykład na podstawie słowa kluczowego nazwy giełdowej firmy, użytkownik może uzyskać dostęp do ostatnich notowań tej firmy. W rozdziale tym przedstawimy w jaki sposób wykorzystać protokół PIR by uzyskać dostęp do danych z bazy danych za pomocą słowa kluczowego. Zrobimy to poprzez ogólną konstrukcję, którą będzie można zastosować do dowolnego protokołu PIR. Przedstawimy też kilka faktów szacujących wydajność prywatnego wyszukiwania słów kluczowych w porównaniu do protokołu PIR. Część z tych faktów będzie podana w formie ogólniejszej, w której to ilość replik bazy danych, a co za tym idzie ilość serwerów je obsługujących będzie parametrem. Ponieważ wyszukiwanie słów kluczowych jest uzupełnieniem funkcjonalności protokołu PIR(jest to protokół wyższego poziomu), będzie on wykonywany tak samo jak PIR pomiędzy serwerem S będącym w posiadaniu bazy danych oraz użytkownikiem U. Będziemy więc abstrahować w stosunku do modelu w jakim odbywa się protokół wyszukiwania słów kluczowych, ponieważ jest on wyznaczony przez model PIR. Oczywiście ze względów praktycznych, jesteśmy zainteresowani tylko modelem, w którym bezpieczeństwo oparte jest na założeniach obliczeniowych. 3.2. Podstawowe definicje Ogólna idea stojąca za protokołem prywatnego wyszukiwania słów kluczowych to umieszczenie przez S zbioru słów {s1 , s2 , ..., sn } w specjalnej strukturze umożliwiającej wyszukiwanie słów. Następnie U przeszukuje tę strukturę w poszukiwaniu słowa w. Struktura ta przeszukiwana jest przez U w taki sposób, by S nie wiedział czego poszukujemy. W wyniku wyszukiwania U dowiaduje się, czy w ∈ {s1 , s2 , ..., sn } i gdy tak jest może poznać fizyczny adres gdzie w bazie danych znajdują się informacje powiązane ze słowem w. 27 3.2.1. Uogólniony PIR Podstawowa definicja PIR obejmuje tylko przypadek pobrania jednego bitu z bazy danych. Możemy jednak rozważać protokół PIR w którym serwer (w ogólniejszym przypadku kilka serwerów) przechowuje nie n bitów, lecz n bloków, każdy długości l bitów, a użytkownik chce poznać i-ty blok. Zagadnienie to będziemy oznaczać poprzez P IR(l, n, m), gdzie m oznacza ilość serwerów. Jeśli l = 1 to otrzymujemy zwyczajny protokół PIR, który oznaczać będziemy P IR(n, m). Jasne jest, że P IR(l, n, m) można rozwiązać wykonując l razy P IR(n, m). W dalszych naszych rozważaniach na temat prywatnego wyszukiwania słów kluczowych odnosimy się do uogólnionego PIR, w którym mamy m serwerów, co w szczególności aplikuje się do przypadku w którym m = 1. 3.2.2. PERKY Definicja 3.1 Niech każdy serwer, spośród m serwerów, będzie w posiadaniu bazy danych składającej się z n napisów s1 , s2 , ..., sn ∈ {0, 1}l , a użytkownik w posiadaniu w ∈ {0, 1}l . Prywatnym wyszukiwaniem słów kluczowych nazywamy protokół, który pozwala użytkownikowi sprawdzić czy istnieje j ∈ {1, ..., n} takie, że w = sj , w taki sposób by żaden serwer nie dowiedział się nic o w. Stwierdzenie, że serwer nic się nie dowie o słowie w ma oczywiście różne znaczenie w różnych modelach obliczeń. Na przykład w modelu obliczeniowym serwer może wykonywać obliczenia nie dłużej niż w wielomianowym czasie i musimy zagwarantować, że w trakcie tych obliczeń nie dowie się nic o w (być może jakby mógł dłużej liczyć, uzyskał by pewne informacje o w). Prywatne wyszukiwanie słów kluczowych oznaczymy skrótem P ERKY (l, n, m) (od angielskiej nazwy PrivatE Retreival by KeY words), gdzie l to długość napisów, n ilość napisów w bazie danych, m ilość serwerów mających tę samą kopię bazy danych. Złożoność komunikacyjną protokołu PIR oznaczać będziemy poprzez C(l, n, m) lub C(n, m), gdy l = 1. Zaś ilość rund analogicznie poprzez R(l, n, m) lub R(n, m), gdy l = 1. 3.2.3. Porównanie PIR i PERKY Twierdzenie 3.1 [19] Problem P IR(n, m) można rozwiązać za pomocą protokołu o takiej samej złożoności komunikacyjnej jak P ERKY (log(n) + 1, n, m). → Dowód: Zamieńmy zawartość bazy danych z wektora − x = [x0 , ..., xn−1 ] na n słów, każde długości log(n) + 1 bitów. Zapiszmy j ∈ {1, ..., n} w postaci binarnej j1 j2 ...jlog(n) i zamieńmy każdy bit xj bazy danych na słowo j1 j2 ...jlog(n) xj . Przypuśćmy, że U jest zainteresowany → w uzyskaniu i-tego bitu z bazy − x . Bitem tym jest 1, jeśli i-te słowo trzymane przez bazę danych to i1 i2 ...ilog(n) 1. Więc wystarczy by U i serwery S1 , ..., Sm wykonały protokół P ERKY (log(n) + 1, n, m), w którym U szuka słowa i1 i2 ...ilog(n) 1. Powyższa redukcja pokazuje, że nie można liczyć na to by protokół P ERKY był znacząco bardziej efektywny niż protokół P IR. Zauważmy, że poprawnym protokołem P ERKY jest przesłanie wszystkich słów. Oczywiście takie postępowanie, z analogicznych powodów jak dla protokołów PIR jest nie do przyjęcia. 28 3.3. Wyszukiwanie informacji po słowach kluczowych Przedstawimy teraz dwa protokoły P ERKY , pierwszy mało efektywny działający na podobnej zasadzie jak wyszukiwanie binarne oraz drugi efektywniejszy, wykorzystujący własności drzewa prefiksowego. 3.3.1. Wyszukiwanie binarne Twierdzenie 3.2 [19] Istnieje protokół P ERKY (l, n, m) o złożoności komunikacyjnej Pdlog(n)e Pdlog(n)e C(l, 2q−1 , m) oraz ilości rund q=1 R(l, 2q−1 , m). q=1 Dowód: Bez zmniejszania ogólności możemy założyć, że n = 2d − 1 dla pewnego d ∈ N. • Każdy z serwerów sortuje leksykograficznie n słów s1 , ..., sn . Następnie słowa te zostają przypisane do d tablic różnej długości. Tablica numer q (1 ≤ q ≤ d) zawiera 2q−1 słów, q które występują na pozycjach 21q (n + 1), 23q (n + 1), ..., 2 2−1 q (n + 1). • Podczas wykonania protokołu PERKY pozycję j ∈ {1, ..., n} nazywamy możliwą, jeśli jest możliwe, że w = sj na podstawie informacji, które posiada użytkownik U. U wyszukuje binarnie słowo w, wykonując protokół PIR d razy. Na początku wszystkie pozycje 1, ..., n są możliwe. W q-tym (1 ≤ q ≤ d) wykonaniu protokołu PIR U prywatnie pozyskuje pojedyńcze słowo spośród 2q−1 słów, które tworzą q-tą tablicę. Pozycja pozyskanego słowa jest medianą pozycji, które są wciąż możliwe. Po każdym wywołaniu PIR ilość możliwych pozycji jest zmniejszana o połowę, po d wywołaniach U dowiaduje się czy w ∈ {s1 , ..., sn }. Dodatkowo jeśli dla któregoś j, w = sj , U poznaje też pozycję j. Zauważmy, że U mógł w pierwszym kroku odkryć, że w = sj dla pewnego j. Mógłby więc przerwać dalsze przeszukiwania. Niestety postępowanie takie zdradza słowo w serwerom, dlatego U musi kontynuować protokół, aż pobierze słowa ze wszystkich d tablic. Przedstawiony powyżej protokół PERKY to nic innego tylko wykonanie dlog(n)e razy protokołu PIR. Podczas q-tego wykonywania protokołu PIR jest pobierane słowo o długości l z tablicy zawierającej 2q−1 słów. Dowodzi to, że złożoność komunikacyjna przedstawionego proPdlog(n)e Pdlog(n)e tokołu jest q=1 C(l, 2q−1 , m), natomiast ilość rund określa wzór q=1 R(l, 2q−1 , m). Wyszukiwanie to ma oprócz dużej złożoności komunikacyjnej pewną wadę. Mianowicie użytkownik dowiaduje się aż dlog(n)e spośród n słów kluczowych przetrzymywanych przez bazę danych. Chcielibyśmy raczej tego uniknąć, gdyż informacja o istnieniu jakiegoś słowa kluczowego w pośród słów trzymanych przez bazę danych może być cenna. Protokół wyszukiwania prefiksowego słów kluczowych nie posiada tej wady, a ponadto jest efektywniejszy komunikacyjnie. 3.3.2. Wyszukiwanie prefiksowe Przedstawimy teraz protokół PERKY(l, n, k) ze złożonością komunikacyjną O(l ∗ C(log(n) + log(l), nl , k) + C(l, n, k)) oraz ilością rund O(l ∗ R(log(n) + log(l), nl , k) + R(l, n, k)). Do przedstawienia takiego protokołu użyjemy struktury danych nazywanej drzewem prefiksowym. By skonstruować takie drzewo użyjemy tablic, które będą reprezentować poziomy drzewa (zbiory węzłów drzewa, których ścieżka do korzenia ma jednakową długość). Niech W = {s1 , s2 , ..., sn } będzie niepustym zbiorem słów nad alfabetem {0, 1} długości l przetrzymywanych przez serwer S. Dla każdego i ∈ {1, ..., l} słowo si można zapisać w 29 (i) (i) (i) (i) postaci si = w1 w2 ...wl , gdzie dla każdego j ∈ {1, ..., l}, wj ∈ {0, 1}. Niech T1 , T2 , ..., Tl będą tablicami reprezentującymi wszystkie prefiksy słów z W . Dokładniej, tablica Ti będzie reprezentować wszystkie, parami różne, prefiksy długości i. Rozważmy prefiks p ∈ {0, 1}i pewnego słowa z W . Jest on reprezentowany przez jeden element e w tablicy Ti . Element e składa się z pary liczb eL oraz eR . Mamy dwa przypadki: • p jest prefiksem właściwym, czyli i < l. Wtedy liczby eL oraz eR oznaczają odpowiednio indeksy (najmniejszy indeks to 1) w tablicy Ti+1 pod którymi znajdują się elementy reprezentujące prefiksy p0, p1 ∈ {0, 1}i+1 . Jeśli p0 (lub p1) nie jest prefiksem żadnego słowa ze zbioru W to liczba eL (lub eR ) ma wartość 0. • Jeśli i = l to p jest pewnym słowem z W . Gdy ostatnim symbolem p jest 0 to liczba eL ma wartość 1, natomiast gdy p kończy się na 1 to liczba eR ma wartość 1. Poza tym jeśli p jest postaci u0 dla pewnego słowa u oraz u1 ∈ / W to eR = 0. Analogicznie, gdy p jest postaci u1 dla pewnego słowa u oraz u0 ∈ / W to eL = 0. Powyżej opisana struktura tablic tworzy drzewo prefiksowe. Mając taką strukturę danych możemy przedstawić teraz protokół PERKY wyszukiwania prefiksowego. Tak jak wcześniej było opisywane, protokół będzie wykonywany pomiędzy użytkownikiem U (będącym w posiadaniu słowa w) oraz serwerami S1 , .., Sm posiadającymi zbiór słów W = {s1 , ..., sn }. Protokół będzie przebiegał następująco: • Na początku U dostaje od jednego z serwerów ogólne dane na temat struktury danych tworzącej drzewo prefiksowe. Dokładniej U otrzymuje informacje ile elementów jest w tablicach T1 , ..., Tl . • Następnie U oraz S1 , ..., Sm wykonują l razy protokół PIR, po jednym wykonaniu dla każdej z tablic T1 , ..., Tl . Niech w = w1 ...wl będzie słowem szukanym przez U. Na początku k-tego (1 ≤ k ≤ l) wykonania protokołu PIR U zna indeks elementu reprezentującego prefiks w1 ...wk . Z konstrukcji tablic wynika, że tablica T1 ma tylko jeden element, więc na początku znany jest indeks elementu reprezentującego prefiks w1 . Ponieważ każdy element tablicy Ti składa się z pary liczb, możemy traktować ją jakby miała dwa razy więcej elementów, gdzie elementem tablicy jest jedna liczba. Jeśli element (eL , eR ) miał wcześniej indeks w tablicy j-ty to teraz eL będzie miał indeks 2 ∗ j − 1, a eR indeks 2 ∗ j. Tak więc U oraz S1 , ..., Sm wykonują protokół PIR w wyniku którego U pobiera liczbę z tablicy Tk . Jeśli k = 1 oraz w1 = 0, to U pobiera element pierwszy (eL ), natomiast gdy k = 1 oraz w1 = 1, to U pobiera element drugi (eR ). Gdy pobrany element jest równy 0 to oznacza to, że w ∈ / W . U mógłby więc przerwać wykonywanie protokołu. Niestety przerwanie wcześniej protokołu daje informację serwerom, że w ∈ / W , co jest niezgodne z założeniem. Więc by ukryć ten fakt U wykonuje dalej protokół, losując dowolną wartość (nie przekraczającą wielkości kolejnej tablicy) i traktując ją jako pobrany element. Jeśli l > k > 1 to U poznał w poprzednim wykonaniu protokołu PIR odpowiedni indeks jk+1 elementu reprezentującego prefiks w1 ...wk+1 . Jeśli więc wk+1 = 0 to U pobiera element z tablicy Tk+1 o indeksie 2 ∗ jk+1 − 1, natomiast gdy wk+1 = 1 to U pobiera element z tablicy Tk+1 o indeksie 2 ∗ jk+1 . • W ostatnim kroku, gdy k = l, protokół przebiega analogicznie jak w poprzednim kroku, z tą różnicą, że pobrana liczba eL (lub eR ) określa czy w ∈ W . Dokładniej, gdy pobrana 30 liczba jest równa 0 to U wie, że w ∈ / W , a gdy pobrana liczba jest równa 1 to U wie, że w ∈ W . Jak widać, przedstawiony protokół pozwala tylko stwierdzić czy w ∈ W , nie daje nam natomiast żadnych wskazówek gdzie w bazie danych znajdują się informację dotyczące słowa kluczowego w. Uzyskać takie informacje możemy poprzez zmianę niektórych elementów trzymanych w tablicy Tl (ostatniej tablicy). Mianowicie, gdy w pewnym elemencie tablicy Tl jest wartość różna od zera, element ten odpowiada jednoznacznie pewnemu słowu w ∈ W . Zmieniamy więc przetrzymywaną wartość (zawsze jest to 1) na wartość określającą miejsce na dysku, gdzie znajdują się informacje dotyczące słowa w. Wykonujemy następnie P IR(D, n, 1), gdzie D to ilość bitów wystarczająca do zapisania liczby określającej dowolne miejsce na dysku. W ten sposób dostajemy protokół umożliwiający nam sprawdzenie, czy dane słowo kluczowe w występuje w zbiorze słów kluczowych W oraz w przypadku, gdy w ∈ W , pobranie informacji gdzie na dysku znajdują się dane dotyczące słowa w. Teraz możemy wykonać protokół PIR na właściwej bazie danych (znamy już miejsce z którego pobierzemy informację) i pobieramy interesujące nas dane. Podobną metodę pobierania adresu, gdzie na dysku znajdują się informacje dotyczące szukanego słowa kluczowego, możemy zastosować również do protokołu PERKY wyszukiwania binarnego. 3.3.3. Wzmocnienie protokołu PERKY (wyszukiwanie prefiksowe) Protokoły PIR i PERKY są mocno zorientowane na bezpieczeństwo użytkownika. Co jednak, gdy chcemy zadbać również o bezpieczeństwo serwera, a w szczególności bazy danych przez niego obsługiwanej. Sprytny użytkownik, może wysyłać specjalnie skonstruowane zapytanie do serwera w celu poznania większej ilości informacji niż przewiduje to protokół. Protokoły PIR nie gwarantują, że użytkownik pozna tylko jedną informację. Jak łatwo spostrzec w definicji w ogóle brak wzmianki na temat jak dużo danych pozna użytkownik, ważne jest tylko by poznał interesującą go informację. Rozważmy protokół PIR przedstawiony w sekcji 2.1.2. W protokole tym użytkownik może wybrać pewne szczególne elementy z G i G\H by poznać więcej niż jeden bit z bazy danych. Jak wiele informacji może użytkownik uzyskać dobierając odpowiednio swoje zapytanie wymaga głębszej analizy i wykracza poza tematykę niniejszej pracy. Istnieje natomiast ogólna metoda przekształcająca dowolny protokół PIR w symetryczny PIR (w skrócie SPIR). SPIR różni się od zwykłego PIR (1.4.1) tym, że oprócz utrzymania w tajemnicy przed serwerem preferencji użytkownika, gwarantuje prywatność danych serwera. Mianowicie użytkownik (nawet ten nieuczciwy, próbujący dobrać tak zapytanie by uzyskać jak najwięcej informacji) w wyniku wykonania protokołu SPIR poznaje tylko jeden bit z bazy danych i nic więcej. Pokażemy teraz ogólną metodę ([20]) przekształcenia protokołu PIR na SPIR, opierającą się na trudności obliczeniowej decyzyjnego problemu Diffiego-Hellmana. Jeśli protokół PIR ma złożoność komunikacyjną C(n) oraz przebiega przez R(n) rund to wynikowy protokół ma złożoność komunikacyjną C(n) + 1 oraz przebiega przez co najwyżej R(n) + 1 rund. Załóżmy, że S jest w posiadaniu n bloków m1 , ..., mn danych oraz dla każdego i ∈ {1, ..., n}, zachodzi mi ∈ G. U zaś chce poznać mα . Niech g będzie generatorem grupy G, a h = g z , gdzie z ∈ {1, ..., |G|} jest losowo wybrane przez U i znane tylko jemu. Przebieg protokołu: • U wysyła do S y = g r ∗ hα , gdzie r jest losowym elementem wybranym ze zbioru {1, ..., |G|}. 31 • S oblicza ci = (g ki , mi ∗ (y/hi )ki ), 1 ≤ i ≤ n, gdzie ki są losowo wybranymi elementami ze zbioru {1, ..., |G|}. • S traktuje otrzymane wartości ci jako bloki z danymi (zauważmy, że nie ograniczamy się tu tylko do bloków składających się z jednego bitu). Następnie S i U wykonują protokół PIR, w którym U chce poznać cα . • U oblicza mα = b/ar , gdzie cα = (a, b). Przedstawiony powyżej schemat przekształca dowolny obliczeniowy 1-serwerowy PIR w 1-serwerowy obliczeniowy SPIR. Wiemy już jak zapewnić bezpieczeństwo obu stronom w przypadku pobierania tylko jednego bitu informacji. Czy jednak serwer jest bezpieczny gdy wykonywany jest protokół PERKY? Okazuje się, że nie. Nieuczciwy użytkownik, w przedstawionym protokole PERKY wyszukiwania prefiksowego, może już na początku protokołu dowiedzieć się, że serwer nie posiada szukanego przez niego słowa czyli, że w ∈ / W . Wtedy może spróbować tak pobierać elementy z kolejnych tablic Tj by dowiedzieć się, czy inne słowo kluczowe w0 6= w należy do W . Warto tu zauważyć, że być może nie jest to jedyny sposób w jaki użytkownik może dowiedzieć się pewnych dodatkowych informacji. Wielkości tablic Ti określają szerokości drzewa prefiksowego zbudowanego ze zbioru W , a w przedstawionym protokole PERKY wyszukiwania prefiksowego, użytkownik poznaje ich rozmiary, więc dowiaduje się jednocześnie pewnych własności słów ze zbioru W . Problemy te możemy jednak w dużej mierze przezwyciężyć. Po pierwsze po skonstruowaniu tablic T1 , ..., Tl , reprezentujących drzewo prefiksowe, serwer permutuje je. Dokonuje tego zaczynając od ostatniej tablicy Tl . Przy czym po spermutowaniu tablicy Ti (i > 1), zmienia odpowiednio wartości w tablicy Ti−1 , które to wskazywały indeksy w tablicy Ti , w taki sposób by wskazywały ten sam element co poprzednio. Łatwo zauważyć, że po takim przekształceniu użytkownik dowiaduje się czy w ∈ W , dopiero gdy pobierze wartości z tablicy Tl . Pozostaje jeszcze problem z poznaniem przez użytkownika wielkości tablic T1 , ..., Tl (daje to użytkownikowi pewne informacje na temat zbioru W ). Możemy częściowo rozwiązać ten problem zwiększając ilość słów, czyli dodając pewne dodatkowe słowa do zbioru W . Drugą metodą może być dodanie pewnej losowej ilości elementów do tablic T1 , ..., Tl . Jak zmieniać wielkości tablic wymaga głębszego zbadania, szczególnie ciekawe może być zagadnienie jak zwiększać ich rozmiar, by zminimalizować ilość informacji, które ”wyciekają” w wyniku poznania struktury drzewa prefiksowego. 32 Rozdział 4 Implementacja W rozdziale tym opiszemy zagadnienia związane z implementacją protokołów PERKY i PIR. Opiszemy ogólną architekturę implementowanego systemu oraz przeanalizujemy osiągnięte przez system rezultaty na przykładowej bazie danych. 4.1. Narzędzia System został zaimplementowany w języku java przy użyciu darmowego narzędzia Eclipse wspomagającego programowanie. Na wybór javy do implementacji złożyły się następujące czynniki: • Darmowy i łatwo dostępny kompilator • Możliwość uruchomienia systemu na wielu platformach bez konieczności przygotowania specjalnie na daną platformę dystrybucji. • Dostępność wielu klas i bibliotek kryptograficznych. • Łatwość budowy graficznego interfejsu użytkownika 4.2. Przyjęte założenia Implementacja protokołów PIR i PERKY miała charakter eksperymentalny. Oznacza to, że autor postawił sobie za zadanie stworzenie aplikacji sprawdzającej możliwości wykorzystania tych protokołów w praktyce, przetestowania na jak dużych danych mogą one działać przy dzisiejszych ograniczeniach sprzętowych oraz jak szybko się wykonują. 4.2.1. Długość klucza W systemie zaimplentowano dwie instancję problemu należenia do podgrupy: • Decyzyjny problem reszt kwadratowych • Decyzyjny problem Diffiego-Hellmana w grupie Z∗p , gdzie p jest liczbą pierwszą postaci p = 2*q +1, gdzie q jest liczbą pierwszą. Obecnie (grudzień 2004 roku) problemy te są praktycznie nie do rozwiązania gdy odpowiednie dla tych problemów grupy składają się z liczb 1024 bitowych (parametr bezpieczeństwa). 33 Ponieważ złożoność komunikacyjna implementowanych protokołów zależy od parametru bezpieczeństwa, więc chcielibyśmy używać jak najkrótszego klucza. Do tego celu świetnie nadają się grupy zbudowane przy użyciu krzywych eliptycznych. Długość klucza można wtedy zmniejszyć do 128 bitów uzyskując bardzo zbliżony poziom bezpieczeństwa. Jednak krzywe eliptyczne wymagają głębszego zbadania. Przewiduje się dodanie do funkcjonalności krzywych eliptycznych w następnej wersji aplikacji. 4.3. Architektura implementacji System składa się generalnie z dwóch części, serwera i klienta. Serwer jest odpowiedzialny (tak jak to wynika z protokołu) za zarządzanie bazą danych oraz obsługiwanie zapytań klientów. Serwer może obsługiwać kilku klientów jednocześnie i jest to konfigurowalny parametr systemu. Każde nowe połączenie z serwerem jest obsługiwane przez osobny wątek. Baza danych jest reprezentowana przez dwa pliki. Pierwszy z nich zawiera dane, drugi zaś zawiera słowa kluczowe i adresy gdzie w pierwszym pliku znajdują się odpowiadające danemu słowu kluczowemu informacje. Zalecane jest by dane zapisywać w jak najbardziej zwięzłej postaci, gdyż protokół PIR działa w czasie liniowym, względem ilości bitów tworzących bazę danych. Dodatkowo plik ze słowami kluczowymi zawiera informację jaka jest maksymalna długość słów kluczowych, co jest niezbędne do prawidłowego przebiegu protokołu wyszukiwania słów kluczowych. Serwer udostępnia dostęp do bazy danych poprzez protokół PIR lub PERKY. Każdy problem należenia do podgrupy musi dziedziczyć z abstrakcyjnej klasy SubgroupMembershipProblem. Klasami dziedziczącymi z klasy SubgroupMembershipProblem są w obecnej wersji systemu QRA i DDH oznaczające odpowiednio problemy odróżnienia reszt od niereszt kwadratowych oraz decyzyjny problem Diffiego-Hellmana. Grupę dla danej instancji problemu należenia do podgrupy opisuje klasa Group. Klasami dziedziczącymi z klasy Group są w obecnej wersji systemu GQRA i GDDH, grupy te są odpowiednie dla problemów opisanych w klasach QRA i DDH. Zauważmy, że klasa Group powinna implementować interfejs Serializable, gdyż obiekty podklas Group są wysyłane pomiędzy klientem i serwerem. GUI użytkownika (klasa UserGUI ) i serwera (klasa AdminGUI ) jest zaimplementowane w javie przy użyciu graficznych komponentów Swinga. 4.3.1. Dekompozycja logiczna systemu Dekompozycje systemu na komponenty przedstawia rysunek 4.1. Strzałki na rysunku przedstawiają poszczególne zależności między różnymi komponentami. W systemie zostało wyróżnionych sześć komponentów: • Interfejs użytkownika • Interfejs administratora • Logika biznesowa • Moduł komunikacyjny (protokoły) • Baza danych • Przechowywanie konfiguracji 34 warstwa interfejsów Interfejs administratora Interfejs uzytkownika warstwa logiki Logika biznesowa warstwa sieciowa Modul komunikayjny (protokoly) warstwa danych Przechowywanie konfiguracji Baza danych Rysunek 4.1: Dekompozycjonalny model systemu - diagram komponentów 4.3.2. Najważniejsze komponenty Interfejs użytkownika Ten komponent jest odpowiedzialny za przedstawianie pól tekstowych z komunikatami, pól tekstowych do wpisywania danych i wszelkich list tekstowych z możliwością zaznaczania odpowiednich pozycji, posiada także menu. Komponent ten reprezentuje klasa UserGUI. Interfejs Administratora Ten komponent, podobnie jak interfejs użytkownika jest odpowiedzialny za przedstawianie pól tekstowych z komunikatami, pól tekstowych do wpisywania danych i wszelkich list tekstowych z możliwością zaznaczania odpowiednich pozycji, posiada także menu. Dodatkowo jest w nim możliwość konfiguracji bazy danych. Komponent ten reprezentuje klasa AdminGUI. Moduł komunikacyjny Moduł komunikacyjny odpowiada za komunikację użytkownika z bazą danych. Udostępnia logice biznesowej komunikację z tymi serwerami na wyższym poziomie abstrakcji (np. ”połącz”, ”pobierz bit”, ”wyszukuj słowo”, itp.). Komunikacja pomiędzy serwerem a klientem odbywa się poprzez protokół TCP/IP. Rozwiązanie takie zostało przyjęte ze względy na niezawodność komunikacyjną (potwierdzanie i ewentualna retransmisja pakietów) bez której protokoły PIR i PERKY nie miały by szans działać poprawnie. Klient i serwer wymieniają informację dzięki strumieniom zaimplementowanym w klasach ObjectInputStream i ObjectOutputStream. Diagram 4.2 przedstawia projekt głównych klas dla komponentu moduł komunikacyjny. 35 Protocol -ois: ObjectInputStream -oos: ObjectOutputStream ProtocolClient KOProtocolClient ProtocolServer KOProtocolServer KWSProtocolClient KWSProtocolServer Rysunek 4.2: Główne klasy wchodzące w skład modułu komunikacyjnego Logika biznesowa Komponent ten zna odpowiednie protokoły, dzięki czemu przekazuje w odpowiedni sposób informacje do interfejsów użytkownika i administratora, a także modułu komunikacyjnego. Komponent ten jest także odpowiedzialny za odpowiednie interpretowanie czynności użytkownika np. gdy użytkownik w odpowiednim menu wybierze opcje ustawienia serwera z którym chce się połączyć i wpisze nazwę serwera i będzie chciał zapisać ustawienia to zostaną one przekazane do komponentu przechowywania konfiguracji i tam zapisane. Komponent ten jest głównym centrum zarządzania aplikacją. W tym komponencie są podejmowane decyzje (np. co wyświetlić, co przesłać do serwera i w drugą stronę) na podstawie akcji użytkownika i akcji serwera. Nadzorowanie nad aplikacją wiąże się z silnym powiązaniem z modułem komunikacyjnym i interfejsem użytkownika. Diagramy 4.3 przedstawiają projekt głównych klas dla komponentu logiki biznesowej. Przechowywanie konfiguracji Ten komponent przechowuje informacje o ustawieniach systemu. W szczególności umożliwia po stronie klienta i serwera na zapisywanie i wczytywanie ustawień systemu np. wprowadzonego adresu serwera, parametru bezpieczeństwa, czy ścieżek do plików z bazą danych. Baza danych Jest to komponent reprezentujący bazę danych. Ma on opcje do dodawania, usuwania oraz zapisywania na dysku słów kluczowych oraz powiązanych z nimi danych. Posiada też dane odnośnie użytkowników, którzy mogą korzystać z bazy danych, tj. login i hasło. Klasą reprezentującą ten komponent jest klasa DataBase. 4.4. Osiągnięte rezultaty (testy) Testy zostały przeprowadzone w sieci lokalnej umożliwiającej transmisję danych pomiędzy komputerami z prędkością 100Mb/s. Każdy z komputerów wyposażono w procesor Intel pen36 SubgroupMembershipProblem BitCode QRA Group State StateClient BitDecode DDH StateServer GDDH GQRA Rysunek 4.3: Główne klasy wchodzące w skład logiki biznesowej tium IV 2.4 GHz i 1G pamięcią RAM. W poniższej tabeli znajduje się kilka testów uwzględniających takie czynniki jak wielkość bazy danych, parametr bezpieczeństwa oraz rodzaj instancji problemu należnia do podgrupy. Duża przepustowość łączy miała minimalne znaczenie dla czasu wykonywania protokołów, gdyż implementowane protokoły mają niską złożoność komunikacyjną. Jak widać z zamieszczonych poniżej wyników (patrz tabela 4.1), protokół PIR działa w akceptowalnym czasie dla baz danych nie przekraczających wielkością kilkudziesięciu megabajtów. Poza tym warto wspomnieć, że przedstawiona implementacja protokołu PIR, a przede wszystkim PERKY potrzebuje znaczącej ilości pamięci operacyjnej by móc poprawnie działać. Tabele 4.2 i 4.3 zawierają czas działania protokołu PERKY w zależności od ilości słów kluczowych przechowywanych w bazie danych. Pierwsza przedstawia wyniki przy wykorzystaniu problemu QRA, a druga przy wykorzystaniu problem DDH. Tabela 4.4 pokazuje wpływ ilości użytkowników na szybkość wykonywania protokołu PIR. Jak widzimy zwiększenie ilości jednocześnie obsługiwanych użytkowników do dwóch wpływa liniowo na czas przebiegu protokołu. Warto jeszcze zaznaczyć, że duży wpływ na czas działania protokołu PIR ma odpowiednie ustalenie współczynników t i l (patrz podrozdział 2.1.2). Z przeprowadzonych testów (4.5) wynika, że współczynnik t nie powinien przekraczać 5000, natomiast współczynnik l nie powinien być większy niż 3. 37 wielkość bazy danych (w bitach) 10000 10000 10000 10000 100000 100000 100000 100000 1000000 1000000 1000000 1000000 10000000 10000000 10000000 10000000 100000000 100000000 100000000 100000000 parametr bezpieczeństwa 128 256 512 1024 128 256 512 1024 128 256 512 1024 128 256 512 1024 128 256 512 1024 czas w sekundach pobrania jednego bitu (QRA) 0.3 1.0 3.8 23.5 0.9 3.0 5.6 11.8 3.1 9.8 44.9 240.1 20.2 60.0 173.7 811.9 225.4 463.7 1778.8 7437.2 czas w sekundach pobrania jednego bitu (DDH) 0.5 1.9 7.2 30.6 1.1 6.5 7.8 13.9 8.0 20.6 74.1 384.4 50.3 118.8 301.5 1033.6 451.3 904.9 3289.6 10343.3 Tabela 4.1: Wyniki pomiarów czasowych protokołu PIR (patrz podrozdział 2.1.2) dla różnej wielkości baz danych. ilość słów kluczowych 10 100 800 3200 6400 12800 25600 51200 czas działania protokołu (w sekundach) przy maksymalnej długości słów kluczowych 15 znaków 5.3 13.0 29.1 43.0 89.2 187.9 255.2 430.8 czas działania protokołu (w sekundach) przy maksymalnej długości słów kluczowych 30 znaków 8.8 26.3 58.1 86.3 182.5 377.6 537.1 891.9 Tabela 4.2: Wyniki czasowe protokołu PERKY przy użyciu problemu odróżnienia reszt kwadratowych od niereszt 38 ilość słów kluczowych 10 100 800 3200 6400 12800 25600 51200 czas działania protokołu (w sekundach) przy maksymalnej długości słów kluczowych 15 znaków 5.4 12.3 27.7 55.6 98.6 136.4 192.2 356.7 czas działania protokołu (w sekundach) przy maksymalnej długości słów kluczowych 30 znaków 7.2 15.9 38.0 67.2 141.4 205.9 326.3 499.5 Tabela 4.3: Wyniki czasowe protokołu PERKY przy użyciu problemu Diffiego-Hellmana. wielkość bazy danych (w bitach) parametr bezpieczeństwa 10000 100000 1000000 10000000 10000 100000 1000000 10000000 512 512 512 512 1024 1024 1024 1024 czas w sekundach pobrania jednego bitu (QRA) 5.1 13.7 52.6 241.8 41.2 93.1 285.3 420.8 czas w sekundach pobrania jednego bitu (DDH) 17.0 32.5 108.6 510.2 174.4 273.5 599.7 905.1 Tabela 4.4: Średnie wyniki czasowe protokołu PIR dla jednego użytkownika przy jednoczesnej obsłudze przez serwer dwóch klientów. 39 wielkość bazy danych (w bitach) 10000 10000 10000 100000 100000 1000000 1000000 10000000 10000000 100000000 100000000 parametr bezpieczeństwa 512 512 512 512 512 512 512 512 512 512 512 współczynnik t współczynnik l 10000 100 22 317 47 1000 100 3163 216 10000 465 1 2 3 2 3 2 3 2 3 2 3 czas w sekundach pobrania jednego bitu (QRA) 90.2 5.4 8.9 6.1 13.1 45.6 85.6 173.8 220.3 320.4 291.8 Tabela 4.5: Wyniki czasowe protokołu PIR przy jednoczesnej obsłudze, przez serwer, dwóch klientów. 40 Rozdział 5 Podsumowanie W rozdziale tym przedstawimy krótkie podsumowanie, czego udało się dokonać w niniejszej pracy. Przedstawimy ogólne rezultaty i wskażemy co można i co trzeba usprawnić by prywatne pozyskiwanie informacji znalazło zastosowanie w dużych komercyjnych bazach danych. 5.1. Wnioski W niniejszej pracy zaprezentowaliśmy dziedzinę PIR, koncentrując się na 1-serwerowych protokołach PIR. Opisaliśmy eksperyment polegający na implementacji protokołów PIR i PERKY oraz sprawdzeniu ich użyteczności w rzeczywistej aplikacji. W pracy tej opisaliśmy też szczegółowo zależności pomiędzy protokołami PIR i PERKY dotyczące bezpieczeństwa i złożoności protokołów. Opisany i dostarczony razem z pracą system może stać się bardzo pomocny przy implementowaniu nowszych protokołów. System umożliwia łatwe dołączenie nowego 1-serwerowego protokołu PIR do niego i przetestowanie go w praktyce. Implementacja opisanych w tej pracy protokołów PIR pokazują ich użyteczność dla stosunkowo niewielkich baz danych (do kilkudziesięciu MB). Ogranicza to zastosowanie przedstawionych tu protokołów PIR do wyłącznie specjalistycznych celów. Mogą je z powodzeniem stosować duże korporację do swoich celów biznesowych. Niestety udostępnienie korzystania z protokołów PIR jednocześnie przez dużą liczbę użytkowników jest jeszcze nie do przyjęcia ze względu na dużą ilość obliczeń wykonywaną przez serwer podczas obsługi jednego zapytania. 5.2. Kierunki rozwoju Prywatne pozyskiwanie informacji od kilku lat przechodzi burzliwy rozwój. Na początku rozwoju tej dziedziny, stawiano na minimalizację komunikacji pomiędzy użytkownikiem i serwerem. W 1-serwerowym PIR czynnik komunikacyjny odchodzi na drugi plan ze względu na ilość obliczeń jakie musi wykonać serwer. Ilość obliczeń wykonywanych przez serwer jest w bieżącej chwili wąskim gardłem dla 1-serwerowych PIR. Potrzebna jest więc metoda zmniejszająca ilość obliczeń. Metodą taką może być wstępne przetworzenie zawartości bazy danych, w sposób ułatwiający późniejszą odpowiedź na zapytania użytkownika. Metoda taka istnieje dla 2-serwerowego PIR, niestety obecnie nie wiadomo czy analogiczna metoda da się zaaplikować do 1-serwerowego PIR. Poważnym mankamentem jest też brak 1-serwerowych protokołów PIR, umożliwiających pobieranie bloku danych zamiast tylko jednego bitu. Przy czym długość bloku danych powinien być modyfikowalnym parametrem protokołu. Próba konstrukcji takiego protokołu została przedstawiona w pracy [7], niestety protokół ten okazał się niedostatecznie bezpieczny. 41 Powstanie 1-serwerowego protokołu PIR, zawierającego obie wyżej wymienione cechy umożliwi aplikację go do komercyjnych zastosowań na dużą skalę. W połączeniu z innymi technikami kryptograficznymi takimi jak anonimizacja, prywatność użytkownika wejdzie na wyższy poziom i znacząco zwiększy bezpieczeństwo w Internecie. 42 Dodatek A Zawartość płyty CD tj praca mgr.pdf user.jar admin.jar srcpirp keyWords.pir dataBase.pir all files.rar Praca magisterska w formacie PDF Skompilowana część kliencka aplikacji Skompilowana część serwerowa aplikacji Katalog zawierający kompletne źródła aplikacji Przykładowy zbiór słów kluczowych Przykładowa baza danych Wszystkie powyższe pliki skompresowane w jedno archiwum RAR 43 Dodatek B Działanie aplikacji B.1. Kompilacja Do skompilowania źródeł potrzebny jest kompilator javac z platformy J2SE w wersji 1.4.2 lub nowszej. Po skopiowaniu źródeł z katalogu srcpirp z płyty do katalogu na dysku, wykonujemy w tym katalogu komendę javac *.java. B.2. Uruchamianie Jeśli kompilowaliśmy aplikację ze źródeł to wykonujemy w środowisku graficznym polecenia: • java UserGUI.class - uruchamia część kliencką aplikacji. • java AdminGUI.class - uruchamia część serwerową aplikacji do administracji bazą danych Jeśli natomiast nie kompilowaliśmy źródeł wykonujemy polecenia: • java -jar user.jar - uruchamiające aplikację kliencką (patrz rys. B.1). • java -jar admin.jar - uruchamiające aplikację serwerową do administracji bazą danych (patrz rys. B.2) Po uruchomieniu aplikacji zarządzającej bazą danych musimy odpowiednio ustawić ścieżki do plików zawierających słowa kluczowe i bazę danych (po wpisaniu odpowiednich ścieżek trzeba zapisać ustawienia klikając na przycisk ’Save settings’). Po ustawieniu i zapisaniu ścieżek do plików, klikając na zakładkę ’Edition’ możemy sprawdzić co zawiera nasza baza danych i jakie słowa kluczowe są jej przypisane (patrz rys B.3). Po lewej stronie zakładki ’Edit data’ znajduje się lista słów kluczowych, a po prawej dane powiązane z podświetlonym aktualnie słowem kluczowym. Możemy dodawać i usuwać słowa kluczowe, służą do tego odpowiednio przyciski ’Add’ i ’Remove’. Po dodaniu słowa kluczowego jest mu przypisany element w bazie danych który nie zawiera żadnych informacji. By wprowadzić lub zmienić informacje przypisane danemu słowu kluczowemu, zaznaczamy znacznik ’Edit element’, modyfikujemy pole tekstowe ’Element’, a następnie klikamy przycisk ’Save element’ by zapisać zmiany w danym elemencie. Żeby zapisać wprowadzone zmiany na dysk klikamy przycisk ‘Save all changes to disk’. By rozpocząć działanie serwera, klikamy na zakładce ‘Server’ (patrz rys. B.2) przycisk ‘Start’. 45 Rysunek B.1: Zrzut ekranu po uruchomieniu aplikacji klienckiej (zakładka ’Application’) Rysunek B.2: Zrzut ekranu po uruchomieniu aplikacji dla administratora (zakładka ’Server’) 46 Rysunek B.3: Zrzut ekranu pokazujący zakładkę ’Edit data’ na której możemy modyfikować zawartość bazy danych. By połączyć się z serwerem, uruchamiamy odpowiednim poleceniem stronę kliencką i na zakładce ‘Application’ klikamy przycisk ‘Connect’. Zakładka ‘Settings’ służy do konfiguracji ustawień, które w większości można zmienić tylko gdy nie jest się połączonym z serwerem. Wprowadzone zmiany zatwierdzamy klikając w przycisk ‘OK’. B.3. Działanie aplikacji Po uruchomieniu serwera i klienta oraz nawiązaniu połączenia, możemy wykonać protokół PIR lub PERKY. By wykonać protokół PERKY wpisujemy w odpowiednie pole (patrz rys. B.1) słowo kluczowe i klikamy w przycisk ’Search’. W czasie wykonywania protokołu będziemy informowani poprzez znajdujący się na dole pasek postępu, ile procent protokołu zostało już zrealizowane. Jeśli szukane przez nas słowo kluczowe zostanie odnalezione w bazie danych jesteśmy o tym informowani odpowiednim komunikatem, a w odpowiednim polu pojawi się informacja z adresem pod którym znajduje się element odpowiadający naszemu słowu kluczowemu. By pobrać ten element klikamy przycisk ’Retrieve data’. Tak jak poprzednio na pasku postępu jesteśmy informowani o procentowej realizacji protokołu. Po zakończeniu protokołu PIR, z prawej strony ekranu na polu ’Received text’, zostanie wyświetlony tekst z szukanymi informacjami. Można oczywiście pobierać dane z bazy danych bez wyszukiwania przez słowa kluczowe. Wymaga to jednak znajomości ich adresu w bazie danych. By zakończyć działanie aplikacji klienta, klikamy przycisk ’Disconnect’ (patrz rys. B.1). Natomiast by zatrzymać serwer klikamy w przycisk ’Stop’ (patrz rys. B.2). 47 Rysunek B.4: Zrzut ekranu z zakładki ’Settings’ z aplikacji klienckiej, w której można dokonać modyfikacji parametrów protokołów. 48 Bibliografia [1] C. Beaumont. What price privacy when dotcoms go down? NEW ZELAND HERALD, 2001. [2] Benny Chor, Oded Goldreich, Eyal Kushilevitz, and Madhu Sudan. Private information retrieval. In IEEE Symposium on Foundations of Computer Science, pages 41–50, 1995. [3] Benny Chor and Niv Gilboa. Computationally private information retrieval (extended abstract). In STOC ’97: Proceedings of the twenty-ninth annual ACM symposium on Theory of computing, pages 304–313. ACM Press, 1997. [4] Eyal Kushilevitz and Rafail Ostrovsky. Replication is NOT needed: SINGLE database, computationally-private information retrieval. In IEEE Symposium on Foundations of Computer Science, pages 364–373, 1997. [5] Akihiro Yamamura and Taiichi Saito. Private information retrieval based on the subgroup membership problem. Lecture Notes in Computer Science, 2119:206–221, 2001. [6] Christian Cachin, Silvio Micali, and Markus Stadler. Computationally private information retrieval with polylogarithmic communication. Lecture Notes in Computer Science, 1592:402–415, 1999. [7] Aggelos Kiayias and Moti Yung. Secure games with polynomial expressions. Lecture Notes in Computer Science, 2076:939–951, 2001. [8] Don Coppersmith and Madhu Sudan. Reconstructing curves in three (and higher) dimensional space from noisy data. In STOC ’03: Proceedings of the thirty-fifth annual ACM symposium on Theory of computing, pages 136–142. ACM Press, 2003. [9] Yan-Cheng Chang. Single database private information retrieval with logarithmic communication, 2004. [10] Gilles Brassard, Claude Crepeau, and Jean-Marc Robert. All-or-nothing disclosure of secrets. In CRYPTO, pages 234–238, 1986. [11] Shafi Goldwasser and Mihir Bellare. Lecture notes on cryptography. Summer Course “Cryptography and Computer Security” at MIT, 1996–2001, 2001. [12] Ueli M. Maurer and Stefan Wolf. The relationship between breaking the Diffie-Hellman protocol and computing discrete logarithms. SIAM Journal on Computing, 28(5):1689– 1721, 1999. [13] Todd Smith, Suresh Srinivas, Philipp Tomsich, and Jinpyo Park. Practical experiences with java compilation. In HiPC, pages 149–157, 2000. 49 [14] S. W. Smith and D. Safford. Practical server privacy with secure coprocessors. IBM Systems Journal issue, 40-3:683–695, 2001. [15] Bennet Yee. Using secure coprocessors. PhD thesis, May 1994. [16] Sean W. Smith, Elaine R. Palmer, and Steve Weingart. Using a high-performance, programmable secure coprocessor. In FC ’98: Proceedings of the Second International Conference on Financial Cryptography, pages 73–89. Springer-Verlag, 1998. [17] Peter Gutmann. An open-source cryptographic coprocessor. In USENIX, editor, Proceedings of the Ninth USENIX Security Symposium, August 14–17, 2000, Denver, Colorado, Berkeley, CA, USA, 2000. USENIX. [18] Yael Gertner, Shafi Goldwasser, and Tal Malkin. A random server model for private information retrieval or how to achieve information theoretic PIR avoiding database replication. Lecture Notes in Computer Science, 1518:200–214, 1998. [19] B. Chor, N. Gilboa, and M. Naor. Private information retrieval by keywords, 1997. [20] Wen-Guey Tzeng. Efficient oblivious transfer schemes, 2001. 50