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.

W13. Współdzielenie sekretu i wykluczanie odbiorców

Interfejs współdzielenia

Schemat ΠSS=(Setup,Share,Recover)\Pi_{\mathrm{SS}}=(\mathsf{Setup},\mathsf{Share},\mathsf{Recover}) nie jest szyfrowaniem z osobnym kluczem odszyfrowującym. Setup ustala ciało, liczbę uczestników i próg. Rozdający wywołuje (s1,…,sn)←Share(pp,s)(s_1,\ldots,s_n)\leftarrow\mathsf{Share}(pp,s) dla sekretu ss. Uczestnik ii otrzymuje prywatnie tylko swój udział sis_i. Procedura Recover(pp,{(i,si):i∈I})\mathsf{Recover}(pp,\{(i,s_i):i\in I\}) odtwarza sekret z odpowiedniego zbioru II udziałów.

Poprawność dotyczy wystarczającej liczby prawidłowych udziałów. Prywatność dotyczy informacji w mniejszej koalicji. Kontrola formatu nie wykrywa automatycznie udziału, który ma poprawny typ, lecz złą wartość. Po określeniu tego interfejsu możemy wybrać jako jego realizację wielomian Shamira.

Współdzielenie Shamira: algorytmy i przepływ

Π=(Setup,Share,Recover)\Pi=(\mathsf{Setup},\mathsf{Share},\mathsf{Recover})
Setup(1λ,n,t)\mathsf{Setup}(1^\lambda,n,t)⟶pp\longrightarrow pp
pp=(q,n,t),1≤t≤n<qpp=(q,n,t),\quad1\le t\le n<q

q jest pierwsze. Identyfikatory są różnymi niezerowymi elementami ℤ_q.

Share(pp,s)\mathsf{Share}(pp,s)⟶((i,si))i=1n\longrightarrow ((i,s_i))_{i=1}^n
a1,…,at−1←$Zqa_1,\ldots,a_{t-1}\overset{\$}{\leftarrow}\mathbb Z_q
f(z)=s+∑j=1t−1aj⋅zjf(z)=s+\sum_{j=1}^{t-1}a_j\cdot z^j
si=f(i)s_i=f(i)

Każdy uczestnik prywatnie dostaje tylko swój udział.

Recover(pp,{(i,si):i∈I})\mathsf{Recover}(pp,\{(i,s_i):i\in I\})⟶s\longrightarrow s
λi=∏j∈I∖{i}(−j)⋅(i−j)−1\lambda_i=\prod_{j\in I\setminus\{i\}}(-j)\cdot(i-j)^{-1}
s=∑i∈Iλi⋅si(modq)s=\sum_{i\in I}\lambda_i\cdot s_i\pmod q

Wymagaj co najmniej t różnych, prawidłowych udziałów. Sam Shamir nie sprawdza ich autentyczności.

Współdzielenie Shamira: czynności i komunikatyRozdającyUczestnicyOdtwarzającyShare: wielomianPrywatnie, osobno do iZachowaj swój udział
Każdy zna tylko własny udział.
Później koalicja przekazuje udziałyRecover
Tu sekret zostaje odtworzony jawnie.

Współdzielenie Shamira

  1. Rozdający, Share: wielomian: f(0)=s,deg⁡f≤t−1f(0)=s,\quad\deg f\le t-1 si=f(i)s_i=f(i)
  2. Rozdający → Uczestnicy: (i,si)(i,s_i) Prywatnie, osobno do i
  3. Uczestnicy, Zachowaj swój udział: (i,si)(i,s_i) Każdy zna tylko własny udział.
  4. Uczestnicy → Odtwarzający: {(i,si):i∈I}\{(i,s_i):i\in I\} Później koalicja przekazuje udziały
  5. Odtwarzający, Recover: s=∑i∈Iλi⋅sis=\sum_{i\in I}\lambda_i\cdot s_i Tu sekret zostaje odtworzony jawnie.
Pierwsza strzałka oznacza osobne prywatne dostarczenie każdego udziału. Druga oznacza zebranie udziałów wybranej koalicji. Żadna nie oznacza publicznego rozesłania wszystkich udziałów.

Sekret ss ma być odtwarzalny z tt udziałów, lecz ukryty przed mniejszą koalicją. Liczbę uczestników oznaczymy przez nn, a próg przez tt, gdzie 1≤t≤n<q1\le t\le n<q. W schemacie Shamira pracujemy nad ciałem Zq\mathbb Z_q dla pierwszego qq. Losujemy niezależnie t−1t-1 współczynników a1,…,at−1a_1,\ldots,a_{t-1} z całego ciała i budujemy wielomian:

f(z)=s+a1⋅z+⋯+at−1⋅zt−1.f(z)=s+a_1\cdot z+\cdots+a_{t-1}\cdot z^{t-1}.

Sekret to f(0)f(0). Udział ma postać (i,f(i))(i,f(i)) dla różnych niezerowych ii. Współczynniki są niezależne i jednostajne. Stopień wynosi co najwyżej t−1t-1.

Dwa rachunki: odtworzenie i tajność

Interpolacja odtwarza wielomian z jego wartości w różnych punktach. Wielomian stopnia co najwyżej t−1t-1 jest jednoznacznie określony przez tt takich wartości. Do odzyskania sekretu potrzebujemy tylko jego wartości w zerze. Wzór Lagrange'a wyznacza ją jako sumę udziałów pomnożonych przez wagi. Każda waga zależy wyłącznie od publicznych identyfikatorów uczestników. Ułamki poniżej oznaczają mnożenie przez odwrotności w ciele, nie dzielenie zmiennoprzecinkowe.

Dla tt identyfikatorów w zbiorze II:

s=∑i∈If(i)⋅∏j∈Ij≠i−ji−j(modq).s=\sum_{i\in I}f(i)\cdot \prod_{\substack{j\in I\\j\ne i}}\frac{-j}{i-j}\pmod q.

Mianowniki są niezerowe. Dla mniej niż tt udziałów każdy sekret ma tyle samo zgodnych uzupełnień współczynników. Dlatego obserwacja jest niezależna od sekretu. Interpolacja dowodzi poprawności. Liczenie uzupełnień dowodzi prywatności.

Shamir · próg 3 z 5

Małe ciało ℤ₁₀₁ do nauki interpolacji. Nie zapewnia bezpieczeństwa praktycznego. Losowane są dwa współczynniki.

Udziały do odtworzenia

Gotowe do rozpoczęcia.

Shamir nie uwierzytelnia udziałów. Fałszywy udział może zniszczyć wynik. Weryfikowalne współdzielenie wymaga dodatkowych mechanizmów.

Rozgłaszanie z wykluczaniem

Punkt odniesienia: każdy odbiorca ma własny klucz, a nadawca szyfruje klucz treści oddzielnie dla niewykluczonych. Koszt jest liniowy. Drzewiaste pokrycie wybiera poddrzewa bez wykluczonych liści i szyfruje klucz treści pod kluczami tych węzłów. Trzeba dowieść, że koalicja wykluczonych nie zna żadnego użytego klucza.

Powiązania: C11, Shamir.

Przykład: w pełnym drzewie o ośmiu liściach, po wykluczeniu liścia 1, można pokryć odbiorców poddrzewami {2}\{2\}, {3,4}\{3,4\} i {5,6,7,8}\{5,6,7,8\}. Odbiorca posiada klucze węzłów na własnej ścieżce do korzenia. Nie używamy klucza korzenia, bo zna go również wykluczony odbiorca. Dla każdej części pokrycia wystarczy jedna chroniona kopia świeżego klucza treści.

To przykład complete subtree z niezależnymi kluczami węzłów. Gdy odwołano więcej osób, trzeba policzyć nowe pokrycie. Klucz treści musi się zmienić. Odwołanie nie usuwa wiadomości ani dawnych kluczy, które odbiorca już poznał.

Źródło konstrukcji i modelu odbiorców: Naor–Naor–Lotspiech, Revocation and Tracing Schemes for Stateless Receivers.

W13a. Identyfikacja i podpis bez odtwarzania sekretu

Funkcjonalność progowa oznacza, że co najmniej tt z nn uczestników wspólnie używa jednego klucza. Zwykłe zebranie udziałów Shamira u koordynatora odtwarza cały sekret. Chcemy zamiast tego połączyć odpowiedzi protokołu, nie ujawniając koordynatorowi udziałów. Najpierw pokazujemy algebrę z zaufanym dealerem i uczciwymi uczestnikami, potem wskazujemy dodatkowe obowiązki modelu złośliwego.

Interpolacja odpowiedzi Schnorra

Najpierw potęgi i udziały. Dla wielomianu ff stopnia co najwyżej t−1t-1 sekret to a=f(0)a=f(0), a udziały to ai=f(i)a_i=f(i) dla różnych niezerowych indeksów i∈Zqi\in\mathbb Z_q. Niech II będzie ustalonym zbiorem co najmniej tt uczestników, a wagi interpolacji λi\lambda_i spełniają ∑i∈Iλi⋅ai=a\sum_{i\in I}\lambda_i\cdot a_i=a. Ich wzór podamy poniżej. Publiczne klucze zapisujemy jako A=gaA=g^a i Ai=gaiA_i=g^{a_i}.

Progowa identyfikacja Schnorra: algorytmy i przepływ

Rachunek dla uczciwej, ustalonej sesji z zaufanym dealerem. Setup wybiera grupę i próg. Share stosuje wielomian Shamira z f(0)=a, przekazuje a_i=f(i) i publikuje A=g^a oraz A_i=g^{a_i}. To nie pełny protokół FROST. Zbiór I i wagi λ_i są wspólnie ustalone.

FROST
Flexible Round-Optimized Schnorr Threshold. Elastyczny progowy protokół Schnorra ze zoptymalizowaną liczbą rund.
Π=(Setup,Share,Commit,Challenge,Respond,Combine,Check)\Pi=(\mathsf{Setup},\mathsf{Share},\mathsf{Commit},\mathsf{Challenge},\mathsf{Respond},\mathsf{Combine},\mathsf{Check})
Commit(pp,i)\mathsf{Commit}(pp,i)⟶(Xi,ui)\longrightarrow (X_i,u_i)
ui←$Zq,Xi=guiu_i\overset{\$}{\leftarrow}\mathbb Z_q,\quad X_i=g^{u_i}
Challenge(pp,{Xi}i∈I)\mathsf{Challenge}(pp,\{X_i\}_{i\in I})⟶(X,c)\longrightarrow (X,c)
X=∏i∈IXi,c←$ZqX=\prod_{i\in I}X_i,\quad c\overset{\$}{\leftarrow}\mathbb Z_q
Respond(pp,ai,ui,c,I)\mathsf{Respond}(pp,a_i,u_i,c,I)⟶si\longrightarrow s_i
si=ui+c⋅λi⋅ai(modq)s_i=u_i+c\cdot\lambda_i\cdot a_i\pmod q

Zużyj u_i nawet po przerwaniu sesji.

Combine(pp,I,{Xi,si,Ai},c)\mathsf{Combine}(pp,I,\{X_i,s_i,A_i\},c)⟶s albo ⊥\longrightarrow s\text{ albo }\bot
gsi=?Xi⋅Aic⋅λig^{s_i}\stackrel{?}{=}X_i\cdot A_i^{c\cdot\lambda_i}
s=∑i∈Isi(modq)s=\sum_{i\in I}s_i\pmod q

Sprawdź każdą część przed sumowaniem.

Check(pp,A,X,c,s)\mathsf{Check}(pp,A,X,c,s)⟶b∈{0,1}\longrightarrow b\in\{0,1\}
b=[gs=X⋅Ac]b=[g^s=X\cdot A^c]
Progowa identyfikacja Schnorra: czynności i komunikatyUczestnik iKoordynator / weryfikatorCommit: dla każdego iOsobne zobowiązanie każdego uczestnikaChallengeWspólne wyzwanie w ustalonej sesjiRespondBez ujawniania a_iCombine i Check

Progowa identyfikacja Schnorra

Uczestnik i: pp,I,aipp,I,a_i

Koordynator / weryfikator: pp,I,A,(Ai)pp,I,A,(A_i)

  1. Uczestnik i, Commit: dla każdego i: ui←$Zq,Xi=guiu_i\overset{\$}{\leftarrow}\mathbb Z_q,\quad X_i=g^{u_i}
  2. Uczestnik i → Koordynator / weryfikator: XiX_i Osobne zobowiązanie każdego uczestnika
  3. Koordynator / weryfikator, Challenge: X=∏i∈IXiX=\prod_{i\in I}X_i c←$Zqc\overset{\$}{\leftarrow}\mathbb Z_q
  4. Koordynator / weryfikator → Uczestnik i: (I,c)(I,c) Wspólne wyzwanie w ustalonej sesji
  5. Uczestnik i, Respond: si=ui+c⋅λi⋅ais_i=u_i+c\cdot\lambda_i\cdot a_i
  6. Uczestnik i → Koordynator / weryfikator: sis_i Bez ujawniania a_i
  7. Koordynator / weryfikator, Combine i Check: gsi=?Xi⋅Aic⋅λig^{s_i}\stackrel{?}{=}X_i\cdot A_i^{c\cdot\lambda_i} s=∑isi,gs=?X⋅Acs=\sum_i s_i,\quad g^s\stackrel{?}{=}X\cdot A^c
Koordynator widzi części odpowiedzi, nie udziały sekretu. Rozdzielenie roli koordynatora i weryfikatora wymaga przekazania między nimi X, c i s.

Uczestnik wysyła Xi=guiX_i=g^{u_i} dla świeżego nonce uiu_i. Zobowiązania mnożymy, lecz odpowiedzi skalarne dodajemy:

X=∏i∈IXi,si=ui+c⋅λi⋅ai,s=∑i∈Isi.X=\prod_{i\in I}X_i,\qquad s_i=u_i+c\cdot\lambda_i\cdot a_i,\qquad s=\sum_{i\in I}s_i.

Dla wspólnego wyzwania cc częściowa kontrola to gsi=Xi⋅Aic⋅λig^{s_i}=X_i\cdot A_i^{c\cdot\lambda_i}. Po pomnożeniu równań uzyskujemy:

gs=X⋅(∏i∈IAiλi)c=X⋅Ac.g^s=X\cdot\left(\prod_{i\in I}A_i^{\lambda_i}\right)^c=X\cdot A^c.

Weryfikator widzi zatem zwykłe równanie Schnorra. Sposób przygotowania odpowiedzi jest rozproszony. Realizacja na krzywej. Poniżej zapisujemy dokładnie ten rachunek addytywnie, aby wyjaśnić operacje MCL.

Dealer losuje wielomian ff stopnia co najwyżej t−1t-1, z sekretem a=f(0)a=f(0). Uczestnik ii otrzymuje ai=f(i)a_i=f(i). Publiczne są A=a⋅P2A=a\cdot P_2 i klucze weryfikacyjne udziałów Ai=ai⋅P2A_i=a_i\cdot P_2. Dla ustalonego zbioru uczestników II, o liczności co najmniej tt, definiujemy współczynniki:

λi=∏j∈Ij≠i−ji−j,∑i∈Iλi⋅ai=a(modq).\lambda_i=\prod_{\substack{j\in I\\j\ne i}}\frac{-j}{i-j},\qquad \sum_{i\in I}\lambda_i\cdot a_i=a\pmod q.

Każdy uczestnik losuje świeże uiu_i i przekazuje Xi=ui⋅P2X_i=u_i\cdot P_2. Po zebraniu zobowiązań powstaje X=∑i∈IXiX=\sum_{i\in I}X_i. Weryfikator losuje jedno wspólne wyzwanie cc. Uczestnicy odpowiadają:

si=ui+c⋅λi⋅ai,s=∑i∈Isi.s_i=u_i+c\cdot\lambda_i\cdot a_i,\qquad s=\sum_{i\in I}s_i.

Koordynator sprawdza częściowe równania si⋅P2=Xi+c⋅λi⋅Ais_i\cdot P_2=X_i+c\cdot\lambda_i\cdot A_i. Weryfikator końcowy sprawdza zwykłe równanie Schnorra:

s⋅P2=∑iXi+c⋅∑iλi⋅Ai=X+c⋅A.s\cdot P_2=\sum_i X_i+c\cdot\sum_i\lambda_i\cdot A_i=X+c\cdot A.
Próg 2 z 3 · wspólna identyfikacja

MCL WebAssembly, BLS12-381. Zaufany dealer, jedna sesja. Koordynator weryfikuje częściowe odpowiedzi.

Uczestnicy
Test negatywny
Uczestnik 1udział sekretuUczestnik 2udział sekretuUczestnik 3udział sekretuWeryfikacja odpowiedzijeden wspólny klucz publiczny
UczestnikOdpowiedź · skrót hexWeryfikacja udziału
Wybierz co najmniej dwóch uczestników.

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.

Co wynika z tych równań, a co jeszcze nie

Poprawność wynika z liniowości i interpolacji. HVZK końcowego transkryptu otrzymujemy jak dla Schnorra: losujemy c,sc,s i obliczamy X=s⋅P2−c⋅AX=s\cdot P_2-c\cdot A. Suma niezależnych, jednostajnych nonce jest jednostajna. Dotyczy to widoku zewnętrznego weryfikatora, nie pełnego widoku złośliwej koalicji uczestników.

Szczególna rzetelność, jak w W7: z dwóch akceptujących transkryptów z tym samym XX i różnymi wyzwaniami otrzymujemy a=(s−s′)⋅(c−c′)−1a=(s-s')\cdot(c-c')^{-1}. Dwa przebiegi z tym samym częściowym XiX_i mogą również ujawnić udział:

ai=(si−si′)⋅(λi⋅(c−c′))−1.a_i=(s_i-s_i')\cdot\bigl(\lambda_i\cdot(c-c')\bigr)^{-1}.

Dlatego nonce uczestnika jest jednorazowy, nawet gdy sesja została przerwana. Lista II musi być ustalona i uwierzytelniona. Zmiana listy zmienia wagi. Klucze AiA_i ujawniają obrazy udziałów, więc bezwarunkowy dowód prywatności samych udziałów Shamira nie jest już pełnym dowodem dla publicznego transkryptu tego systemu.

Pełny protokół progowy wymaga ponadto poprawnej dystrybucji klucza, kontroli złośliwych udziałów, związania zobowiązań z sesją, ochrony przed adaptacyjnym wyborem nonce i analizy współbieżności. FROST używa dwóch nonce i współczynników wiążących. Nie jest tylko powyższym równaniem z wyzwaniem zastąpionym haszem. RFC 9591 opisuje konkretny dwurundowy protokół podpisu i wymagania implementacyjne. Nasza animacja pokazuje prostszy interaktywny protokół dla ustalonej sesji, a nie implementację FROST.

Te same udziały, inna funkcjonalność: progowy BLS

Cel: uczestnicy tworzą podpis jednej wiadomości mm pod wspólnym kluczem, nie odtwarzając sekretu aa. Zachowujemy udziały aia_i, zbiór II i wagi λi\lambda_i z poprzedniej konstrukcji. Zmieniają się algorytm odpowiedzi i sposób łączenia wyników.

Progowy BLS: interpolacja podpisów: algorytmy i przepływ

Setup i Verify są jak w BLS. Share używa Shamira z sekretem a i prywatnie rozsyła udziały. Publiczne klucze udziałów powstają przez działanie tych udziałów na generatorze G2. Poniższy rachunek zakłada poprawną dystrybucję i ustalony zbiór I. Nie jest kompletnym protokołem generowania klucza w modelu złośliwym.

Π=(Setup,Share,PartialSign,CheckShare,Combine,Verify)\Pi=(\mathsf{Setup},\mathsf{Share},\mathsf{PartialSign},\mathsf{CheckShare},\mathsf{Combine},\mathsf{Verify})
PartialSign(pp,ai,m)\mathsf{PartialSign}(pp,a_i,m)⟶σi\longrightarrow \sigma_i
Q=ℋG1(m),σi=QaiQ=\mathcal H_{G_1}(m),\quad\sigma_i=Q^{a_i}
CheckShare(pp,Ai,m,σi)\mathsf{CheckShare}(pp,A_i,m,\sigma_i)⟶bi\longrightarrow b_i
bi=[e(σi,g2)=e(ℋG1(m),Ai)]b_i=[e(\sigma_i,g_2)=e(\mathcal H_{G_1}(m),A_i)]

Waliduj punkty i wspólną wiadomość.

Combine(pp,I,{σi})\mathsf{Combine}(pp,I,\{\sigma_i\})⟶σ\longrightarrow \sigma
σ=∏i∈Iσiλi\sigma=\prod_{i\in I}\sigma_i^{\lambda_i}

Łącz co najmniej t zaakceptowanych udziałów z właściwymi wagami.

Verify(pp,A,m,σ)\mathsf{Verify}(pp,A,m,\sigma)⟶b\longrightarrow b
b=[e(σ,g2)=e(ℋG1(m),A)]b=[e(\sigma,g_2)=e(\mathcal H_{G_1}(m),A)]
Progowy BLS: interpolacja podpisów: czynności i komunikatyUczestnik iKoordynator / odbiorcaPartialSignCzęść podpisu, nie część sekretuCheckShareCombineVerify

Progowy BLS: interpolacja podpisów

Uczestnik i: pp,I,ai,mpp,I,a_i,m

Koordynator / odbiorca: pp,I,A,(Ai),mpp,I,A,(A_i),m

  1. Uczestnik i, PartialSign: σi=ℋG1(m)ai\sigma_i=\mathcal H_{G_1}(m)^{a_i}
  2. Uczestnik i → Koordynator / odbiorca: (i,σi)(i,\sigma_i) Część podpisu, nie część sekretu
  3. Koordynator / odbiorca, CheckShare: e(σi,g2)=?e(ℋG1(m),Ai)e(\sigma_i,g_2)\stackrel{?}{=}e(\mathcal H_{G_1}(m),A_i)
  4. Koordynator / odbiorca, Combine: σ=∏i∈Iσiλi\sigma=\prod_{i\in I}\sigma_i^{\lambda_i}
  5. Koordynator / odbiorca, Verify: e(σ,g2)=?e(ℋG1(m),A)e(\sigma,g_2)\stackrel{?}{=}e(\mathcal H_{G_1}(m),A)
Wynikiem jest podpis jednego klucza A. To nie to samo co agregacja podpisów niezależnych kluczy.

W zapisie potęgowym uczestnik tworzy σi=ℋG1(m)ai\sigma_i=\mathcal H_{G_1}(m)^{a_i}. Interpolacja w wykładniku daje σ=∏i∈Iσiλi=ℋG1(m)a\sigma=\prod_{i\in I}\sigma_i^{\lambda_i}=\mathcal H_{G_1}(m)^a. Nie odtwarzamy jawnie aa. Odpowiednie obrazy udziałów łączą się w podpis tego samego klucza AA. W zapisie punktowym iloczyn elementów zastępujemy sumą punktów:

Dla wiadomości mm każdy wybrany uczestnik oblicza σi=ai⋅ℋG1(m)\sigma_i=a_i\cdot\mathcal H_{G_1}(m). Sprawdzamy e(σi,P2)=e(ℋG1(m),Ai)e(\sigma_i,P_2)=e(\mathcal H_{G_1}(m),A_i) i składamy:

σ=∑i∈Iλi⋅σi=a⋅ℋG1(m).\sigma=\sum_{i\in I}\lambda_i\cdot\sigma_i =a\cdot\mathcal H_{G_1}(m).

Końcowy podpis odpowiada jednemu kluczowi publicznemu AA. Nie ujawnia sam przez się, który dopuszczalny podzbiór uczestniczył. Wielomian definiuje próg, a pairing weryfikuje udziały i podpis. Własności kompletnego schematu zależą od generowania klucza, walidacji punktów, definicji przeciwnika i założeń BLS. Interpolacja sama nie jest dowodem niepodrabialności. Źródło tej rodziny: Boldyreva, Threshold Signatures, Multisignatures and Blind Signatures Based on the Gap-Diffie-Hellman-Group Signature Scheme.

Powiązania: C13, L7.