Kryptografia II stopień
Od definicji bezpieczeństwa do konstrukcji, redukcji i publikacji naukowych.
W6. Grupy, klucze i problemy trudne
Publiczna informacja pozwala szyfrować lub sprawdzać wynik, ale nie powinna umożliwiać odzyskania sekretu. Para kluczy rozdziela uprawnienia: do publicznej operacji nie potrzeba prawa do operacji prywatnej. Nadal potrzebujemy sposobu ustalenia, czy publiczny klucz naprawdę należy do zamierzonego partnera.
Grupa, generator i skalar bez skrótów myślowych
Najpierw zapis potęgowy. Do zrozumienia Schnorra, Okamoto czy wymiany Diffiego–Hellmana wystarczą na początek reguły mnożenia potęg. Będziemy pisać , także gdy implementacja reprezentuje ten element jako punkt krzywej. Najpierw poznamy rolę sekretu, komunikatów i równania weryfikacji. Dopiero potem połączymy te operacje z działaniami biblioteki.
Grupa to zbiór z odwracalnym, łącznym działaniem, elementem neutralnym i odwrotnościami. Nie oznacza tu grupy użytkowników. Grupa cykliczna jest generowana przez jeden element : kolejne jego potęgi przechodzą przez wszystkie elementy. Rząd jest liczbą elementów. Będziemy najczęściej używać pierwszego .
Skalar jest liczbą z ciała , czyli klasą reszt modulo . Symbol wyklucza zero. Sekret daje klucz publiczny . Oznaczenia przypominają duże i małe litery celowo: skalar i odpowiadający mu element grupy są różnymi obiektami. Z publicznego potrafimy wykonywać działania grupowe, ale nie zakładamy znajomości .
Mały przykład do rachunku: w podgrupie modulo generator ma rząd . Dla dostajemy . Elementy grupy mnożymy modulo 47, a wykładniki dodajemy i mnożymy modulo 23. Te parametry są zbyt małe do ochrony danych. Ich zadaniem jest pokazanie dwóch różnych miejsc redukcji.
Na krzywej eliptycznej współrzędne punktu również mają własne ciało. Jego charakterystyka nie jest tym samym co rząd podgrupy skalarów. Pomylenie tych liczb daje błędny protokół, nie inny sposób zapisu tego samego rachunku.
Jedno działanie grupowe, dwa sposoby zapisu
Konwencja kursu. Schematy i ich animowane przebiegi objaśniamy najpierw przez iloczyny i potęgi w grupie. Dotyczy to Schnorra, Okamoto, Stinsona–Wu, wymiany klucza i szyfrowania ElGamala. Tak samo zaczynamy objaśnienie BLS. Zapis addytywny pojawia się w wyraźnie oznaczonym przejściu do realizacji na krzywej lub w porównaniu obu notacji. Nie zmieniamy zapisu tylko dlatego, że demonstrator korzysta z MCL.
- BLS
- Boneh–Lynn–Shacham. Nazwiska autorów schematu krótkich podpisów z pairingiem.
- MCL
- mcl. Nazwa biblioteki kryptograficznej Herumi do szybkich obliczeń grupowych i pairingów.
Biblioteka nie narzuca protokołowi pairingu. MCL wykonuje dodawanie punktów i mnożenie ich przez skalary. Udostępnia też osobną operację pairingu. Schnorr, Okamoto, Stinson–Wu, Diffie–Hellman i ElGamal jej nie potrzebują. Weryfikacja BLS i omawianej zmodyfikowanej identyfikacji rzeczywiście z niej korzysta.
W ciele każdy niezerowy skalar ma odwrotność. Dlatego można rozwiązać równanie jako , jeśli . W grupie łatwo wykonujemy działanie i odwracamy element, ale nie zakładamy możliwości odzyskania wykładnika. Możemy obliczyć znając , nawet gdy nie znamy .
Wykładniki liczymy modulo . Potęga oznacza powtarzanie działania grupowego, a nie obowiązkowo potęgowanie liczby całkowitej. W przykładzie modulo 47 działaniem jest mnożenie reszt. W grupie punktów krzywej to samo rozumowanie korzysta z dodawania punktów. Tych dwóch realizacji nie utożsamiamy jako zbiorów liczb.
W zapisie addytywnym generator oznaczymy przez . Wtedy oznacza wielokrotne dodawanie realizowane wydajnym algorytmem, a jest punktem neutralnym. Przejście z na zmienia notację operacji, nie kolejność komunikatów ani sens sprawdzanego równania. Nie podnosimy osobno współrzędnych punktu do potęgi.
Dla elementów grupy i skalara otrzymujemy następujący słownik:
| Zapis multiplikatywny | Zapis addytywny | Sens |
|---|---|---|
| Działanie skalaru na generator | ||
| Połączenie elementów | ||
| Złożenie mnożeń skalarnych | ||
| Element neutralny | ||
| Element odwrotny | ||
| Zobowiązanie połączone z kluczem |
Litery i oznaczają w obu kolumnach odpowiadające sobie elementy grupy. Nie są skalarami. Sumy w wykładnikach nadal są sumami skalarów. Na przykład odpowiedź nie zmienia się przy przejściu do zapisu addytywnego.
RFC 8235, §2–3 przedstawia Schnorra w podgrupie multiplikatywnej modulo liczbę pierwszą oraz na krzywej. Dokument używa odpowiedzi z minusem. W tym kursie zachowujemy odpowiedź z plusem i odpowiadające jej równanie weryfikacji. Nie mieszamy tych konwencji.
Od wzoru do programu: rachunek w ciele
Po co ten fragment? Własna implementacja musi umieć wykonać działanie, a nie tylko zapisać jego symbol. Poniższy warsztat rozwija podstawy potrzebne w C0a i L0a. Zaczynamy od reszt całkowitych, przechodzimy do wielomianów, a dopiero potem do współrzędnych punktów. Małe parametry służą nauce i testom. Nie zapewniają bezpieczeństwa.
W ciele można dodawać, odejmować, mnożyć i dzielić przez każdy niezerowy element. Dla pierwszego ciało realizujemy jako reszty . Po działaniu wybieramy jednego reprezentanta przez redukcję modulo . Dla złożonego modułu to ogólnie pierścień, nie ciało. Na przykład w , więc niezerowe nie ma odwrotności. Ciało o 25 elementach zbudujemy inaczej.
Odwrotność modularna. Rozszerzony algorytm Euklidesa, extended Euclidean algorithm, EEA, oblicza liczby spełniające . Symbol oznacza największy wspólny dzielnik, NWD. Gdy NWD wynosi 1, odwrotnością modulo jest . Gdy NWD jest większy od 1, odwrotność nie istnieje. Nie wolno zastąpić jej ilorazem zmiennoprzecinkowym.
Przykładowo i . Podstawienie wsteczne daje , więc w . Ten sam rachunek można prowadzić wraz z resztami. Zacznij od i . W każdej iteracji oblicz i jednocześnie zastąp pary przez oraz . Po osiągnięciu sprawdź i zwróć .
Rozszerzenie ciała: współczynniki zamiast reszt modulo potęgi
Niech będzie nierozkładalnym wielomianem stopnia nad . Definiujemy . Element reprezentujemy przez . Współczynniki liczymy modulo , a wynik mnożenia wielomianów redukujemy modulo . To dwie odrębne redukcje, żadna nie jest redukcją całkowitą modulo .
- Dodawanie: dodaj współczynniki o tych samych indeksach modulo .
- Mnożenie: wykonaj splot współczynników. Następnie odejmuj odpowiednią wielokrotność , aby usuwać najwyższy wyraz, aż stopień wyniku będzie mniejszy od .
- Dzielenie wielomianów: współczynnik potrzebny do usunięcia najwyższego wyrazu uzyskujemy przez odwrotność współczynnika wiodącego dzielnika w .
- Odwrotność: wielomianowy EEA znajduje , gdzie jest niezerową stałą. Odwrotność to . Dla zera odrzucamy żądanie.
Dla wybierzmy . Kwadraty modulo 5 to , a równanie nie ma rozwiązania. Wielomian kwadratowy bez pierwiastka jest nierozkładalny. Oznaczając resztę przez , otrzymujemy . Na przykład oraz . Każdy z 25 elementów jest parą współczynników, nie pojedynczą resztą modulo 25.
Jak sprawdzić nierozkładalność? Brak pierwiastków wystarcza dla stopnia 2 lub 3. Dla stopnia 4 już nie, bo możliwy jest iloczyn dwóch nierozkładalnych wielomianów kwadratowych. W małych zadaniach sprawdź dzielenie przez wszystkie moniczne wielomiany stopnia od 1 do . Jeżeli żaden nie dzieli , nie ma rozkładu na dwa czynniki dodatnich stopni. To prosta metoda dydaktyczna, nie wydajny algorytm dla dużych parametrów.
Ciało binarne i znaczenie kolejności bitów
W dodawanie i odejmowanie to XOR. W laboratoryjnej reprezentacji wielomianu bit numer od prawej jest współczynnikiem przy . Liczba 0x53 oznacza więc . XOR całych słów dodaje wielomiany, lecz zwykłe mnożenie liczb całkowitych wprowadza przeniesienia i nie mnoży elementów tego ciała.
Mnożenie bez przeniesień wykonujemy tak: ustaw wynik na zero, czytaj kolejne bity drugiego czynnika, a dla każdego bitu 1 dodaj XOR-em odpowiednio przesunięty pierwszy czynnik. Zredukuj wynik wielomianem modułu. Można również redukować po każdym przesunięciu. Nie wolno pomylić tych algorytmów z mnożeniem liczb całkowitych modulo liczbę kodującą wielomian.
W AES modułem jest , o zapisie 0x11b. Operacja xtime(a) mnoży przez . Przesuń bajt o jeden bit w lewo, zachowaj osiem młodszych bitów i dodaj XOR-em 0x1b, jeśli przed przesunięciem najstarszy bit był równy 1. Dla 0x83 wynik to 0x1d. To właśnie redukcja wyrazu , nie dodatkowy sekret szyfru.
Wzory działania i kodowania ciał oraz krzywych zestawia SEC 1, rozdział 2. Rachunek bajtowy AES definiuje FIPS 197, §4.2. Własne obliczenia porównujemy z tymi specyfikacjami i z niezależną implementacją.
GHASH: od bloków do znacznika GCM
To opcjonalne rozwinięcie AEAD z W4. Najpierw potrzebne są powyższe działania w ciele binarnym. GCM używa ciała z modułem . Konwencja bitowa NIST jest odwrotna do powyższego przykładu AES: lewy bit bloku odpowiada współczynnikowi przy . Jedynka ciała ma kod 80 i 15 zerowych bajtów. Nie przenosimy bez konwersji reprezentacji z L0a.
Do mnożenia dwóch bloków można bezpośrednio zastosować algorytm 1 standardu. Ustaw , i przeglądaj bity od lewej. Dla bitu 1 wykonaj . Następnie przesuń o jeden bit w prawo. Jeżeli przed przesunięciem prawy bit był równy 1, dodaj XOR-em stałą e1 i 15 zerowych bajtów. Po 128 krokach jest iloczynem. Kierunek przesunięcia wynika z kodowania współczynników.
Niech będzie tajnym elementem ciała. To duże nie oznacza funkcji . Dla bloków długości 128 bitów obliczamy
W GCM blokami nie są same bajty wiadomości. Oznaczmy dane dodatkowe przez , a szyfrogram bez znacznika przez . Zbuduj wejście:
Długości mierzymy w bitach. Liczby i należą do . Symbol to 64-bitowy zapis liczby od najbardziej znaczącego bajtu. Dane już wyrównane nie dostają dodatkowego pełnego bloku zer. Blok długości występuje zawsze, nawet przy pustych danych. Pozwala odróżnić rzeczywiste końcowe zera od zer dopełnienia.
Dla przykładu z 2 bajtami AAD i 16 bajtami szyfrogramu wejście ma trzy bloki: AAD i 14 zerowych bajtów, cały szyfrogram oraz dwie 64-bitowe liczby 16 i 128. Nie są to długości 2 i 16. Zmiana długości wpływa więc na wejście uwierzytelnienia, nawet jeśli wartości dopisanych bajtów są zerami.
Przy 96-bitowym nonce ustal . Pełny 128-bitowy znacznik ma postać . Licznik szyfrowania danych zaczyna się od zwiększenia prawego 32-bitowego pola , więc nie używa tej samej maski co znacznik. Osobno sprawdzamy ograniczenia długości i unikalność nonce. Inna długość nonce wymaga innego wyznaczenia , którego ten wariant zadania nie używa.
Punkt kontrolny: dla 128-bitowego zerowego klucza, zerowego 96-bitowego nonce oraz pustych mamy i T = 58e2fccefa7e3061367f1d57a4e7455a. Ten mały przypadek sprawdza maskę i obsługę pustych danych, ale nie wystarcza do testowania mnożenia. Sprawdź także bloki niezerowe i niewyrównane długości. Źródło definicji: NIST SP 800-38D, algorytmy 1–4. Sam GHASH nie jest pełnym MAC ani haszem odpornym na kolizje.
Krzywa nad ciałem pierwszym: wszystkie przypadki działania
Tutaj przechodzimy jawnie do realizacji addytywnej. Niech będzie pierwsze. Dla krzywej wymagamy w . Współczynniki opisują krzywą, nie klucz użytkownika. Elementy grupy to jej punkty oraz osobny punkt neutralny .
Dla mamy . Zawsze i . Dla dwóch pozostałych punktów obliczamy nachylenie , a potem współrzędne wyniku:
Wszystko liczymy w , łącznie z odwrotnościami. Dla podwojenia punktu o wynikiem jest , a nie dzielenie przez zero. Dla poprawnych punktów przypadek tego samego jest albo podwojeniem, albo dodaniem punktu przeciwnego. Najpierw obsługujemy przypadki wyjątkowe, dopiero potem wzór.
Na krzywej nad weźmy . Przy podwojeniu w ciele. Dostajemy i po kolejnym dodaniu . Każdy wynik ponownie podstaw do równania krzywej. To dobry test kodu, ale nie samodzielny dowód łączności prawa grupowego.
Skalary a współrzędne. Jeżeli ma pierwszy rząd , to . Nie wolno zamiast tego redukować modulo . Współrzędne nadal należą do . Dla obcych danych najpierw sprawdź poprawne kodowanie i równanie krzywej, następnie podgrupę, a osobno dozwolenie punktu neutralnego. Przy i warunek wybiera jedyną podgrupę rzędu . Bez tego założenia nie przedstawiaj testu jako ogólnego dowodu przynależności do dowolnie wybranej podgrupy.
Opcjonalnie: krzywa w charakterystyce 2
W zadaniu binarnym przyjmujemy nad , z . Nie używamy wzorów dla . Tutaj . Neutralny punkt obsługujemy tak samo jak wcześniej. Dla :
Przy i używamy , i . Przy podwojeniu punktu o wynikiem jest . Dwa różne poprawne punkty o tym samym są przeciwne. Dodawanie w tych wzorach oznacza XOR reprezentacji wielomianowych, a mnożenie i odwrotność korzystają z modułu ciała. Dla punkt spełnia równanie i ma rząd 2. Reguły prawa grupowego podaje SEC 1, §2.2.
Potęgowanie, drabinka i liczenie operacji
Wróćmy do zapisu multiplikatywnego w dowolnej grupie. Nie mnożymy razy. Zapisz binarnie jako bity , z dla .
Square-and-multiply, czyli kwadratowanie i mnożenie, zaczyna od i czyta pozostałe bity od lewej. Dla każdego wykonuje , a dla bitu 1 dodatkowo . Dla dodatniego potrzeba kwadratowań i dodatkowych mnożeń, gdzie jest liczbą bitów 1. Dla zwracamy element neutralny. Wariant zaczynający od i czytający wszystkie bity ma inne liczniki. Dlatego w benchmarku podaj wariant.
Drabinka: zacznij od i czytaj wszystkie bity. Dla bitu 0 zastąp parę przez , a dla bitu 1 przez . Aktualizacja jest jednoczesna. Jeśli dotąd odczytano liczbę , niezmiennikiem jest . Kolejny bit zmienia na , co uzasadnia obie reguły. Po zakończeniu zwróć .
Dla , czyli bitów 1101, niezmiennik drabinki opisuje kolejno pary wykładników . Powyższy wariant wykonuje 4 kwadratowania i 4 mnożenia. Square-and-multiply wykonuje 3 kwadratowania i 2 mnożenia. Dla krzywej kwadratowanie zastępujemy podwojeniem punktu, a mnożenie dodawaniem punktów.
Stała liczba działań nie dowodzi stałego czasu. Warunek zależny od tajnego bitu, dostęp do pamięci i sama arytmetyka dużych liczb mogą ujawniać informacje. Pythonowe przykłady służą rachunkowi i pomiarowi, nie ochronie sekretu przed kanałem czasowym. Podstawy algorytmiczne: Handbook of Applied Cryptography, rozdział 14.
Od elementu matematycznego do jednoznacznych bajtów
Protokół haszuje i przesyła bajty. Umowa musi określać grupę, jej parametry, kolejność bajtów, długość każdego pola i obsługę błędnych danych. Dla małej krzywej dydaktycznej można wybrać wyłącznie nieskompresowany format SEC 1: 04, następnie i jako liczby big-endian po bajtów. Punkt neutralny ma osobny kod 00. Jego dopuszczenie zależy od roli w protokole. Tych kodów nie przenosimy automatycznie do formatu BLS12-381 biblioteki.
- BLS12-381
- Barreto–Lynn–Scott. Rodzina krzywych eliptycznych. W BLS12-381 stopień zanurzenia wynosi 12, a moduł ciała bazowego ma 381 bitów. To inny zestaw nazwisk niż w podpisie BLS.
Odbiorca odrzuca złą długość, niewłaściwy znacznik i współrzędne spoza zakresu. Nie redukuje obcej współrzędnej modulo , bo dopuściłby kilka kodowań tego samego punktu. Następnie sprawdza punkt i podgrupę. Dla krotek o zmiennych długościach można poprzedzać każde pole jego 32-bitową długością w bajtach, ustalając limit . Dodaj etykietę protokołu i jego wersji. Para ab, c musi mieć inne kodowanie niż a, bc.
W teście zgodności sprawdź zarówno , jak i odrzucenie niekanonicznych wejść. Potem porównaj dokładne bajty i wartości hasza między dwoma programami. Dopiero na takiej wspólnej reprezentacji porównujemy podpisy i wspólne sekrety.
Pairing najpierw jako rachunek wykładników
Pairing to wydajnie obliczalne odwzorowanie , gdzie grupy mają zgodny pierwszy rząd . W zapisie potęgowym wybierzmy generatory , . Dwuliniowość oznacza:
To pozwala sprawdzać relacje pomiędzy ukrytymi wykładnikami, bez ich odczytywania. W demonstratorze te same generatory noszą nazwy , a grupy źródłowe są zapisane addytywnie. Grupa docelowa pozostaje multiplikatywna:
Niedegeneracja wymaga, aby pairing odpowiednich generatorów nie dawał elementu neutralnego. Typy mają znaczenie: pierwszy argument należy do , drugi do . W używanym typie asymetrycznym nie zakładamy wydajnego przenoszenia dowolnego punktu pomiędzy tymi grupami. MCL reprezentuje je odrębnymi typami, a wynik parowania ma typ .
Realizacja addytywna na krzywej BLS12-381. Rzeczywiste , i , obliczane w MCL WebAssembly. Wynik parowania jest elementem , nie punktem krzywej.
Gotowe.
Obliczenia MCL na krzywej. Poniżej pokazujemy konkretne operacje biblioteki. Grupy punktów zapisujemy addytywnie.
Generatory i skalary
Oczekuje.
Mnożenia w grupach źródłowych
Oczekuje.
Dwie drogi do grupy docelowej
Oczekuje.
Porównanie elementów
Oczekuje.
Sprawdź: Zmień x i y. Następnie dodaj 1 tylko do wykładnika prawej strony. Równość ma wynikać z obliczeń, nie z etykiety wariantu.
- WebAssembly
- WebAssembly. Format kodu wykonywanego m.in. w przeglądarce. Wasm i WASM to jego skrócone nazwy.
Pełny zapis elementu jest długi, ponieważ reprezentuje element rozszerzenia ciała. Porównujemy całe obiekty MCL, nie ich skrócone etykiety na rysunku. Zmiana wykładnika z na jest testem negatywnym. Punkty oraz obie strony równania powstają w MCL WebAssembly.
Hasze mają różne typy wyników
Teraz znamy zarówno ciało skalarów, jak i grupy pairingu. Możemy precyzyjnie rozdzielić funkcje, które wcześniej nazywaliśmy ogólnie haszami. Indeks oznacza poprawne haszowanie do grupy, nie publicznie znany logarytm wyniku.
| Oznaczenie | Wynik | Rola |
|---|---|---|
| ciąg bitów | Skrót pliku | |
| Wyzwanie lub skalar | ||
| Hash do punktu | ||
| klucz o określonej długości | Wyprowadzanie kluczy |
Co zakładamy jako trudne
Najpierw motywacja: Alicja publikuje , Bob publikuje . Alicja zna , więc liczy . Bob zna , więc liczy . Oba wyniki to . Podsłuchujący widzi , lecz nie dostaje . To rdzeń wymiany Diffiego–Hellmana (DH). Na razie wyjaśnia tylko zgodność obliczeń. Nie potwierdza tożsamości, co będzie głównym problemem W10.
DL oznacza logarytm dyskretny. CDH to obliczeniowy problem DH, a DDH to decyzyjny problem DH. W DDH porównujemy krotkę z prawdziwym wspólnym elementem i krotkę, której ostatni element jest losowany niezależnie, jednostajnie w tej samej grupie.
- DL
- discrete logarithm / discrete logarithm problem. Logarytm dyskretny / problem logarytmu dyskretnego.
- CDH
- Computational Diffie–Hellman. Obliczeniowy problem Diffiego–Hellmana.
| Problem | Dane | Wynik |
|---|---|---|
| DL | ||
| CDH | ||
| DDH | Rozróżnienie DH od losowego |
Algorytm DL rozwiązuje CDH, a CDH pozwala testować DDH. Odwrotne implikacje nie wynikają z tej obserwacji. Pairing może zmienić trudność problemu decyzyjnego, dlatego określamy grupy i dostępne reprezentacje.
W7. Identyfikacja: Schnorr, symulacja i ekstrakcja
Potrzeba: weryfikator chce teraz sprawdzić, czy rozmówca kontroluje sekret przypisany do zarejestrowanego klucza. Klucz publiczny musi być wcześniej powiązany z kontem lub osobą. Sam protokół nie ustala nazwiska na podstawie równania.
Interfejs identyfikacji interaktywnej
Schemat ma parametry, generowanie kluczy oraz dwa współdziałające algorytmy:
Algorytm (prover, dowodzący) działa z kluczem tajnym. Algorytm (verifier, weryfikator) korzysta z klucza publicznego. Oba utrzymują lokalny stan sesji i wymieniają komunikaty. Zapis
oznacza wykonanie rozmowy i odczyt decyzji weryfikatora. Bit oznacza akceptację. Klamry kątowe nie są iloczynem skalarnym ani pojedynczą funkcją wykonywaną przez jedną stronę. Poprawność wymaga, aby uczciwa rozmowa dla kluczy z KeyGen kończyła się akceptacją. Odporność na podszywanie mówi osobno, że przeciwnik bez wymaganego sekretu nie powinien doprowadzić do takiej akceptacji w dozwolonym modelu.
Własność ZK, zero knowledge, czyli wiedzy zerowej, jest dodatkowym wymaganiem dotyczącym ujawnianej informacji. Nie każdy protokół identyfikacji ją spełnia. Dla trójwiadomościowego Schnorra poniżej najpierw wykażemy dokładnie HVZK, wiedzę zerową wobec uczciwego weryfikatora. Nie będziemy jej utożsamiali z ochroną przed dowolnym zachowaniem rozmówcy.
- HVZK
- honest-verifier zero knowledge. Zerowa wiedza wobec uczciwego weryfikatora.
Schnorr jako zestaw wywołań
Używamy grupy pierwszego rzędu , generatora i parametrów . Setup wybiera taki profil. KeyGen losuje i zwraca , gdzie . Teraz rozpiszmy lokalne kroki i . Ich nazwy są naszym opisem interfejsu, nie dodatkowymi założeniami protokołu.
Identyfikacja Schnorra: algorytmy i przepływ
P i V są algorytmami interaktywnymi. Poniżej wydzielamy ich kroki oraz prywatny stan sesji. Każdy stan odpowiedzi jest jednorazowy. Niepoprawny komunikat kończy sesję odrzuceniem.
Rząd q jest liczbą pierwszą. Ustal kodowania i działania grupy. Dodatkowe funkcje wskazano przy konstrukcji.
Profil z całym ciałem, zgodnie z opisem konstrukcji. Sekret a pozostaje u właściciela. Odbiorca uwierzytelnia publiczny A.
Po sprawdzeniu typu X.
Sprawdź c i zużyj st_P. Nie odpowiadaj ponownie z tym u.
Najpierw sprawdź kodowania, grupę i zakresy skalarów.
Identyfikacja Schnorra
Dowodzący:
Weryfikator:
- Dowodzący, Commit: Zachowaj u w stanie sesji.
- Dowodzący → Weryfikator: Zobowiązanie
- Weryfikator, Challenge: Losuj dopiero po otrzymaniu X.
- Weryfikator → Dowodzący: Jawne wyzwanie
- Dowodzący, Respond: Zużyj nonce u.
- Dowodzący → Weryfikator: Odpowiedź
- Weryfikator, Check: Zwróć 1 albo 0.
Co pozostaje w urządzeniu, a co trafia do rozmówcy
| Strona i wywołanie | Co dzieje się wewnątrz | Co opuszcza urządzenie |
|---|---|---|
| Dowodzący: | Losuje , liczy i zachowuje jednorazowy stan . | Tylko , nie . |
| Weryfikator: | Po sprawdzeniu typu losuje . Zapamiętuje . | Wyzwanie . |
| Dowodzący: | Sprawdza , liczy , zużywa stan . | Odpowiedź , nie klucz . |
| Weryfikator: | Sprawdza i . Zwraca 1 przy zgodności, w pozostałych przypadkach 0. Kończy sesję. | Decyzja dla aplikacji, nie nowy sekret. |
Każdy stan jest przypisany do jednej lokalnej sesji. Nie wolno użyć tego samego do odpowiedzi na drugie wyzwanie. Matematyka nie usuwa konieczności pilnowania tej reguły w urządzeniu. Właśnie jej złamanie wykorzystamy później w ataku z resetem. W poprawnym wykonaniu sekret służy wyłącznie do lokalnego wywołania Respond.
Mechanizm i poprawność
Chcemy przekonać weryfikatora, że znamy dla , bez wysyłania sekretu. Publiczne jest stwierdzeniem, a świadkiem jego prawdziwości w odpowiedniej relacji. Nie wystarcza samo zapewnienie, że klucz istnieje. Każdy element tej grupy ma logarytm. Istotna jest znajomość odpowiedniej wartości.
Zerowa wiedza dotyczy tego, co rozmowa ujawnia. Dowód znajomości dotyczy możliwości wydobycia świadka z odpowiednio skutecznego dowodzącego w modelu ekstrakcji. To dwa warunki, które należy argumentować oddzielnie.
Dowodzący zna sekret . Losuje niezależny, jednorazowy skalar i oblicza zobowiązanie . Weryfikator po otrzymaniu losuje wyzwanie . Odpowiedź oznaczymy przez . Schnorr ma trzy wiadomości:
Dowodzący wysyła przed otrzymaniem . Weryfikator sprawdza . Podstawienie dowodzi kompletności. Nie dowodzi jeszcze wiedzy zerowej ani znajomości sekretu przez oszusta.
Cała kontrola poprawności mieści się w prawach działań na potęgach:
Weryfikator zna . Do tego obliczenia nie potrzebuje ani , ani . Przy poprawnych parametrach i wejściach sprawdza zgodność elementów grupy, nie odczytuje ukrytych wykładników.
Przebieg, który można policzyć ręcznie
Dla modulo 47, rzędu , sekretu i nonce mamy i . Przy wyzwaniu odpowiedź wynosi . Weryfikator oblicza oraz . Wyniki są zgodne.
Widać przy tym, dlaczego kolejność ma znaczenie. Dowodzący ustala zobowiązanie, zanim pozna wyzwanie. Gdyby znał wyzwanie wcześniej, mógłby dobrać do dowolnej odpowiedzi. Właśnie ten rachunek wykorzystuje następny podrozdział, ale w innym celu.
Symulator bez sekretu
Losujemy i obliczamy . Dla ustalonego przesunięcie jest bijekcją ciała. Uczciwe i symulowane transkrypty mają dokładnie ten sam rozkład przy jednostajnej losowości z całego .
Gdy implementacja wyklucza zerowy nonce. Profil notebooka w L3 losuje i odrzuca , gdzie jest elementem neutralnym. W notacji addytywnej to punkt . Symulator tego profilu losuje z całego , oblicza i powtarza losowanie pary, jeśli . Warunkujemy oba rozkłady tym samym zdarzeniem. Dla każdego odpada dokładnie jedna wartość , zatem próba jest przyjmowana z prawdopodobieństwem . Każdy pozostały transkrypt ma prawdopodobieństwo . Symulator nadal nie potrzebuje . Nie wolno porównywać tego rozkładu z niezmienionym symulatorem, który dopuszcza neutralne zobowiązanie.
W obu opisach wyzwanie pochodzi z całego . Jeśli pokazujemy atak z ujawnionym nonce i dzieleniem przez , demonstrator wybiera , aby wykonać ten konkretny rachunek. To jawne ograniczenie przykładu, a nie zmiana definicji wszystkich protokołów Schnorra.
To HVZK, wiedza zerowa dla uczciwego weryfikatora. Symulator wybiera wyzwanie przed zobowiązaniem. Nie podszywa się więc automatycznie pod dowodzącego w żywej rozmowie. Złośliwy weryfikator może uzależnić wyzwanie od zobowiązania, co wymaga odrębnego argumentu.
Co porównujemy w definicji? Widok weryfikatora obejmuje komunikaty, jego wejście i własną losowość. Symulator ma wytworzyć nierozróżnialny widok bez świadka. Wersja doskonała daje równe rozkłady, statystyczna małą odległość rozkładów, a obliczeniowa nierozróżnialność dla wydajnego testu. W prostym przykładzie Schnorra dla uczciwego weryfikatora otrzymujemy równość rozkładów.
Dwa transkrypty ujawniają świadka
Przy tym samym i :
Dzielimy równania, skracamy i korzystamy z pierwszego rzędu grupy. Ekstraktor nie zakłada, że przeciwnik policzył odpowiedź uczciwym algorytmem. Wystarczają dwa zaakceptowane równania.
To szczególna rzetelność protokołu, nazywana special soundness. Jeden transkrypt nie wystarcza: symulator właśnie potrafi go stworzyć bez sekretu. Oszust może przygotować odpowiedź na zgadnięte wyzwanie. Błąd wiedzy dla pełnej przestrzeni wyzwań jest związany z . Dopiero odpowiedni sukces ponad ten próg i możliwość cofnięcia stanu pozwalają uzasadnić ekstrakcję.
Ten sam Schnorr w implementacji na krzywej
| Rola | Zapis schematu i animacji | Realizacja addytywna w MCL |
|---|---|---|
| Klucz publiczny | ||
| Zobowiązanie | ||
| Odpowiedź skalarna | ||
| Weryfikacja |
Punkt pełni tu rolę generatora . MCL wykonuje rzeczywiste mnożenia punktów przez skalary na BLS12-381. Zmienia się reprezentacja operacji, nie protokół. Klucze są demonstracyjne.
MCL WebAssembly, BLS12-381. Punkty w , skalary w . Klucze wyłącznie testowe.
1. Pierwszy przebieg
Nowy nonce i odpowiedź na wyzwanie.
Weryfikacja oczekuje.
2. Drugi przebieg
Ujawniony nonce z pierwszej rozmowy. Sekret nadal nie został odczytany z urządzenia.
Weryfikacja oczekuje.
Sprawdzenie
Rachunek na otrzymanych danych.
Odzyskany skalar
Potrzebne są dwa zaakceptowane transkrypty i . Nie trzeba znać nonce.
Wystarcza jeden transkrypt, ujawniony nonce i .
Do wysyłanej odpowiedzi dodano .
Wynik oczekuje.
Zapis i obliczenia. Wzory schematu są multiplikatywne. MCL realizuje je na krzywej. Generator odpowiada punktowi . W grupach punktów iloczyn oznacza dodawanie, potęga oznacza mnożenie punktu przez skalar, a odwrotność oznacza punkt przeciwny. Nie potęgujemy współrzędnych. Ten rachunek nie używa pairingu.
Gotowe do rozpoczęcia.
Pełne wartości transkryptów
Serializacja MCL w zapisie szesnastkowym. Skróty na schemacie wskazują te same wartości.
| Wartość | Serializacja |
|---|
Co pozostaje po pierwszym przebiegu? Przeciwnik zna publiczny klucz i trzy komunikaty . Nie zna ani . Reset w drugim przebiegu przywraca ten sam nonce, więc ponownie pojawia się to samo . Weryfikator przesyła inne wyzwanie , dopiero potem otrzymuje odpowiedź . Oba transkrypty dotyczą jednego klucza publicznego. Odjęcie odpowiedzi usuwa nieznany nonce. Ekstrakcja wykorzystuje wyłącznie zapisane komunikaty, a poprawność wyniku można sprawdzić publicznie przez .
Reset rzeczywistego urządzenia jest tu uprawnieniem atakującego. Przewijanie przeciwnika w dowodzie jest natomiast narzędziem ekstraktora. W obu sytuacjach przydatny jest ten sam rachunek dwóch transkryptów, lecz nie są to te same możliwości w rzeczywistym protokole. Ujawnienie nonce to jeszcze inny przypadek: wystarcza jedna rozmowa i poznane , o ile .
Powiązania: C5, L3, pełny dowód identyfikacji i rachunek rewindingu.