Wrocław University of Science and TechnologyDepartment of Fundamentals of Computer Science

Kryptografia II stopień

Od definicji bezpieczeństwa do konstrukcji, redukcji i publikacji naukowych.

W8. Identyfikacja i granica chronionego urządzenia

Identyfikacja sprawdza, czy aktualny rozmówca posiada sekret. Trzeba wskazać, jakie wcześniejsze rozmowy przeciwnik obserwuje lub sam prowadzi. Pasywna obserwacja i aktywny trening są różnymi modelami.

Trzy błędne poprawki: poprawność zostaje, bezpieczeństwo znika

Punktem odniesienia jest Schnorr. Celowo zmienimy jego odpowiedź i odpowiednie równanie sprawdzające. Uczciwe wykonania nadal będą akceptowane. Dla każdego wariantu podamy jednak strategię oszusta, który nie zna sekretu. To przykłady z analizy protokołów, nie alternatywne bezpieczne konstrukcje.

1. Odpowiedź afiniczna. Zastąpmy odpowiedź przez s=u+a+cs=u+a+c, a weryfikację przez gs=X⋅A⋅gcg^s=X\cdot A\cdot g^c. Z obserwowanego (X0,c0,s0)(X_0,c_0,s_0) przeciwnik wybiera własne rr i tworzy nowe zobowiązanie X1=X0⋅grX_1=X_0\cdot g^r. Gdy otrzyma nowe wyzwanie c1c_1, odpowiada:

s1=s0−c0+r+c1.s_1=s_0-c_0+r+c_1.

Sprawdzenie przechodzi, bo gs1=X1⋅A⋅gc1g^{s_1}=X_1\cdot A\cdot g^{c_1}. Przeciwnik nie znał uu ani aa. Wyeliminował stare wyzwanie i wstawił nowe. Pamięć poprzednich zobowiązań nie naprawia problemu, bo X1X_1 może być nowe.

Podszycie · obserwowany transkrypt i nowa rozmowa

MCL WebAssembly, BLS12-381. Punkty w G2G_2, skalary w Zq\mathbb Z_q. Klucze wyłącznie testowe.

Przypadek
Wspólny klucz publiczny A=gaA=g^a oczekuje

1. Pierwszy przebieg

Obserwacja uczciwej rozmowy.

DowodzącyWeryfikator
XX
oczekuje
cc
oczekuje
ss
oczekuje
s=u+a+cs=u+a+c
s=u+a⋅cs=u+a\cdot c

Weryfikacja oczekuje.

2. Drugi przebieg

OszustWeryfikator
X′X'
oczekuje
c′c'
oczekuje
s′s'
oczekuje
uu
oczekuje

Ujawniony nonce z pierwszej rozmowy. Sekret aa nadal nie został odczytany z urządzenia.

X′=X⋅grX'=X\cdot g^r

Weryfikacja oczekuje.

3. Sprawdzenie podszycia

Strategia korzysta z publicznej rozmowy i własnej losowości.

s′=s−c+r+c′s'=s-c+r+c'
rr oczekuje
gs′=X′⋅A⋅gc′g^{s'}=X'\cdot A\cdot g^{c'}
gs′≠X′⋅Ac′g^{s'}\ne X'\cdot A^{c'}

Oszust nie otrzymuje ani aa, ani uu.

Odrzucenie tej strategii nie jest pełnym dowodem bezpieczeństwa Schnorra.

Wynik oczekuje.

Zapis i obliczenia. Wzory schematu są multiplikatywne. MCL realizuje je na krzywej. Generator gg odpowiada punktowi P2P_2. 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

2. Wyzwanie przed całym nawiasem. Niech s=c⋅(u+a)s=c\cdot(u+a), a weryfikacja sprawdza gs=(X⋅A)cg^s=(X\cdot A)^c. Oszust losuje tt i przed wyzwaniem wysyła X=gt⋅A−1X=g^t\cdot A^{-1}. Potem odpowiada s=c⋅ts=c\cdot t. Nie potrzebował nawet wcześniejszego transkryptu. Ułożył znany sobie logarytm całej podstawy, którą weryfikator podniesie do wyzwania.

3. Brak związania z tożsamością. Dowodzący miał wysyłać W=ga⋅uW=g^{a\cdot u}, a weryfikator sprawdzać gs=Wcg^s=W^c. Oszust po prostu wysyła W=gtW=g^t dla własnego tt i odpowiada s=t⋅cs=t\cdot c. Równanie niczego nie sprawdza względem klucza AA. Sam udział tajnego aa w uczciwym algorytmie nie zmusza oszusta do jego użycia.

W każdym przypadku atak jest chronologicznie wykonalny. Pierwsza wiadomość nie zależy od przyszłego wyzwania. To ważny test poprawności analizy: „rozwiązanie” wymagające wcześniejszego poznania świeżej losowej wartości weryfikatora nie jest atakiem w tym modelu.

Relay to jeszcze inny cel ochrony

Oszust może także przekazywać w czasie rzeczywistym zobowiązanie uczciwej osoby, wyzwanie weryfikatora i odpowiedź. Nie poznaje wtedy klucza. Zwykły eksperyment podszycia po zakończeniu treningu wyklucza taki bieżący dostęp do dowodzącego. Jeśli rzeczywisty scenariusz go dopuszcza, trzeba osobno zapewnić właściwe powiązanie kanału, czynności lub fizycznej odległości. Nie naprawia tego większa grupa algebraiczna.

Okamoto: inny świadek i inny punkt osadzenia

Ten sam interfejs identyfikacji, inna konstrukcja. Pozostają Setup, KeyGen oraz interaktywne P\mathsf P i V\mathsf V. Zmienia się postać sekretu, zobowiązania i odpowiedzi. Poniżej KeyGen tworzy parę skalarów. Commit używa dwóch świeżych skalarów, Respond zwraca parę odpowiedzi, a Check sprawdza jedno równanie. Oba generatory należą tutaj do tej samej grupy. To nie są grupy źródłowe pairingu.

W Schnorrze świadkiem jest jeden wykładnik. W Okamoto jest nim para wykładników (a1,a2)(a_1,a_2) reprezentująca publiczny element AA. Generatory g1,g2g_1,g_2 należą do tej samej grupy GG pierwszego rzędu qq. Ich indeksy odróżniają bazy. Nie oznaczają grup źródłowych pairingu G1,G2G_1,G_2. Nie zakładamy znajomości logarytmu jednego generatora względem drugiego.

Identyfikacja Okamoto: 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.

Π=(Setup,KeyGen,P,V)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{P},\mathsf{V})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(G,q,g1,g2)pp=(G,q,g_1,g_2)

Dwa generatory tej samej grupy. Relacja logarytmiczna między nimi nie jest udostępniana.

KeyGen(pp)\mathsf{KeyGen}(pp)⟶(A,(a1,a2))\longrightarrow (A,(a_1,a_2))
a1,a2←$Zqa_1,a_2\overset{\$}{\leftarrow}\mathbb Z_q
A=g1a1⋅g2a2A=g_1^{a_1}\cdot g_2^{a_2}

Powtórz losowanie, jeżeli A jest neutralny.

Commit(pp)\mathsf{Commit}(pp)⟶(X,stP)\longrightarrow (X,st_P)
u1,u2←$Zqu_1,u_2\overset{\$}{\leftarrow}\mathbb Z_q
X=g1u1⋅g2u2X=g_1^{u_1}\cdot g_2^{u_2}
stP=(u1,u2,X)st_P=(u_1,u_2,X)
Challenge(pp,A,X)\mathsf{Challenge}(pp,A,X)⟶(c,stV)\longrightarrow (c,st_V)
c←$Zq,stV=(A,X,c)c\overset{\$}{\leftarrow}\mathbb Z_q,\quad st_V=(A,X,c)
Respond(pp,(a1,a2),stP,c)\mathsf{Respond}(pp,(a_1,a_2),st_P,c)⟶(s1,s2)\longrightarrow (s_1,s_2)
si=ui+c⋅ai(modq),i∈{1,2}s_i=u_i+c\cdot a_i\pmod q,\quad i\in\{1,2\}

Sprawdź wyzwanie i zużyj oba nonce.

Check(pp,stV,(s1,s2))\mathsf{Check}(pp,st_V,(s_1,s_2))⟶b∈{0,1}\longrightarrow b\in\{0,1\}
b=[g1s1⋅g2s2=X⋅Ac]b=[g_1^{s_1}\cdot g_2^{s_2}=X\cdot A^c]

Walidacja typów i zakresów poprzedza równanie.

Identyfikacja Okamoto: czynności i komunikatyDowodzącyWeryfikatorCommitJedno zobowiązanieChallengeJedno wyzwanieRespondDwie odpowiedzi skalarneCheck

Identyfikacja Okamoto

Dowodzący: pp,a1,a2pp,a_1,a_2

Weryfikator: pp,App,A

  1. Dowodzący, Commit: u1,u2←$Zqu_1,u_2\overset{\$}{\leftarrow}\mathbb Z_q X=g1u1⋅g2u2X=g_1^{u_1}\cdot g_2^{u_2}
  2. Dowodzący → Weryfikator: XX Jedno zobowiązanie
  3. Weryfikator, Challenge: c←$Zqc\overset{\$}{\leftarrow}\mathbb Z_q
  4. Weryfikator → Dowodzący: cc Jedno wyzwanie
  5. Dowodzący, Respond: s1=u1+c⋅a1s_1=u_1+c\cdot a_1 s2=u2+c⋅a2s_2=u_2+c\cdot a_2
  6. Dowodzący → Weryfikator: (s1,s2)(s_1,s_2) Dwie odpowiedzi skalarne
  7. Weryfikator, Check: g1s1⋅g2s2=?X⋅Acg_1^{s_1}\cdot g_2^{s_2}\stackrel{?}{=}X\cdot A^c
Ta sama kolejność co w Schnorrze, ale dwa sekrety reprezentacji i dwie odpowiedzi. Indeksy generatorów nie oznaczają grup pairingu.
  1. Klucz: losujemy parę (a1,a2)←$Zq2(a_1,a_2)\overset{\$}{\leftarrow}\mathbb Z_q^2 i publikujemy A=g1a1⋅g2a2A=g_1^{a_1}\cdot g_2^{a_2}, odrzucając A=1GA=1_G.
  2. Zobowiązanie: dla nowej rozmowy losujemy niezależne u1,u2←$Zqu_1,u_2\overset{\$}{\leftarrow}\mathbb Z_q i wysyłamy X=g1u1⋅g2u2X=g_1^{u_1}\cdot g_2^{u_2}.
  3. Wyzwanie: weryfikator losuje c←$Zqc\overset{\$}{\leftarrow}\mathbb Z_q po otrzymaniu XX.
  4. Odpowiedź: dowodzący wysyła dwa skalary s1=u1+c⋅a1s_1=u_1+c\cdot a_1, s2=u2+c⋅a2s_2=u_2+c\cdot a_2.

Sprawdzenie ponownie opiera się na mnożeniu potęg:

g1s1⋅g2s2=g1u1+c⋅a1⋅g2u2+c⋅a2=X⋅Ac.g_1^{s_1}\cdot g_2^{s_2} =g_1^{u_1+c\cdot a_1}\cdot g_2^{u_2+c\cdot a_2} =X\cdot A^c.

Przejście do krzywej: oznaczmy te dwie bazy przez P,Q∈GP,Q\in G. Wtedy A=a1⋅P+a2⋅QA=a_1\cdot P+a_2\cdot Q, X=u1⋅P+u2⋅QX=u_1\cdot P+u_2\cdot Q, a kontrola ma postać s1⋅P+s2⋅Q=X+c⋅As_1\cdot P+s_2\cdot Q=X+c\cdot A. Odpowiedzi s1,s2s_1,s_2 nadal są skalarami. Klasyczny Okamoto nie wymaga pairingu. Pairing pojawia się dopiero w osobno opisanej modyfikacji.

Ekstrakcja pary (a1,a2)(a_1,a_2) daje reprezentację. Aby zredukować atak do DL jednego generatora względem drugiego, trzeba porównać ją z reprezentacją zaszytą przez redukcję. Dwa równania same nie kończą tego dowodu.

Pełny dowód: aktywne sesje, nierozróżnialność świadków i rewinding. Zobacz, dlaczego redukcja zna jedną reprezentację, a potrzebuje drugiej, oraz skąd biorą się wszystkie czynniki w prawdopodobieństwie sukcesu.

Ujawnienie, ustawienie i reset

  • Ujawnienie: przeciwnik poznaje uu. Przy c≠0c\ne0 odzyskuje a=(s−u)⋅c−1a=(s-u)\cdot c^{-1}.
  • Ustawienie: narzuca znane uu. Rachunek jest ten sam, lecz interfejs ataku inny.
  • Reset: niekoniecznie znany nonce powtarza się. Dwie odpowiedzi eliminują go przez odejmowanie.

To wspólna algebra liniowa, ale różne uprawnienia. Przy resecie nonce może pozostać nieznany. Wystarczy jego powtórzenie. Przy ustawieniu przeciwnik zna narzuconą wartość. Przy ujawnieniu poznaje wartość wybraną przez urządzenie. Model powinien wskazać moment udostępnienia, możliwość wyboru wiadomości i liczbę przebiegów.

Rozszerzenie modelu może wymusić zmianę architektury. Jeżeli celem jest ochrona tożsamości mimo wycieku nonce, klasyczna skalarna odpowiedź Schnorra nie spełnia tego celu. Samo ponowne sformułowanie dowodu tego nie zmieni. Trzeba zmienić konstrukcję, ograniczyć interfejs urządzenia lub inaczej rozdzielić sekrety. Jeżeli przeciwnik dostaje cały klucz długoterminowy, model odporności tylko na nonce przestaje być właściwym opisem.

Odpowiedź jako element grupy

Cel modyfikacji: zachować trzy wiadomości identyfikacji, ale nie wydawać skalarnej odpowiedzi, z której przy znanym nonce można wyliczyć klucz. Odpowiedź będzie elementem grupy, a kontrola użyje pairingu. To zmiana konstrukcji i modelu urządzenia, nie tylko sposobu zapisu.

Schnorr z odpowiedzią grupową: algorytmy i przepływ

Profil dydaktyczny tej modyfikacji zachowuje trzy komunikaty, ale skalar odpowiedzi zastępuje elementem G1. Grupy źródłowe G1 i G2 mają ten sam pierwszy rząd q. Granice modelu urządzenia wyjaśniamy po diagramie. Równanie weryfikacji nie zastępuje dowodu bezpieczeństwa.

Π=(Setup,KeyGen,P,V)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{P},\mathsf{V})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
e:G1×G2→GTe:G_1\times G_2\to G_T
pp=(q,G1,G2,GT,e,g2,ℋG1)pp=(q,G_1,G_2,G_T,e,g_2,\mathcal H_{G_1})
KeyGen(pp)\mathsf{KeyGen}(pp)⟶(A,a)\longrightarrow (A,a)
a←$Zq∗,A=g2aa\overset{\$}{\leftarrow}\mathbb Z_q^*,\quad A=g_2^a
Commit(pp)\mathsf{Commit}(pp)⟶(X,u)\longrightarrow (X,u)
u←$Zq,X=g2uu\overset{\$}{\leftarrow}\mathbb Z_q,\quad X=g_2^u
Challenge(pp,A,X)\mathsf{Challenge}(pp,A,X)⟶(c,stV)\longrightarrow (c,st_V)
c←$Zq,stV=(A,X,c)c\overset{\$}{\leftarrow}\mathbb Z_q,\quad st_V=(A,X,c)
Respond(pp,a,u,X,c)\mathsf{Respond}(pp,a,u,X,c)⟶S∈G1\longrightarrow S\in G_1
B=ℋG1(enc⁡(X,c))B=\mathcal H_{G_1}(\operatorname{enc}(X,c))
S=Bu+a⋅cS=B^{u+a\cdot c}

Nie wydawaj skalaru odpowiedzi. Zużyj stan sesji.

Check(pp,stV,S)\mathsf{Check}(pp,st_V,S)⟶b∈{0,1}\longrightarrow b\in\{0,1\}
B=ℋG1(enc⁡(X,c))B=\mathcal H_{G_1}(\operatorname{enc}(X,c))
b=[e(S,g2)=e(B,X⋅Ac)]b=[e(S,g_2)=e(B,X\cdot A^c)]

Najpierw walidacja punktów i zakresu c.

Schnorr z odpowiedzią grupową: czynności i komunikatyDowodzącyWeryfikatorCommitZobowiązanie w grupie źródłowejChallengeWyzwanie skalarneRespondOdpowiedź grupowa, nie skalarCheck
Odtwórz B z tego samego kodowania.

Schnorr z odpowiedzią grupową

Dowodzący: pp,app,a

Weryfikator: pp,App,A

  1. Dowodzący, Commit: u←$Zqu\overset{\$}{\leftarrow}\mathbb Z_q X=g2uX=g_2^u
  2. Dowodzący → Weryfikator: XX Zobowiązanie w grupie źródłowej
  3. Weryfikator, Challenge: c←$Zqc\overset{\$}{\leftarrow}\mathbb Z_q
  4. Weryfikator → Dowodzący: cc Wyzwanie skalarne
  5. Dowodzący, Respond: B=ℋG1(enc⁡(X,c))B=\mathcal H_{G_1}(\operatorname{enc}(X,c)) S=Bu+a⋅cS=B^{u+a\cdot c}
  6. Dowodzący → Weryfikator: SS Odpowiedź grupowa, nie skalar
  7. Weryfikator, Check: B=ℋG1(enc⁡(X,c))B=\mathcal H_{G_1}(\operatorname{enc}(X,c)) e(S,g2)=?e(B,X⋅Ac)e(S,g_2)\stackrel{?}{=}e(B,X\cdot A^c) Odtwórz B z tego samego kodowania.
Zmiana typu odpowiedzi wymusza zmianę weryfikacji. Samo niewydawanie skalaru nie dowodzi odporności na dowolny wyciek.

Najpierw zachowajmy notację potęgową. Niech g2∈G2g_2\in G_2, A=g2aA=g_2^a i X=g2uX=g_2^u. Hash B=ℋG1(enc⁡(X,c))B=\mathcal H_{G_1}(\operatorname{enc}(X,c)) daje element G1G_1. Zamiast ujawniać skalar s=u+a⋅cs=u+a\cdot c, wysyłamy jego obraz:

S=Bu+a⋅c=Bu⋅(Ba)c,e(S,g2)=e(B,X⋅Ac).S=B^{u+a\cdot c}=B^u\cdot(B^a)^c,\qquad e(S,g_2)=e(B,X\cdot A^c).

Lewą stronę równania można przepisać jako e(B,g2)u+a⋅ce(B,g_2)^{u+a\cdot c}. Prawa strona jest tym samym elementem przez dwuliniowość. Chroniona operacja zwraca BaB^a, a część robocza łączy ten wynik z własnym BuB^u. Nie potrzebuje do tego odczytu aa. To opis rachunku przy założonym podziale urządzenia, nie dowód bezpieczeństwa tego podziału.

Realizacja na krzywej: zapis addytywny tej samej konstrukcji. Rysunek zachowuje powyższe potęgi. Poniższe równanie wyjaśnia operacje wykonywane przez MCL:

Niech P2∈G2P_2\in G_2, A=a⋅P2A=a\cdot P_2, X=u⋅P2X=u\cdot P_2 i e:G1×G2→GTe:G_1\times G_2\to G_T. Wyznaczamy B=ℋG1(enc⁡(X,c))B=\mathcal H_{G_1}(\operatorname{enc}(X,c)) oraz S=(u+a⋅c)⋅BS=(u+a\cdot c)\cdot B. Sprawdzamy:

e(S,P2)=e(B,X+c⋅A).e(S,P_2)=e(B,X+c\cdot A).

Przy znanym uu i c≠0c\ne0 można obliczyć punkt c−1⋅(S−u⋅B)=a⋅Bc^{-1}\cdot(S-u\cdot B)=a\cdot B, ale nie otrzymuje się wprost aa. Znaczenie punktu zależy od powiązania bazy z kontekstem i modelu zapytań. Ta obserwacja nie dowodzi odporności na wszystkie wycieki.

Odpowiedź w grupie · granica modułu

Dydaktyczny podział obliczeń. Obie części wykonują się w tej samej przeglądarce. To nie jest izolacja HSM.

Transkrypt
Model części chronionej · sekret aKlucz publicznyChroniona operacjaCzęść roboczaOdpowiedź i weryfikacja
A=g2aA=g_2^a
Z=BaZ=B^a
X=g2u, B=ℋG1(enc⁡(X,c))X=g_2^u,\ B=\mathcal H_{G_1}(\operatorname{enc}(X,c))
S=Bu⋅ZcS=B^u\cdot Z^c

Zapis i obliczenia. Wzory schematu są multiplikatywne. MCL realizuje je na krzywej. Generator g2g_2 odpowiada punktowi P2P_2. 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 schemat używa również pairingu. W grupie docelowej zapis pozostaje multiplikatywny.

Gotowe do rozpoczęcia.

Granica zaufania: moduł przechowuje aa i zwraca Z=BaZ=B^a. Zwykły kod liczy S=Bu⋅ZcS=B^u\cdot Z^c. W realizacji na krzywej są to odpowiednio Z=a⋅BZ=a\cdot B i S=u⋅B+c⋅ZS=u\cdot B+c\cdot Z. To dydaktyczne rozłożenie równania i założony interfejs urządzenia, nie fizyczny HSM w przeglądarce. Ujawnienie aa łamie założenie. Inne użycia sekretu, np. w AKE, wymagają osobnej analizy.

Porównania i źródła publikacyjne: Schnorr, Okamoto.

W8a. Identyfikacja, transkrypt i zaprzeczalność

Identyfikacja ma przekonać rozmówcę teraz. Podpis ma dać dokument sprawdzalny również później i przez inne osoby. Nie są to zamienne cele. Pytamy więc nie tylko, czy weryfikacja przyjmuje, ale także, kto mógł wytworzyć jej zapis i komu ten zapis coś udowadnia.

Przyjmijmy grupę rzędu qq, gdzie qq jest liczbą pierwszą, generator gg, sekret aa i uwierzytelniony klucz publiczny A=gaA=g^a. Opis i diagramy zachowują ten zapis potęgowy. Operacje na skalarach wykonujemy w Zq\mathbb Z_q. W tym rozdziale ℋ\mathcal H zwraca skalar. Osobny skrót Dℓ\mathcal D_\ell zwraca ℓ\ell bitów i haszuje kanoniczny zapis elementu grupy, a nie mapuje do grupy.

Schnorr: kolejność, która oddziela symulację od ataku

Weryfikator nie wybiera pierwszego komunikatu. Najpierw dowodzący ustala zobowiązanie, dopiero potem otrzymuje wyzwanie:

  1. Dowodzący losuje u←$Zqu\overset{\$}{\leftarrow}\mathbb Z_q i wysyła X=guX=g^u.
  2. Weryfikator losuje c←$Zqc\overset{\$}{\leftarrow}\mathbb Z_q i wysyła cc.
  3. Dowodzący odsyła s=u+a⋅cs=u+a\cdot c. Weryfikator sprawdza gs=X⋅Acg^s=X\cdot A^c.

Uczciwy transkrypt da się wygenerować bez aa. Symulator losuje niezależnie c^,s^←$Zq\widehat c,\widehat s\overset{\$}{\leftarrow}\mathbb Z_q i oblicza X^=gs^⋅A−c^\widehat X=g^{\widehat s}\cdot A^{-\widehat c}. Równanie weryfikacji zachodzi z definicji. Dla każdego ustalonego cc przekształcenie u↦s=u+a⋅cu\mapsto s=u+a\cdot c jest bijekcją. Dlatego symulowane trójki mają dokładnie taki rozkład jak trójki z uczciwej rozmowy. To argument honest-verifier zero knowledge, czyli wiedzy zerowej względem uczciwego weryfikatora.

Nie oznacza to jednak umiejętności podszycia się w czasie rzeczywistym. Symulator konstruuje zobowiązanie po wyborze wyzwania i odpowiedzi. Atakujący w protokole musi wysłać zobowiązanie przed poznaniem wyzwania. Gdybyśmy odwrócili te dwa komunikaty bez innych zmian, symulator stałby się rzeczywistym algorytmem podszycia. Ten błąd porównaj z atakami na identyfikację.

Stinson–Wu: dlaczego weryfikator może zacząć

Wariant Stinsona–Wu z wcześniejszych wykładów nie polega na przestawieniu strzałek Schnorra. Pierwszy komunikat zawiera element grupy Diffiego–Hellmana i skrót oczekiwanej odpowiedzi. Weryfikator zna tę odpowiedź jeszcze przed rozmową, ale osoba podsłuchująca nie zna jego wykładnika.

Identyfikacja Stinsona–Wu: algorytmy i przepływ

Omawiany profil protokołu 2.2 używa niezerowych sekretów. P odpowiada na wyzwanie, a V rozpoczyna rozmowę. Nazwy Challenge, Respond i Check wydzielają kroki tych dwóch maszyn.

Π=(Setup,KeyGen,P,V)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{P},\mathsf{V})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(G,q,g,Dℓ)pp=(G,q,g,\mathcal D_\ell)
Dℓ:G→{0,1}ℓ\mathcal D_\ell:G\to\{0,1\}^\ell

Skrót otrzymuje kanoniczne kodowanie elementu grupy.

KeyGen(pp)\mathsf{KeyGen}(pp)⟶(A,a)\longrightarrow (A,a)
a←$Zq∗,A=gaa\overset{\$}{\leftarrow}\mathbb Z_q^*,\quad A=g^a

Sekret a pozostaje u właściciela. Odbiorca uwierzytelnia publiczny A.

Challenge(pp,A)\mathsf{Challenge}(pp,A)⟶((C,h),stV)\longrightarrow ((C,h),st_V)
r←$Zq∗,C=grr\overset{\$}{\leftarrow}\mathbb Z_q^*,\quad C=g^r
T=Ar,h=Dℓ(T),stV=TT=A^r,\quad h=\mathcal D_\ell(T),\quad st_V=T

Najpierw sprawdź zaufany klucz A. Zachowaj T prywatnie.

Respond(pp,a,(C,h))\mathsf{Respond}(pp,a,(C,h))⟶Z albo ⊥\longrightarrow Z\text{ albo }\bot
Z=CaZ=C^a
Dℓ(Z)=?h\mathcal D_\ell(Z)\stackrel{?}{=}h

Sprawdź C w właściwej podgrupie i odrzuć element neutralny. Przy błędnym h nie wysyłaj Z.

Check(pp,stV,Z)\mathsf{Check}(pp,st_V,Z)⟶b∈{0,1}\longrightarrow b\in\{0,1\}
b=[Z=T]b=[Z=T]

Sprawdź poprawność otrzymanego elementu i porównaj z zapamiętanym T.

Identyfikacja Stinsona–Wu: czynności i komunikatyDowodzącyWeryfikatorChallenge
T i r pozostają po prawej stronie.
Weryfikator rozpoczynaRespond: kontrola przed odpowiedzią
Błędny punkt lub skrót: przerwij bez Z.
Tylko po poprawnej kontroliCheck
Porównaj z własnym oczekiwanym wynikiem.

Identyfikacja Stinsona–Wu

Dowodzący: pp,app,a

Weryfikator: pp,App,A

  1. Weryfikator, Challenge: r←$Zq∗,C=grr\overset{\$}{\leftarrow}\mathbb Z_q^*,\quad C=g^r T=Ar,h=Dℓ(T)T=A^r,\quad h=\mathcal D_\ell(T) T i r pozostają po prawej stronie.
  2. Weryfikator → Dowodzący: (C,h)(C,h) Weryfikator rozpoczyna
  3. Dowodzący, Respond: kontrola przed odpowiedzią: Z=CaZ=C^a Dℓ(Z)=?h\mathcal D_\ell(Z)\stackrel{?}{=}h Błędny punkt lub skrót: przerwij bez Z.
  4. Dowodzący → Weryfikator: ZZ Tylko po poprawnej kontroli
  5. Weryfikator, Check: Z=?T=ArZ\stackrel{?}{=}T=A^r Porównaj z własnym oczekiwanym wynikiem.
Dwa komunikaty. Zanim dowodzący ujawni C do potęgi a, kontroluje skrót. Weryfikator potrafi sam przygotować uczciwy transkrypt. Nie jest to Schnorr z odwróconą kolejnością strzałek. Stinson–Wu, protokół 2.2.
  1. Weryfikator losuje tajne r←$Zq∗r\overset{\$}{\leftarrow}\mathbb Z_q^*, oblicza C=grC=g^r i h=Dℓ(Ar)h=\mathcal D_\ell(A^r), po czym wysyła parę (C,h)(C,h).
  2. Dowodzący sprawdza poprawność punktu CC i oblicza Z=CaZ=C^a. Najpierw sprawdza Dℓ(Z)=h\mathcal D_\ell(Z)=h. Przy niezgodności przerywa bez wysyłania ZZ.
  3. Przy zgodności dowodzący odsyła ZZ. Weryfikator akceptuje wtedy i tylko wtedy, gdy Z=ArZ=A^r.
Ca=(gr)a=gr⋅a=Ar.C^a=(g^r)^a=g^{r\cdot a}=A^r.

W grupie krzywej jest to dokładnie C=r⋅P2C=r\cdot P_2 oraz Z=a⋅C=r⋅AZ=a\cdot C=r\cdot A. Nie potrzebujemy pairingu. Dwa komunikaty nie oznaczają dwóch prostych operacji, bo przed odpowiedzią trzeba wykonać kontrolę skrótu. Pominięcie kontroli oddawałoby przeciwnikowi usługę obliczania CaC^a dla dowolnego podanego CC.

To operacyjny wariant z protokołu 2.2 Stinsona–Wu. Używamy niezerowych sekretów i niejednostkowych punktów, zgodnie z przykładem ze slajdów. W oryginalnym opisie rr jest losowane z całego Zq\mathbb Z_q. Przy porównywaniu rozkładów symulatora i protokołu trzeba zachować tę samą dziedzinę losowania. Implementacja odbierająca cudze punkty musi sprawdzić ich przynależność do właściwej podgrupy przed mnożeniem przez sekret. Demonstrator wytwarza wszystkie punkty lokalnie z generatora tej podgrupy. Nie implementuje przyjmowania komunikatów z sieci.

Zaprzeczalność: symulator bez klucza tajnego

„Weryfikator może sam wygenerować całość” oznacza istnienie konkretnego algorytmu. Nazywamy go symulatorem, czyli generatorem zapisu rozmowy, który nie potrzebuje udziału dowodzącego. Nie wystarczy, że zapis spełnia równania weryfikacji. Musi także mieć odpowiedni rozkład, aby obserwator nie mógł odróżnić go od prawdziwego zapisu. Tutaj uzyskamy dokładnie ten sam rozkład.

Wejście publiczne: parametry pp=(G,q,g,Dℓ)pp=(G,q,g,\mathcal D_\ell) oraz poprawny, niejednostkowy klucz A∈GA\in G. Sekret niebędący wejściem: wykładnik aa, dla którego A=gaA=g^a. Wyjście: transkrypt τ\tau, czyli uporządkowany zapis dwóch komunikatów:

τ=((C,h),Z)∈(G×{0,1}ℓ)×G.\tau=((C,h),Z)\in(G\times\{0,1\}^\ell)\times G.

Symulator jest efektywnym algorytmem probabilistycznym. Ma własną losowość, ale nie dostaje cudzego sekretu ani dostępu do urządzenia dowodzącego. Losowany przez niego rr nie jest odzyskanym sekretem rzeczywistej sesji. Jest nową, niezależną wartością, która służy do zbudowania nowego zapisu. Tak jak w omawianym profilu protokołu, losowanie jest jednostajne z Zq∗\mathbb Z_q^*.

Symulator transkryptu Stinsona–Wu: algorytmy i przepływ

Sim generuje zapis, a nie prowadzi rozmowy z posiadaczem sekretu. Zakładamy poprawne parametry i klucz A. Własna losowość r pozostaje wewnątrz algorytmu.

Sim(pp,A)\mathsf{Sim}(pp,A)⟶τ\longrightarrow \tau
r←$Zq∗r\overset{\$}{\leftarrow}\mathbb Z_q^*
C=gr,Z=ArC=g^r,\quad Z=A^r
h=Dℓ(Z)h=\mathcal D_\ell(Z)
zwroˊcˊ τ=((C,h),Z)\text{zwróć }\tau=((C,h),Z)

Wejście nie zawiera a. Nie wywołujemy Respond i nie kontaktujemy się z dowodzącym.

Symulator transkryptu Stinsona–Wu: czynności i komunikatySymulatorObserwator zapisuSim: wylosuj własny wykładnik
Ta sama dziedzina co w protokole.
Sim: wylicz oba punkty
Publiczny A wystarcza. Nie znamy a.
Sim: dołącz skrót
Oba komunikaty powstały lokalnie.
Przekazanie gotowego zapisuWidok osoby trzeciej
Brak informacji o pochodzeniu zapisu.

Symulator transkryptu Stinsona–Wu

Symulator: pp,App,A

Obserwator zapisu: pp,App,A

  1. Symulator, Sim: wylosuj własny wykładnik: r←$Zq∗r\overset{\$}{\leftarrow}\mathbb Z_q^* Ta sama dziedzina co w protokole.
  2. Symulator, Sim: wylicz oba punkty: C=gr,Z=ArC=g^r,\quad Z=A^r Publiczny A wystarcza. Nie znamy a.
  3. Symulator, Sim: dołącz skrót: h=Dℓ(Z)h=\mathcal D_\ell(Z) τ=((C,h),Z)\tau=((C,h),Z) Oba komunikaty powstały lokalnie.
  4. Symulator → Obserwator zapisu: τ=((C,h),Z)\tau=((C,h),Z) Przekazanie gotowego zapisu
  5. Obserwator zapisu, Widok osoby trzeciej: pp,A,τpp,A,\tau Brak informacji o pochodzeniu zapisu.
Strzałka przekazuje gotowy transkrypt obserwatorowi. Nie jest komunikatem identyfikacji. Symulator nie otrzymuje klucza tajnego ani odpowiedzi od jego właściciela.

Dlaczego nie da się rozpoznać pochodzenia zapisu

Ustalmy poprawne pp,App,A oraz odpowiadający sekret aa. Niech Real(pp,A,a)\mathsf{Real}(pp,A,a) oznacza transkrypt pełnej, uczciwej rozmowy z poprzedniego diagramu. W tym eksperymencie dowodzący rzeczywiście używa aa. Natomiast Sim(pp,A)\mathsf{Sim}(pp,A) oznacza wynik algorytmu powyżej. Porównujemy rozkłady wyników, nie zakładamy, że dwa niezależne uruchomienia dadzą identyczne bajty.

Dowód w trzech krokach:

  1. W obu eksperymentach rr jest losowane jednostajnie z tego samego zbioru Zq∗\mathbb Z_q^*. Możemy więc porównać wyniki dla każdego ustalonego rr.
  2. Pierwszy punkt jest w obu przypadkach równy C=grC=g^r. Odpowiedź prawdziwego dowodzącego oraz odpowiedź utworzona przez symulator są równe:
Zreal=Ca=(gr)a=gr⋅a=Ar=Zsim.Z_{\mathrm{real}}=C^a=(g^r)^a=g^{r\cdot a}=A^r=Z_{\mathrm{sim}}.
  1. Ta sama funkcja Dℓ\mathcal D_\ell zastosowana do tego samego elementu daje ten sam hh. Dla każdego rr otrzymujemy więc ten sam transkrypt, z tym samym prawdopodobieństwem. Stąd:
Real(pp,A,a)≡Sim(pp,A).\mathsf{Real}(pp,A,a)\equiv\mathsf{Sim}(pp,A).

Symbol ≡\equiv oznacza tutaj równość rozkładów. Formalnie, dla dowolnego testu T\mathcal T, który otrzymuje tylko pp,A,τpp,A,\tau i zwraca bit, zachodzi:

Pr⁡[T(pp,A,Real(pp,A,a))=1]=Pr⁡[T(pp,A,Sim(pp,A))=1].\begin{aligned} &\Pr[\mathcal T(pp,A,\mathsf{Real}(pp,A,a))=1]\\ ={}&\Pr[\mathcal T(pp,A,\mathsf{Sim}(pp,A))=1]. \end{aligned}

Prawdopodobieństwa obejmują losowość tworzenia transkryptu i ewentualną losowość testu. To równość dokładna, a nie tylko nierozróżnialność dla testów o ograniczonym czasie działania. Ten konkretny argument nie wymaga trudności logarytmu dyskretnego ani modelu wyroczni losowej. Wynika z równości grupowej i identycznego sposobu losowania. Założenia bezpieczeństwa są potrzebne do innych twierdzeń, w szczególności do analizy podszywania.

Co to daje dla zaprzeczalności

Sam transkrypt uczciwej rozmowy nie jest przenośnym dowodem udziału właściciela klucza. Weryfikator mógł stworzyć taki zapis bez niego. Osoba trzecia, która zna tylko dane publiczne i ten zapis, nie ma testu pozwalającego ustalić jego pochodzenie. To właśnie uzasadnienie zaprzeczalności takiego transkryptu. Nie twierdzimy, że symulator usuwa nagrania, poświadczenia urządzenia lub inne dowody pochodzące spoza protokołu.

Nie jest to algorytm podszywania się w żywej rozmowie. Symulator sam wybiera rr, więc może obliczyć ArA^r. Atakujący, który otrzymał od uczciwego weryfikatora cudze (C,h)(C,h), nie może zastąpić go własnym wyzwaniem. Musi odpowiedzieć dla otrzymanego CC, nie znając ani aa, ani wykładnika rr tego wyzwania. Równość rozkładów nie daje mu takiej umiejętności. Zaprzeczalność zapisu i odporność na podszywanie odpowiadają na różne pytania.

Zakres argumentu: porównaliśmy pełne, uczciwe rozmowy. Dla złośliwego weryfikatora trzeba zdefiniować jego cały widok, obejmujący również własny stan, i zbudować odpowiedni symulator. To mocniejsze wymaganie. W analizie Stinsona–Wu pełniejszy wynik o wiedzy zerowej korzysta z modelu wyroczni losowej i założenia wiedzy o wykładniku, KEA. Analiza podszywania wykorzystuje również CDH. Nie wyprowadzamy tych twierdzeń wyłącznie z powyższej równości. Poprawny skrót nie jest też bezwarunkowym dowodem znajomości rr przez nadawcę, bo całe wyzwanie można przekopiować.

KEA
knowledge-of-exponent assumption. Założenie wiedzy wykładnika.

W demonstratorze MCL poniżej weryfikator liczy oczekiwaną odpowiedź ArA^r bez sekretu aa, a dowodzący oblicza CaC^a. Na rysunku zachowujemy potęgi. Realizacja na krzywej wykonuje odpowiednio r⋅Ar\cdot A i a⋅Ca\cdot C. Porównanie wyników pokazuje krok algebraiczny dowodu. Sam test numeryczny nie zastępuje argumentu o całym rozkładzie.

Fiat–Shamir zmienia rolę wyzwania

W Schnorrze zamiast niezależnego cc możemy związać wyzwanie z wiadomością mm, kluczem, zobowiązaniem i opisem grupy. Dla A=gaA=g^a i X=guX=g^u zapisujemy najpierw:

c=ℋ(enc⁡(sig,g,A,X,m)),s=u+a⋅c,σ=(X,s).c=\mathcal H\bigl(\operatorname{enc}(\mathtt{sig},g,A,X,m)\bigr),\qquad s=u+a\cdot c,\qquad \sigma=(X,s).

Odbiorca wylicza hasz ponownie i sprawdza gs=X⋅Acg^s=X\cdot A^c. W addytywnym profilu demonstratora gg reprezentuje punkt P2P_2, A=a⋅P2A=a\cdot P_2 i X=u⋅P2X=u\cdot P_2. Hasz otrzymuje kanoniczne kodowania tych punktów:

c=ℋ(enc⁡(sig,P2,A,X,m)),σ=(X,s).c=\mathcal H\bigl(\operatorname{enc}(\mathtt{sig},P_2,A,X,m)\bigr),\qquad \sigma=(X,s).

Teraz odbiorca podpisu sam odtwarza cc. Trójka wygenerowana przez zwykły symulator Schnorra spełnia równanie grupowe, ale jej niezależnie wylosowane c^\widehat c zazwyczaj nie jest haszem otrzymanego X^\widehat X. W idealnym modelu przy niezależnym świeżym zapytaniu szansa zgodności wynosi 1/q1/q. Tak powstaje istotna różnica między symulacją rozmowy a podrobieniem podpisu.

Złośliwy interaktywny weryfikator może wybrać wyzwanie właśnie jako taki hasz. Jeżeli kodowania, klucze i dziedziny protokołów na to pozwalają, otrzyma odpowiedź o postaci podpisu. Dlatego samo HVZK nie uzasadnia zaprzeczalności wobec dowolnego weryfikatora. Programowanie wyroczni losowej w dowodzie Fiata–Shamira nie daje zwykłemu użytkownikowi możliwości zmieniania rzeczywistej funkcji haszującej.

Stinson–Wu nie jest protokołem public-coin o tej samej strukturze. Naiwne ustalenie r=ℋ(m)r=\mathcal H(m) nie tworzy analogicznego podpisu. Upublicznia rr, więc każdy może obliczyć ArA^r i wygenerować odpowiedź. Sekret weryfikatora jest tu częścią mechanizmu, a nie zbędnym źródłem losowości.

Pytanie Schnorr Stinson–Wu, omawiany wariant
Kto zaczyna? Dowodzący ustala XX. Weryfikator wysyła (C,h)(C,h).
Co jest wyzwaniem? Jawny skalar cc, nieznany przy wyborze XX. Punkt CC i skrót hh. Skalar rr pozostaje tajny.
Jak symulujemy uczciwy zapis? Wybieramy c,sc,s, potem obliczamy XX. Wybieramy rr, potem obliczamy całą rozmowę z publicznego AA.
Dlaczego istnieje test przed odpowiedzią? Bezpieczeństwo zależy m.in. od kolejności zobowiązania i wyzwania. Kontrola hh ogranicza wydawanie potęg CaC^a.
Co daje znana losowość weryfikatora? Znajomość cc po ustaleniu XX jest normalna. Poznanie go wcześniej zmienia sytuację. Ujawnienie rr pozwala podszyć się przez obliczenie r⋅Ar\cdot A, bez odzyskania aa.
Czy wystarczy zwykłe podstawienie Fiata–Shamira? Jest podstawą konstrukcji podpisu, z osobną analizą bezpieczeństwa. Nie. Jawne rr pozwala wytworzyć odpowiedź każdemu.
Ta sama tożsamość, inny przebieg i inne znaczenie transkryptu

MCL WebAssembly · BLS12-381. W obliczeniach A=gaA=g^a. Wszystkie klucze są testowe.

Eksperyment
Wspólny klucz publicznyoczekuje

Schnorr · trzy komunikaty

Kolejność komunikatów: dowodzący po lewej, weryfikator po prawejDowodzącyWeryfikator
XX
cc
ss
XXoczekuje
ccoczekuje
ssoczekuje
gs=X⋅Acg^s=X\cdot A^c

Sprawdzenie oczekuje.

Stinson–Wu · dwa komunikaty

Kolejność komunikatów: dowodzący po lewej, weryfikator po prawejDowodzącyWeryfikator
(C,h)(C,h)
ZZ
Z=CaZ=C^a
Dℓ(Z)=?h\mathcal D_\ell(Z)\stackrel{?}=h
Dowodzący: sprawdź skrót
CCoczekuje
hhoczekuje
ZZoczekuje
Z=?ArZ\stackrel{?}=A^r

Sprawdzenie oczekuje.

Co można stworzyć bez dowodzącego?

Symulator Schnorra dostaje tylko parametry i klucz publiczny.

c^,s^←$Zq\widehat c,\widehat s\overset{\$}{\leftarrow}\mathbb Z_q
X^=gs^⋅A−c^\widehat X=g^{\widehat s}\cdot A^{-\widehat c}
X^\widehat Xoczekuje
c^\widehat coczekuje
s^\widehat soczekuje

Symulacja oczekuje.

Weryfikator Stinsona–Wu zna oczekiwaną odpowiedź jeszcze przed rozmową.

Z=ArZ=A^r
Odpowiedź obliczona przez weryfikatoraoczekuje

Porównanie oczekuje.

Zapis i obliczenia. Wzory schematu są multiplikatywne. MCL realizuje je na krzywej. Generator gg odpowiada punktowi P2P_2. 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 obliczeń

Serializacje MCL i skróty SHA-256. Dane powstają lokalnie. Skróty widoczne na rysunku nie są dodatkowymi operacjami protokołu.

WartośćPełny zapis

Wspólna granica: żaden z tych przepływów sam nie mierzy odległości ani nie uniemożliwia przezroczystego przekazywania komunikatów. Ochrona przed relay, ujawnieniem stanu i błędnymi punktami wymaga jawnego modelu. Pytaj kolejno: co przyjmuje weryfikator, kto może stworzyć zapis, kto może odpowiedzieć na bieżąco i co wolno ujawnić?

Powiązania: zadania o zaprzeczalności, laboratorium porównawcze, dowód transformaty. Źródła: Schnorr, Fiat–Shamir, Stinson–Wu.