A jednak się da!
Bez zobowiązań o zobowiązaniach (AJSD II)
Zapewne każdy z czytających te słowa grał kiedyś w marynarza, ale na wypadek gdyby któryś z Czytelników miał smutne dzieciństwo pozbawione tej gry, pokrótce wyjaśnię zasady: na ustalony sygnał każdy z uczestników przedstawia wybraną przez siebie liczbę (najczęściej przy użyciu własnych palców). Następnie rozpoczyna się (cykliczne) wyliczanie uczestników aż do sumy przedstawionych przez nich liczb (oczywiście, należy zawczasu ustalić, od kogo rozpoczyna się wyliczanka). Osoba, na której zakończy się wyliczanie, jest "zwycięzcą" (wziętym w cudzysłów, gdyż "nagrodą" może być, na przykład, zmywanie naczyń)...
Niestety, przedstawiona procedura ma pewną techniczną trudność, która była źródłem niejednej podwórkowej kłótni - jeśli któryś z uczestników opóźni się z przedstawieniem swojej liczby, może zostać oskarżony o celową zwłokę, która przy pewnej sprawności rachunkowej mogłaby zostać wykorzystana w celu osiągnięcia z góry założonego wyniku gry. Aby tego uniknąć, uczestnicy mogliby zapisywać wybrane przez siebie liczby na kartkach, które wrzucane byłyby do jednego worka. Co jednak począć w sytuacji, kiedy taka operacja nie jest możliwa, na przykład gdybyśmy chcieli zagrać w marynarza przez telefon (lub raczej, ze względu na potencjalnie dużą liczbę uczestników, gdybyśmy chcieli to uczynić, prowadząc grupową konwersację na pewnym popularnym serwisie społecznościowym)? Okazuje się, że wciąż jest to możliwe; wystarczy użyć kryptologicznego narzędzia zwanego zobowiązaniem.
Kryptologiczne zobowiązanie jest "skrzynką", do otwarcia której potrzebny jest klucz. Najczęściej zamykamy w niej wiadomość, wysyłamy całość nadawcy, a po pewnym czasie dosyłamy mu klucz (gdy uznamy, że może on już zapoznać się z zawartością). Dokonujemy jednak w ten sposób pewnego zobowiązania - nie mamy do dyspozycji kilku różnych kluczy o tej własności, że w zależności od użytego klucza skrzynka odsłoni adresatowi inną zawartość.
Opisana przed chwilą skrzynka reprezentowana jest przez funkcje Commit i Open takie, że jeśli Aldona chce "zobowiązać się" Bogumiłowi do wiadomości oblicza
i wysyła mu
Aby odkryć zobowiązanie, musi ona jeszcze dosłać
dzięki czemu Bogumił oblicza
Aby protokół był poprawny, muszą być spełnione następujące warunki:
- (i)
(dzięki czemu Bogumił odczytuje
po dosłaniu klucza),
- (ii)
- sama znajomość
nie dostarcza żadnej informacji o
- (iii)
- Aldona nie może skonstruować takich dwóch kluczy
że
Podobnie jak w poprzednim odcinku sagi, możemy dostrzec pewien szkopuł w przedstawionych warunkach. Podpunkty (ii) i (iii) nie mogą być bowiem spełnione jednocześnie. Istotnie, z punktu (iii) wynika, że istnieje tylko jedna wartość klucza dla której
jest sensowną wiadomością - Bogumił po odebraniu wiadomości
mógłby zatem przeglądać wszystkie możliwe wartości kluczy, aż znajdzie ten właściwy. Innymi słowy,
jednoznacznie definiuje
co przeczy podpunktowi (ii). Musimy zatem zgodzić się na pewien kompromis - któryś ze wspomnianych warunków będzie naruszony, jednak możemy zadbać o to, by realizacja tego naruszenia była bardzo trudna obliczeniowo. W świetle tego spostrzeżenia kryptologiczne zobowiązania możemy podzielić na bezwarunkowo kryjące i bezwarunkowo wiążące.
Zobowiązania bezwarunkowo kryjące naruszają podpunkt (iii), zatem znajomość nie mówi zupełnie nic o
a Aldona teoretycznie mogłaby znaleźć dwa klucze prowadzące do różnych odczytów ze skrzynki, choć będzie to dla niej bardzo trudne obliczeniowo. Przedstawimy przykład protokołu, który realizuje te założenia. Zauważmy najpierw, że wystarczy ograniczyć potencjalne wiadomości do 0 lub 1. Rzeczywiście, dowolnie skomplikowaną informację możemy rozbić na bity i zobowiązać się do każdego z nich z osobna. Aldona wybiera dużą liczbę pierwszą
oraz
niepodzielne przez
po czym wysyła Bogumiłowi
i
Bogumił wybiera dowolnie
i odsyła Aldonie
Aby zobowiązać się do bitu
Aldona wybiera dowolnie klucz
i wysyła Bogumiłowi
Widzimy, że liczba otrzymana przez Bogumiła to
zatem bez znajomości
nie ma on bladego pojęcia o
Kiedy jednak Aldona dośle
sprawa jest dla Bogumiła jasna, wystarczy bowiem, że obliczy
i
i sprawdzi, która z tych liczb jest równa
Zastanówmy się teraz, w jaki sposób Aldona mogłaby "oszukać system". Byłoby to równoznaczne ze znalezieniem dwóch kluczy
przy których Bogumił odczytałby różne wartości
Spełniona byłaby zatem równość

Oznaczałoby to, że Aldona jest w stanie na podstawie wybranych przez Bogumiła znaleźć
spełniające
Rozwiązałaby zatem problem logarytmu dyskretnego, o którym sądzimy, że jest trudny obliczeniowo. Wierzymy zatem, że nie byłaby w stanie dostarczyć dwóch różnych kluczy do wysłanej Bogumiłowi skrzynki.
Zobowiązania bezwarunkowo wiążące to takie, w których "skrzynka" może zostać otwarta tylko na jeden sposób, w związku z czym teoretycznie Bogumił mógłby wyznaczyć na podstawie
Postaramy się jednak, by w praktyce było to niemożliwe. Aby przedstawić przykład takiego protokołu, przypomnimy (lub nauczymy się) kilku interesujących faktów z teorii liczb.
Oto, co powinna tym razem zrobić Aldona, aby zobowiązać się do bitu Podobnie, jak w opisanym w poprzedniej części sagi protokole RSA, wybiera ona dwie duże liczby pierwsze
i oblicza
Jeśli chce zobowiązać się do 1, wybiera
będące resztą kwadratową z dzielenia przez
Wybór
niebędącego resztą kwadratową z dzielenia przez
oznacza zobowiązanie do 0. Sposób wyboru odpowiedniego
polega na "losowaniu do skutku" - nietrudno wykazać, że nie trzeba zbyt długo czekać na sukces, a ponieważ Aldona zna liczby
jest w stanie rozstrzygać, czy wylosowane liczby są resztami kwadratowymi z dzielenia przez
Następnie Aldona wysyła Bogumiłowi liczby
Aby przekonać się o wartości
Bogumił musiałby rozstrzygnąć, czy
jest resztą kwadratową z dzielenia przez
; wiemy już, że jest to dla niego trudne, gdyż nie zna on rozkładu
na czynniki pierwsze. Oczywiście, w ramach klucza Aldona wysyła Bogumiłowi liczby
; wówczas bez trudu sprawdza on "kwadratowość" reszty
względem każdego z czynników pierwszych, tym samym odczytując zobowiązanie Aldony.
A tak na poważnie, po co to wszystko?
Oczywiście, przedstawienie gry w marynarza jako przykładu zastosowania kryptologicznych zobowiązań miało raczej żartobliwy charakter. Poważniejszym wykorzystaniem są przetargi; łatwo wyobrazić sobie, dlaczego zobowiązania są bardzo pożyteczne w tym kontekście. Tak naprawdę jednak waga tego narzędzia jest związana z faktem, że jest bardzo wygodną "cegiełką" stosowaną przy konstrukcji innych kryptologicznych protokołów. Protokoły te często mają bardzo nieoczekiwane własności - będziemy o nich pisać w kolejnych odcinkach cyklu "A jednak się da!".