Dlaczego niepotrzebne nam hasło do skrzynki mailowej?

Zapewne zdecydowana większość Czytelników ma skrzynkę poczty elektronicznej. Dostęp do skrzynki uzyskuje się przez podanie w specjalnym formularzu na stronie internetowej nazwy użytkownika i hasła. Te dane są następnie szyfrowane i wysyłane do serwera pocztowego, który porównuje je z umieszczonymi na nim wzorcami. Tak, w dużym uproszczeniu, wygląda proces weryfikacji użytkownika na serwerze.
Czy można wyobrazić sobie inną metodę uzyskiwania dostępu do skrzynki pocztowej? Taką, by nie trzeba było podawać hasła? W końcu stanowi to pewne zagrożenie dla naszego bezpieczeństwa: jeśli ktoś przechwyci, w ten czy inny sposób, nasze hasło i nazwę użytkownika, to uzyska nieograniczony dostęp do naszych zasobów – listów, dokumentów, historii przejrzanych stron – czego zapewne sobie nie życzymy.
Dowody z wiedzą zerową
Z pomocą przychodzą wtedy tzw. dowody z wiedzą zerową. Są to protokoły pozwalające na potwierdzenie faktu znajomości pewnej informacji bez ujawniania jej. Dla lepszego zilustrowania tego typu protokołów rozpatrzmy następujący przykład weryfikacji tożsamości w banku:
Przykład 1
W protokole tym będzie brało udział dwóch „graczy” – pierwszy będzie chciał
potwierdzić swoją tożsamość i oznaczany będzie literą
(od
angielskiego słowa Prover; gracz ten jest nazywany także klientem), drugi będzie
weryfikował informacje przesyłane przez gracza
i oznaczany będzie
literą
(od angielskiego słowa Verifier; inna nazwa tego gracza to
weryfikator).
W protokole wykorzystywane są dwa grafy o
wierzchołkach,
i
Gracz
będzie starał się udowodnić, że są one
izomorficzne. Należy tu nadmienić, że stwierdzenie, czy dane dwa grafy są
izomorficzne, jest w ogólnym przypadku problemem trudnym obliczeniowo
i nie jest znane jego rozwiązanie działające w czasie wielomianowym.
Ale jaki związek ma dowodzenie izomorficzności grafów z uwierzytelnianiem?
Możemy przyjąć, że w bazie danych banku znajduje się informacja
z imieniem i nazwiskiem gracza
oraz grafami
i
znanymi publicznie, podanymi przez gracza
podczas
zakładania konta. Gracz
chcąc przekonać bank, że on to on,
przedstawia się, a następnie wykazuje, że jest osobą, która potrafi udowodnić
izomorficzność grafów
i
Mógłby to, oczywiście,
zrobić, zdradzając permutację
jednak po takim zabiegu nic nie
stałoby na przeszkodzie, by nieuczciwy gracz
po poznaniu
permutacji podszył się pod klienta
wypłacając w jego imieniu dużą
ilość gotówki. Zamiast tego gracze
i
przeprowadzą
między sobą
razy następujący protokół (oznaczmy go jako
):
- (1)
- Klient
wybiera losową permutację
zbioru
-elementowego i przesyła do weryfikatora
graf
- (2)
- Weryfikator
przysyła graczowi
losowy bit
- (3)
- Jeśli otrzymany przez gracza
bit ma wartość 0, to wybiera on nową permutację
a w przeciwnym przypadku
Gracz
wysyła następnie permutację
do weryfikatora
- (4)
- Weryfikator
sprawdza teraz, czy
Jeśli tak, to uznaje, że gracz
pomyślnie przeszedł proces weryfikacji. Jeśli nie, odrzuca jego próbę i przerywa protokół.
Od takiego protokołu będziemy wymagać trzech rzeczy. Po pierwsze, protokół
przeprowadzony przez uczciwego gracza
musi zostać zaakceptowany.
Po drugie, próba udowodnienia nieprawdziwego twierdzenia (w tym przypadku
– próba wykazania, że dwa nieizomorficzne grafy są izomorficzne) powinna
powodować zatrzymanie i brak akceptacji protokołu (z prawdopodobieństwem
bliskim 1). Podobnie będzie z próbą udowodnienia prawdziwego twierdzenia
przy braku znajomości przez gracza permutacji wyznaczającej izomorfizm.
Trzecią własnością jest wiedza zerowa, tj. weryfikator
po wykonaniu
(nawet wielokrotnym) protokołu
nie może podszyć się pod gracza
Na początku wykażemy, że jeśli klient
jest uczciwy, to weryfikator
zaakceptuje jego próbę uwierzytelnienia się. Otóż jeżeli bit wysłany
przez weryfikatora
w drugim kroku protokołu miał wartość 0, to
uczciwy klient
odpowiedział na niego permutacją
co daje
Załóżmy teraz, że przesłany bit miał
wartość 1. Klient
wysyła wtedy permutację
więc
Zatem w obu przypadkach
i weryfikator
akceptuje wykonanie protokołu.
Wykażemy teraz, dlaczego protokół
zostanie przerwany przez
weryfikatora
jeśli oszust
będzie próbował przekonać go
do nieprawdziwego twierdzenia. Przyjmijmy więc, że klient
został
pozytywnie zweryfikowany przez
podczas gdy grafy
i
nie są izomorficzne. Załóżmy, że w każdym z
wykonań
protokołu oszust umiał odpowiedzieć poprawnie, zarówno wtedy, gdy
zadany w drugim kroku bit miał wartość 0, jak i 1. Niech
i
oznaczają funkcje
otrzymane w trzecim kroku algorytmu, gdy
zadany przez weryfikatora
bit miał odpowiednio wartość 0 i 1. Mamy
wtedy
i
oraz
Czyli,
znając
i
oszust
jest w stanie wskazać izomorfizm
pomiędzy grafami
i
co nie jest możliwe. Mogło
oczywiście być tak, że w każdym z
wykonań protokołu gracz
poprawnie zgadł wartość bitu, o jaki zostanie zapytany przez
sprawdzającego
(łatwo wykazać, że stworzenie takiego grafu
iż oszust
jest w stanie poprawnie odpowiedzieć na
dokładnie jedną wartość bitu
nie stanowi problemu, jednak wtedy
szansa na powodzenie tej iteracji protokołu wynosi dokładnie
gdyż
takie jest prawdopodobieństwo, że weryfikator
wylosuje bit
o ustalonej wartości). Jednak to zdarzenie ma prawdopodobieństwo
równe
a więc dla odpowiednio dużego
jest zaniedbywalnie
małe.
Powyższe rozumowanie wykazuje również, iż nieuczciwy gracz
który próbuje przekonać weryfikatora
do tego, że zna
permutację
taką że
mimo braku tej wiedzy, też
nie zakończy protokołu sukcesem (tj. zaakceptowaniem przez weryfikatora
).
Aby wykazać, że weryfikator
w podanym protokole nie dowiaduje
się niczego istotnego o sekrecie gracza
tj. mimo wielokrotnego
przeprowadzenia protokołu nie jest w stanie podszyć się pod niego,
wprowadza się pojęcie symulatora działającego w czasie wielomianowym
(z prawdopodobieństwem równym
gdzie
jest
zaniedbywalnie małe). Symulator
wykonuje protokół z weryfikatorem
„podszywając się” pod
(
nie ma dostępu do
prywatnych informacji gracza
a jedynie zna jego odpowiedzi na pewną
liczbę zapytań w procesie weryfikacji). Protokół
jest bezpieczny,
gdy weryfikator
nie jest w stanie stwierdzić, czy operacje,
które wykonuje, przeprowadza z prawdziwym graczem
czy
z symulatorem
(prawdopodobieństwo, że odpowie dobrze,
jest równe
gdzie
jest zaniedbywalnie małe).
Formalny opis symulatora
i przeprowadzenie pełnego rozumowania
wymaga
wprowadzenia dużej ilości nowej terminologii i zostanie w tym artykule pominięte. Zainteresowani Czytelnicy są zachęcani do przeczytania literatury podanej na końcu artykułu.
-protokoły
Zaprezentowany powyżej protokół musiał być wykonywany wiele razy pod
rząd, by można go było użyć do weryfikacji, ponieważ poprawne
„przejście” jego pojedynczej iteracji przez nieuprawnionego gracza ma szansę
powodzenia
Aby ograniczyć liczbę iteracji do minimum (czytaj: do jednej), wprowadzono
protokoły, w których gracz weryfikujący
przesyła w drugim kroku
zamiast pojedynczego bitu
ciąg
zwany wyzwaniem,
który traktujemy jako liczbę naturalną zapisaną binarnie. Ilustracją tej metody
może być protokół zaprezentowany poniżej:
Przykład 2
Niech
i
będą liczbami pierwszymi, takimi że
jest
dzielnikiem
i niech
będzie elementem rzędu
w grupie
Ponadto niech
W zaprezentowanym protokole
wartości
i
są publiczne, a gracz
będzie
przekonywać gracza
że zna wartość
Zrobi to
w następujący sposób:
- (1)
- Gracz
wybiera losowo liczbę
z ciała
a następnie wysyła graczowi
liczbę
- (2)
- Weryfikator
wybiera losowe wyzwanie
i wysyła je graczowi
- (3)
- Gracz
oblicza
i wysyła tę wartość weryfikatorowi.
- (4)
- Weryfikator sprawdza, czy
Jeśli tak, akceptuje protokół, a jeśli nie, przerywa go.
Przede wszystkim zauważmy, że uczciwy gracz
zostanie
zawsze zaakceptowany przez gracza
Jak łatwo sprawdzić,
co jest zgodne z ostatnim
punktem protokołu.
-protokoły mają jeszcze jedną interesującą własność: jeśli gracz
potrafi przy danym
odpowiedzieć na dwa różne wyzwania
i
to potrafi znaleźć świadka
(a zatem
odpowiedzieć na dowolne wyzwanie). Przyjmując, że odpowiedzią gracza
na wyzwanie
było
a odpowiedzią na wyzwanie
było
mamy:

Dzieląc jedno równanie przez drugie i mając na uwadze fakt, że
otrzymamy

W ten sposób uzyskaliśmy
(dzielenie rozumiemy tutaj
jako mnożenie przez odwrotność modulo
). Zatem jeśli gracz
nie zna sekretu
to jest w stanie odpowiedzieć poprawnie na
co najwyżej jedno wyzwanie weryfikatora
(na jakie wyzwanie
konkretnie będzie chciał odpowiadać, wybiera, tworząc wiadomość
).
Prawdopodobieństwo, że gracz
wyśle mu wybrane przez
niego wyzwanie
wynosi
a więc jest zaniedbywalnie
małe.
Warto w tym miejscu zaznaczyć, że
-protokoły nie mają wspomnianej
wcześniej własności bycia protokołem z wiedzą zerową. Są nimi,
jeśli przyjmiemy dodatkowe założenie – o uczciwości weryfikatora
Wydaje się, że jest ono niezbyt praktyczne, ale własność ta jest
wystarczająca do budowy wielu bardziej złożonych konstrukcji, które mają
zastosowanie w realnym świecie. Na przykład, można dzięki nim zbudować
efektywny system obsługi płatności elektronicznych, który zapewnia taką
samą anonimowość jak płacenie gotówką. Ale to już całkiem inna
historia...