Przeskocz do treści

Delta mi!

Dlaczego niepotrzebne nam hasło do skrzynki mailowej?

Michał Zając

o artykule ...

  • Publikacja w Delcie: grudzień 2012
  • Publikacja elektroniczna: 30-11-2012
  • Autor: Michał Zając
    Afiliacja: Instytut Informatyki, Uniwersytet Warszawski
obrazek

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ą math (od angielskiego słowa Prover; gracz ten jest nazywany także klientem), drugi będzie weryfikował informacje przesyłane przez gracza math i oznaczany będzie literą math (od angielskiego słowa Verifier; inna nazwa tego gracza to weryfikator).

W protokole wykorzystywane są dwa grafy o math wierzchołkach, math  i math  Gracz math 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 math oraz grafami math  i math  znanymi publicznie, podanymi przez gracza math podczas zakładania konta. Gracz math chcąc przekonać bank, że on to on, przedstawia się, a następnie wykazuje, że jest osobą, która potrafi udowodnić izomorficzność grafów math  i math  Mógłby to, oczywiście, zrobić, zdradzając permutację math jednak po takim zabiegu nic nie stałoby na przeszkodzie, by nieuczciwy gracz math  po poznaniu permutacji podszył się pod klienta math wypłacając w jego imieniu dużą ilość gotówki. Zamiast tego gracze math i math przeprowadzą między sobą math razy następujący protokół (oznaczmy go jako math):

(1)
Klient math wybiera losową permutację math zbioru math -elementowego i przesyła do weryfikatora math graf math
(2)
Weryfikator math przysyła graczowi math losowy bit math
(3)
Jeśli otrzymany przez gracza math bit ma wartość 0, to wybiera on nową permutację math a w przeciwnym przypadku math Gracz math wysyła następnie permutację math do weryfikatora math
(4)
Weryfikator math sprawdza teraz, czy math  Jeśli tak, to uznaje, że gracz math 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 math 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 math po wykonaniu (nawet wielokrotnym) protokołu math nie może podszyć się pod gracza math

Na początku wykażemy, że jeśli klient math jest uczciwy, to weryfikator math zaakceptuje jego próbę uwierzytelnienia się. Otóż jeżeli bit wysłany przez weryfikatora math w drugim kroku protokołu miał wartość 0, to uczciwy klient math odpowiedział na niego permutacją math co daje math Załóżmy teraz, że przesłany bit miał wartość 1. Klient math wysyła wtedy permutację math więc math Zatem w obu przypadkach math i weryfikator math  akceptuje wykonanie protokołu.

Wykażemy teraz, dlaczego protokół math zostanie przerwany przez weryfikatora math jeśli oszust math  będzie próbował przekonać go do nieprawdziwego twierdzenia. Przyjmijmy więc, że klient math  został pozytywnie zweryfikowany przez math podczas gdy grafy math  i math  nie są izomorficzne. Załóżmy, że w każdym z math wykonań protokołu oszust umiał odpowiedzieć poprawnie, zarówno wtedy, gdy zadany w drugim kroku bit miał wartość 0, jak i 1. Niech math i math oznaczają funkcje math otrzymane w trzecim kroku algorytmu, gdy zadany przez weryfikatora math bit miał odpowiednio wartość 0 i 1. Mamy wtedy math  i math  oraz math  Czyli, znając math i math oszust math  jest w stanie wskazać izomorfizm pomiędzy grafami math  i math  co nie jest możliwe. Mogło oczywiście być tak, że w każdym z math wykonań protokołu gracz math  poprawnie zgadł wartość bitu, o jaki zostanie zapytany przez sprawdzającego math (łatwo wykazać, że stworzenie takiego grafu math iż oszust math  jest w stanie poprawnie odpowiedzieć na dokładnie jedną wartość bitu math nie stanowi problemu, jednak wtedy szansa na powodzenie tej iteracji protokołu wynosi dokładnie math gdyż takie jest prawdopodobieństwo, że weryfikator math wylosuje bit math o ustalonej wartości). Jednak to zdarzenie ma prawdopodobieństwo równe math a więc dla odpowiednio dużego math jest zaniedbywalnie małe.

Powyższe rozumowanie wykazuje również, iż nieuczciwy gracz math który próbuje przekonać weryfikatora math do tego, że zna permutację math taką że math  mimo braku tej wiedzy, też nie zakończy protokołu sukcesem (tj. zaakceptowaniem przez weryfikatora math).

Aby wykazać, że weryfikator math w podanym protokole nie dowiaduje się niczego istotnego o sekrecie gracza math 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 math gdzie math jest zaniedbywalnie małe). Symulator math  wykonuje protokół z weryfikatorem math „podszywając się” pod math ( math  nie ma dostępu do prywatnych informacji gracza math a jedynie zna jego odpowiedzi na pewną liczbę zapytań w procesie weryfikacji). Protokół math jest bezpieczny, gdy weryfikator math nie jest w stanie stwierdzić, czy operacje, które wykonuje, przeprowadza z prawdziwym graczem math czy z symulatorem math  (prawdopodobieństwo, że odpowie dobrze, jest równe math gdzie math jest zaniedbywalnie małe). Formalny opis symulatora math  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.

math-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 math

Aby ograniczyć liczbę iteracji do minimum (czytaj: do jednej), wprowadzono protokoły, w których gracz weryfikujący math przesyła w drugim kroku zamiast pojedynczego bitu math ciąg math zwany wyzwaniem, który traktujemy jako liczbę naturalną zapisaną binarnie. Ilustracją tej metody może być protokół zaprezentowany poniżej:

Przykład 2

Niech math i math będą liczbami pierwszymi, takimi że math jest dzielnikiem math i niech math będzie elementem rzędu math w grupie math Ponadto niech math W zaprezentowanym protokole wartości math i math są publiczne, a gracz math będzie przekonywać gracza math że zna wartość math  Zrobi to w następujący sposób:

(1)
Gracz math wybiera losowo liczbę math z ciała math a następnie wysyła graczowi math liczbę math
(2)
Weryfikator math wybiera losowe wyzwanie math i wysyła je graczowi math
(3)
Gracz math oblicza math  i wysyła tę wartość weryfikatorowi.
(4)
Weryfikator sprawdza, czy math Jeśli tak, akceptuje protokół, a jeśli nie, przerywa go.

Przede wszystkim zauważmy, że uczciwy gracz math zostanie zawsze zaakceptowany przez gracza math Jak łatwo sprawdzić, math co jest zgodne z ostatnim punktem protokołu.

math -protokoły mają jeszcze jedną interesującą własność: jeśli gracz math potrafi przy danym math odpowiedzieć na dwa różne wyzwania math i math to potrafi znaleźć świadka math  (a zatem odpowiedzieć na dowolne wyzwanie). Przyjmując, że odpowiedzią gracza math na wyzwanie math było math a odpowiedzią na wyzwanie math  było math mamy:

display-math

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

display-math

W ten sposób uzyskaliśmy math  (dzielenie rozumiemy tutaj jako mnożenie przez odwrotność modulo math). Zatem jeśli gracz math nie zna sekretu math  to jest w stanie odpowiedzieć poprawnie na co najwyżej jedno wyzwanie weryfikatora math (na jakie wyzwanie konkretnie będzie chciał odpowiadać, wybiera, tworząc wiadomość math). Prawdopodobieństwo, że gracz math wyśle mu wybrane przez niego wyzwanie math wynosi math a więc jest zaniedbywalnie małe.

Warto w tym miejscu zaznaczyć, że math-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 math 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...


Literatura
[1]
M. Bellare, O. Goldreich, On defining proofs of knowledge, Crypto 92.
[2]
I. Damgård, On math-protocols
[3]
I. Damgård, J. B. Nielsen, Commitment schemes and zero-knowledge protocols
[4]
A. Fiat and A. Shamir, How to prove yourself: practical solutions to the identification and signature problem, Crypto 86.
[5]
O. Goldreich, S. Micali, A. Wigderson, Proofs that yield nothing but their validity and a methodology of cryptographic protocol design, FOCS 86, 174-187.
[6]
C. Schnorr, Efficient signature generation by smart cards, J. Cryptology 4(3), 1991.