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.

W10b. RSA: od arytmetyki do szyfrowania i podpisu

Jedna para odwrotnych operacji nie jest jeszcze dwoma bezpiecznymi schematami. RSA daje publiczne potęgowanie, które łatwo odwrócić posiadaczowi sekretu. Szyfrowanie musi dodatkowo ukrywać wiadomość. Podpis musi wiązać wynik z dokumentem tak, aby przeciwnik nie potrafił stworzyć nowej akceptowanej pary. Dlatego obie funkcjonalności potrzebują innych kodowań.

Setup i KeyGen: wspólna podstawa RSA

Setup przyjmuje 1λ1^\lambda i ustala profil pppp: rozmiar modułu, reguły generowania kluczy, kodowania oraz parametry konkretnego szyfrowania albo podpisu. KeyGen przyjmuje pppp i zwraca parę (pk,sk)(pk,sk). W zapisie podstawowym pk=(N,e)pk=(N,e), a sk=(N,d)sk=(N,d). Implementacja może dodatkowo zachować tajne czynniki i współczynniki CRT. Zaraz wyjaśnimy, skąd biorą się te liczby.

CRT
Chinese Remainder Theorem. Chińskie twierdzenie o resztach.

Dwie kompletne konstrukcje mają odrębne krotki: ΠOAEP=(Setup,KeyGen,Enc,Dec)\Pi_{\mathrm{OAEP}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec}) oraz ΠPSS=(Setup,KeyGen,Sign,Verify)\Pi_{\mathrm{PSS}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Sign},\mathsf{Verify}). Wspólna arytmetyka nie oznacza zalecenia ponownego użycia tego samego klucza w różnych protokołach.

Dlaczego można odwrócić potęgowanie

Zaczynamy od największego wspólnego dzielnika, oznaczanego gcd⁡(a,b)\gcd(a,b). Na przykład gcd⁡(12,18)=6\gcd(12,18)=6. Gdy gcd⁡(e,L)=1\gcd(e,L)=1, rozszerzony algorytm Euklidesa znajduje całkowite d,td,t spełniające e⋅d+L⋅t=1e\cdot d+L\cdot t=1. Zatem dd jest odwrotnością ee modulo LL.

Funkcja Eulera φ(N)\varphi(N) liczy, ile liczb ze zbioru {1,…,N−1}\{1,\ldots,N-1\} jest względnie pierwszych z NN, czyli ma z NN największy wspólny dzielnik równy 1. Na przykład φ(8)=4\varphi(8)=4, bo warunek ten spełniają dokładnie 1,3,5,71,3,5,7. Te klasy reszt tworzą grupę ZN∗\mathbb Z_N^*, więc φ(N)=∣ZN∗∣\varphi(N)=|\mathbb Z_N^*|.

Chińskie twierdzenie o resztach, CRT, mówi tutaj, że para reszt modulo różne liczby pierwsze p,rp,r wyznacza dokładnie jedną resztę modulo p⋅rp\cdot r. Przykładowo liczba równa 2 modulo 3 i 3 modulo 5 to 8 modulo 15. Dlatego późniejsze wykazanie równości modulo oba czynniki wystarczy do równości modulo ich iloczyn.

Wybieramy dwie różne duże nieparzyste liczby pierwsze p,rp,r. Litera rr oznacza tu drugi czynnik modułu, nie losowość protokołu. Dla ich iloczynu mamy:

N=p⋅r,φ(N)=(p−1)⋅(r−1).N=p\cdot r,\qquad \varphi(N)=(p-1)\cdot(r-1).

Skąd ten iloczyn? Odwracalna reszta modulo NN musi być niezerowa zarówno modulo pp, jak i modulo rr. Mamy odpowiednio p−1p-1 i r−1r-1 możliwości. CRT przyporządkowuje każdej takiej parze dokładnie jeden element ZN∗\mathbb Z_N^*.

Wykładnik publiczny ee wybieramy tak, aby 3≤e<N3\le e<N i gcd⁡(e,φ(N))=1\gcd(e,\varphi(N))=1. Następnie obliczamy wykładnik prywatny dd jako dodatnią odwrotność ee modulo φ(N)\varphi(N):

d=e−1modφ(N),e⋅d≡1(modφ(N)).d=e^{-1}\bmod\varphi(N),\qquad e\cdot d\equiv1\pmod{\varphi(N)}.

Zapis e−1e^{-1} oznacza tutaj odwrotność modularną, nie ułamek 1/e1/e. Równoważnie e⋅d=1+k⋅φ(N)e\cdot d=1+k\cdot\varphi(N) dla pewnej liczby całkowitej kk. Klucz publiczny to (N,e)(N,e), a prywatny to (N,d)(N,d). Czynniki p,rp,r i wartość φ(N)\varphi(N) również pozostają tajne. Implementacja może zachować dodatkowe współczynniki CRT. Tutaj ee nie oznacza pairingu.

Dlaczego odzyskujemy wejście? Dla x∈ZN∗x\in\mathbb Z_N^* twierdzenie Eulera daje xφ(N)≡1(modN)x^{\varphi(N)}\equiv1\pmod N. Stąd:

(xe)d=x1+k⋅φ(N)=x⋅(xφ(N))k≡x(modN).(x^e)^d=x^{1+k\cdot\varphi(N)} =x\cdot\bigl(x^{\varphi(N)}\bigr)^k\equiv x\pmod N.

RSA działa także dla reprezentantów x∈{0,…,N−1}x\in\{0,\ldots,N-1\}, które nie należą do ZN∗\mathbb Z_N^*. Nie wolno wtedy bezpośrednio użyć twierdzenia Eulera. Aby uzasadnić odzyskanie xx z y=xemodNy=x^e\bmod N, rozpatrujemy osobno dwa przypadki modulo pp:

  • Jeżeli x=0modpx=0\bmod p, również xe⋅d=0modpx^{e\cdot d}=0\bmod p.
  • W przeciwnym przypadku małe twierdzenie Fermata daje xp−1=1modpx^{p-1}=1\bmod p. Ponieważ p−1p-1 dzieli φ(N)\varphi(N), otrzymujemy xe⋅d=xmodpx^{e\cdot d}=x\bmod p.

Ten sam argument działa modulo rr. CRT daje zatem

(xe)d=x(modN).(x^e)^d=x\pmod N.

To wyjaśnia poprawność także wtedy, gdy xx nie jest odwracalne modulo NN. Natomiast założenie RSA, użyte później w dowodzie FDH, dotyczy znalezienia pierwiastka losowego elementu grupy ZN∗\mathbb Z_N^*. Faktoryzacja wystarcza do odwracania RSA. Ogólnej równoważności tych problemów nie znamy.

Mały rachunek do sprawdzenia: p=61p=61, r=53r=53, N=3233N=3233, φ(N)=60⋅52=3120\varphi(N)=60\cdot52=3120, e=17e=17, d=2753d=2753. Mamy 17⋅2753=46801=1+15⋅312017\cdot2753=46801=1+15\cdot3120. Dla x=65x=65 otrzymujemy y=2790y=2790, a 27902753mod3233=652790^{2753}\bmod3233=65. To liczby do nauki, nie parametry ochrony danych.

Związek z zapisem w standardzie. LCM (least common multiple) to najmniejsza wspólna wielokrotność. W PKCS #1, RFC 8017, §3.2 wystarcza słabszy warunek e⋅d≡1(modλ(N))e\cdot d\equiv1\pmod{\lambda(N)}, gdzie funkcja Carmichaela dla naszego modułu spełnia:

PKCS
Public-Key Cryptography Standards. Seria standardów kryptografii z kluczem publicznym.
λ(N)=lcm⁡(p−1,r−1),λ(N)∣φ(N).\lambda(N)=\operatorname{lcm}(p-1,r-1),\qquad \lambda(N)\mid\varphi(N).

Ostatni symbol oznacza, że λ(N)\lambda(N) dzieli φ(N)\varphi(N). Dlatego wybór dd według funkcji Eulera spełnia także warunek standardu. To nie są jednak te same funkcje ani identyczne warunki na dd. W naszym przykładzie λ(N)=780\lambda(N)=780, a φ(N)=3120\varphi(N)=3120. Wartość d′=413d'=413 spełnia warunek modulo 780780, lecz nie modulo 31203120. Mimo to wykonuje tę samą prywatną operację RSA co 27532753, ponieważ wykładniki różnią się o 3⋅7803\cdot780. Funkcji λ(N)\lambda(N) nie należy też mylić z parametrem bezpieczeństwa λ\lambda w Setup.

Wprowadzenie używa funkcji Eulera, aby bezpośrednio powiązać wybór kluczy z liczbą elementów grupy i twierdzeniem o potęgowaniu. Tę podstawę przedstawia także oryginalna praca Rivesta, Shamira i Adlemana, §§V–VI. Przy korzystaniu z biblioteki obowiązuje jej profil generowania kluczy, nie mały przykład dydaktyczny.

Dlaczego „surowe RSA” nie wystarcza

Szyfrowanie deterministyczne zdradza porównanie. Przeciwnik wybiera dwie wiadomości, sam liczy ich potęgi publicznym kluczem i porównuje wynik z wyzwaniem. Nie musi odwracać żadnej potęgi.

Algebra pozwala zmieniać szyfrogram. Dla c=xemodNc=x^e\bmod N i wybranego a∈ZN∗a\in\mathbb Z_N^*:

c′=c⋅aemodN,(c′)d=x⋅amodN.c'=c\cdot a^e\bmod N,\qquad (c')^d=x\cdot a\bmod N.

To podobna lekcja jak przy ElGamalu: odwracalność rachunku nie oznacza odporności na aktywną modyfikację. „Podpis” σ=xdmodN\sigma=x^d\bmod N bez kodowania również zawodzi. Przeciwnik wybiera σ\sigma, oblicza x=σemodNx=\sigma^e\bmod N i ma akceptowaną parę bez pytania o podpis. Nie wybrał wcześniej treści xx, ale już to łamie podstawowy cel egzystencjalnej niepodrabialności w tak zdefiniowanej domenie wiadomości.

RSA-OAEP

RSA-OAEP
RSA Encryption Scheme with Optimal Asymmetric Encryption Padding. Schemat szyfrowania RSA z kodowaniem OAEP.

Cel: szyfrować krótką wiadomość kluczem publicznym RSA, stosując losowe kodowanie OAEP przed potęgowaniem. Parametry RSA i konwersje bajtów z poprzedniej części pozostają bez zmian. Teraz określamy pełny interfejs szyfrowania, a następnie rozpisujemy wnętrze kodowania i jego kontroli.

OAEP
Optimal Asymmetric Encryption Padding. Kodowanie wiadomości przed szyfrowaniem asymetrycznym.

RSA-OAEP: algorytmy i przepływ

OAEPEncode i OAEPDecode oznaczają procedury kodowania, które rozpisujemy po diagramie. Nie są dodatkowymi założonymi wyroczniami. OS2IP zamienia bajty na liczbę, a I2OSP liczbę na bajty o ustalonej długości k.

Π=(Setup,KeyGen,Enc,Dec)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(profil RSA,kodowania)pp=(\text{profil RSA},\text{kodowania})

Rozmiar modułu i parametry wybranej konstrukcji jak w tym rozdziale.

KeyGen(pp)\mathsf{KeyGen}(pp)⟶((N,e),(N,d))\longrightarrow ((N,e),(N,d))
N=p⋅r,p≠rN=p\cdot r,\quad p\ne r
φ(N)=(p−1)⋅(r−1)\varphi(N)=(p-1)\cdot(r-1)
gcd⁡(e,φ(N))=1\gcd(e,\varphi(N))=1
d=e−1modφ(N)d=e^{-1}\bmod\varphi(N)

Wylosuj różne nieparzyste liczby pierwsze p,r według profilu. Wybierz 3 ≤ e < N. Ten wariant z funkcją Eulera zapewnia poprawność. Związek z warunkiem PKCS #1 wyjaśniamy przy kluczach RSA.

Enc(pp,(N,e),M)\mathsf{Enc}(pp,(N,e),M)⟶C\longrightarrow C
EM←OAEPEncode(M,L)EM\leftarrow\mathsf{OAEPEncode}(M,L)
c=OS2IP⁡(EM)emodNc=\operatorname{OS2IP}(EM)^e\bmod N
C=I2OSP⁡(c,k)C=\operatorname{I2OSP}(c,k)

Kodowanie losuje seed. Sprawdź limit długości M.

Dec(pp,(N,d),C)\mathsf{Dec}(pp,(N,d),C)⟶M albo ⊥\longrightarrow M\text{ albo }\bot
c=OS2IP⁡(C)c=\operatorname{OS2IP}(C)
EM=I2OSP⁡(cdmodN,k)EM=\operatorname{I2OSP}(c^d\bmod N,k)
M=OAEPDecode(EM,L)M=\mathsf{OAEPDecode}(EM,L)

Sprawdź długość, c<N i całe kodowanie. Każdy błąd daje ⊥.

RSA-OAEP: czynności i komunikatyNadawcaOdbiorcaEnc: kodowanie losoweEnc: publiczna operacja RSASzyfrogram bajtowyDec: prywatna operacja RSADec: kontrola i odczyt
Niepoprawne kodowanie: ⊥.

RSA-OAEP

Nadawca: pp,(N,e),Mpp,(N,e),M

Odbiorca: pp,(N,d)pp,(N,d)

  1. Nadawca, Enc: kodowanie losowe: EM←OAEPEncode(M,L)EM\leftarrow\mathsf{OAEPEncode}(M,L)
  2. Nadawca, Enc: publiczna operacja RSA: c=OS2IP⁡(EM)emodNc=\operatorname{OS2IP}(EM)^e\bmod N
  3. Nadawca → Odbiorca: C=I2OSP⁡(c,k)C=\operatorname{I2OSP}(c,k) Szyfrogram bajtowy
  4. Odbiorca, Dec: prywatna operacja RSA: EM=I2OSP⁡(cdmodN,k)EM=\operatorname{I2OSP}(c^d\bmod N,k)
  5. Odbiorca, Dec: kontrola i odczyt: M=OAEPDecode(EM,L)M=\mathsf{OAEPDecode}(EM,L) Niepoprawne kodowanie: ⊥.
RSA odwraca reprezentanta kodowania. Dopiero pełna kontrola OAEP pozwala wydać wiadomość. RFC 8017, §7.1.

Enc: kodowanie i publiczna potęga

Wejście: profil pppp, klucz publiczny (N,e)(N,e) i wiadomość bajtowa MM dopuszczalnej długości. Etykieta LL jest uzgodnionym jawnym parametrem kontekstu, a nie sekretem. Wyjście: szyfrogram CC długości modułu w bajtach. Przekroczenie limitu wejścia oznacza błąd szyfrowania.

RSAES-OAEP szyfruje ciąg bajtów MM, nie dowolnie duży plik jedną potęgą. Niech kk oznacza długość modułu w bajtach, hh długość skrótu, a LL uzgodnioną etykietę kontekstu. Funkcja Hash⁡\operatorname{Hash} poniżej zwraca bajty, nie skalar ani punkt krzywej. MGF1⁡(s,ℓ)\operatorname{MGF1}(s,\ell) rozwija zalążek ss do ℓ\ell bajtów przez haszowanie zalążka z kolejnymi czterobajtowymi licznikami i obcięcie wyniku do zadanej długości.

MGF1
Mask Generation Function. Funkcja generowania maski. MGF1 oznacza konkretną konstrukcję tej funkcji.
  1. Tworzymy DB=Hash⁡(L)∥PS∥01∥M\mathrm{DB}=\operatorname{Hash}(L)\mathbin\Vert\mathrm{PS}\mathbin\Vert\mathtt{01}\mathbin\Vert M. PS\mathrm{PS} jest odpowiednio długim ciągiem zer.
  2. Losujemy niezależny zalążek ss długości hh bajtów.
  3. Maskujemy blok: maskedDB=DB⊕MGF1⁡(s,k−h−1)\mathrm{maskedDB}=\mathrm{DB}\oplus\operatorname{MGF1}(s,k-h-1).
  4. Maskujemy zalążek: maskedSeed=s⊕MGF1⁡(maskedDB,h)\mathrm{maskedSeed}=s\oplus\operatorname{MGF1}(\mathrm{maskedDB},h).
  5. Łączymy EM=00∥maskedSeed∥maskedDB\mathrm{EM}=\mathtt{00}\mathbin\Vert\mathrm{maskedSeed}\mathbin\Vert\mathrm{maskedDB}. Zamieniamy bajty na liczbę, podnosimy do ee modulo NN i zapisujemy wynik w dokładnie kk bajtach.

Dec: prywatna potęga i kontrola kodowania

Wejście: profil pppp, klucz tajny (N,d)(N,d), szyfrogram CC i ta sama uzgodniona etykieta LL. Wyjście: odzyskana wiadomość MM albo ⊥\bot. Sprawdzamy długość i zakres reprezentanta szyfrogramu. Następnie wykonujemy operację prywatną. Zdejmujemy maski w odwrotnej kolejności i kontrolujemy całe kodowanie, w tym skrót etykiety. Błędne kodowanie oznacza odrzucenie. Różne szczegóły błędów i czasy ich obsługi nie powinny tworzyć wyroczni dla napastnika.

Potęgowanie RSA, dwa różne kodowania

Schemat funkcjonalny OAEP i PSS. Szczegóły masek i kontroli formatu są opisane w tekście.

Potęgowanie RSA, dwa różne kodowaniaRSAES-OAEP · poufnośćWiadomość i świeży zalążek
M, L, sM,\ L,\ s
Dwie maski MGF1
EM=00∥maskedSeed∥maskedDB\mathrm{EM}=\mathtt{00}\Vert\mathrm{maskedSeed}\Vert\mathrm{maskedDB}
Operacja publiczna
C=I2OSP⁡(OS2IP⁡(EM)emodN,k)C=\operatorname{I2OSP}(\operatorname{OS2IP}(\mathrm{EM})^e\bmod N,k)
RSASSA-PSS · uwierzytelnienieSkrót wiadomości i świeża sól
Hash⁡(M), salt\operatorname{Hash}(M),\ \mathrm{salt}
Kodowanie EMSA-PSS
EM=maskedDB∥h′∥bc\mathrm{EM}=\mathrm{maskedDB}\Vert h'\Vert\mathtt{bc}
Operacja prywatna
σ=OS2IP⁡(EM)dmodN\sigma=\operatorname{OS2IP}(\mathrm{EM})^d\bmod N

Gotowe do rozpoczęcia.

PSS
Probabilistic Signature Scheme. Probabilistyczny schemat podpisu.
RSASSA-PSS
RSA Signature Scheme with Appendix, with Probabilistic Signature Scheme encoding. Podpis RSA z kodowaniem PSS. Wiadomość towarzyszy podpisowi, a nie jest z niego odzyskiwana.
EMSA-PSS
Encoding Method for Signature with Appendix, Probabilistic Signature Scheme. Metoda kodowania wiadomości dla podpisu PSS.

Ograniczenie długości wynosi ∣M∣≤k−2⋅h−2|M|\le k-2\cdot h-2. Dla modułu 2048-bitowego i SHA-256 to 256−64−2=190256-64-2=190 bajtów. Praktyczna ochrona większych danych używa konstrukcji hybrydowej, np. szyfruje losowy klucz danych, a sam plik chroni AEAD. Dokładny format i kompozycję wybiera się z konkretnego protokołu.

RSA-PSS

Cel: podpisać wiadomość za pomocą RSA i umożliwić publiczne sprawdzenie podpisu. PSS określa kodowanie podpisywanego skrótu z losową solą oraz jego kontrolę. Nie jest szyfrowaniem wiadomości kluczem prywatnym.

RSA-PSS: algorytmy i przepływ

PSSEncode i PSSCheck oznaczają pełne EMSA-PSS z tego rozdziału. eLen to liczba bajtów kodowania, emBits=bitlen(N)−1. Podpis ma k bajtów, gdzie k jest długością modułu.

Π=(Setup,KeyGen,Sign,Verify)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Sign},\mathsf{Verify})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(profil RSA,kodowania)pp=(\text{profil RSA},\text{kodowania})

Rozmiar modułu i parametry wybranej konstrukcji jak w tym rozdziale.

KeyGen(pp)\mathsf{KeyGen}(pp)⟶((N,e),(N,d))\longrightarrow ((N,e),(N,d))
N=p⋅r,p≠rN=p\cdot r,\quad p\ne r
φ(N)=(p−1)⋅(r−1)\varphi(N)=(p-1)\cdot(r-1)
gcd⁡(e,φ(N))=1\gcd(e,\varphi(N))=1
d=e−1modφ(N)d=e^{-1}\bmod\varphi(N)

Wylosuj różne nieparzyste liczby pierwsze p,r według profilu. Wybierz 3 ≤ e < N. Ten wariant z funkcją Eulera zapewnia poprawność. Związek z warunkiem PKCS #1 wyjaśniamy przy kluczach RSA.

Sign(pp,(N,d),M)\mathsf{Sign}(pp,(N,d),M)⟶σ\longrightarrow \sigma
EM←PSSEncode(M,emBits)EM\leftarrow\mathsf{PSSEncode}(M,emBits)
s=OS2IP⁡(EM)dmodNs=\operatorname{OS2IP}(EM)^d\bmod N
σ=I2OSP⁡(s,k)\sigma=\operatorname{I2OSP}(s,k)

Profil określa hasz, MGF1 i długość soli.

Verify(pp,(N,e),M,σ)\mathsf{Verify}(pp,(N,e),M,\sigma)⟶b∈{0,1}\longrightarrow b\in\{0,1\}
s=OS2IP⁡(σ)s=\operatorname{OS2IP}(\sigma)
EM=I2OSP⁡(semodN,eLen)EM=\operatorname{I2OSP}(s^e\bmod N,eLen)
b=PSSCheck(M,EM,emBits)b=\mathsf{PSSCheck}(M,EM,emBits)

Błędna długość, zakres lub kodowanie daje 0, także gdy konwersja do eLen bajtów jest niemożliwa.

RSA-PSS: czynności i komunikatyPodpisującyWeryfikatorSign: kodowanie z soląSign: prywatna operacja RSAWiadomość i podpisVerify: publiczna operacja RSAVerify: zgodność z wiadomością

RSA-PSS

Podpisujący: pp,(N,d),Mpp,(N,d),M

Weryfikator: pp,(N,e)pp,(N,e)

  1. Podpisujący, Sign: kodowanie z solą: EM←PSSEncode(M,emBits)EM\leftarrow\mathsf{PSSEncode}(M,emBits)
  2. Podpisujący, Sign: prywatna operacja RSA: s=OS2IP⁡(EM)dmodNs=\operatorname{OS2IP}(EM)^d\bmod N
  3. Podpisujący → Weryfikator: (M,σ)(M,\sigma) Wiadomość i podpis
  4. Weryfikator, Verify: publiczna operacja RSA: EM=I2OSP⁡(semodN,eLen)EM=\operatorname{I2OSP}(s^e\bmod N,eLen)
  5. Weryfikator, Verify: zgodność z wiadomością: PSSCheck(M,EM,emBits)=?1\mathsf{PSSCheck}(M,EM,emBits)\stackrel{?}{=}1
Sprawdzamy podpis pod znanym M. Nie nazywamy tej czynności odszyfrowywaniem wiadomości. RFC 8017, §8.1.

Sign: kodowanie i prywatna potęga

Wejście: profil pppp, klucz tajny (N,d)(N,d) i wiadomość MM. Profil określa hasz, MGF1 i długość soli. Wyjście: podpis σ\sigma, zapisany w dokładnie tylu bajtach co moduł. Wiadomości nie szyfrujemy.

W RSASSA-PSS wiadomość pozostaje dostępna weryfikatorowi. Celem jest jej uwierzytelnienie, nie ukrycie. Najpierw liczymy skrót hM=Hash⁡(M)h_M=\operatorname{Hash}(M) i losujemy sól. Następnie:

h′=Hash⁡(008∥hM∥salt).h'=\operatorname{Hash}(\mathtt{00}^{8}\mathbin\Vert h_M\mathbin\Vert\mathrm{salt}).

Zapis 008\mathtt{00}^{8} oznacza osiem zerowych bajtów. Budujemy blok zer, separator 01\mathtt{01} i sól. Maskujemy ten blok przez MGF1 wywołaną na h′h'. Zerujemy wymagane najwyższe bity i dołączamy h′h' oraz końcowy bajt bc\mathtt{bc}. Kodowanie używa bitlen⁡(N)−1\operatorname{bitlen}(N)-1 bitów. Jego reprezentanta podnosimy do dd modulo NN.

Verify: kontrola zgodności z wiadomością

Wejście: profil pppp, klucz publiczny (N,e)(N,e), wiadomość MM i podpis σ\sigma. Wyjście: 1 albo 0. Weryfikator sprawdza długość i zakres podpisu, podnosi jego reprezentanta do ee, sprawdza format, odzyskuje sól i przelicza zależność z wiadomością. Zwraca 1 wyłącznie po przejściu wszystkich kontroli. Nie „odszyfrowuje podpisanego dokumentu”. Dwa podpisy tej samej wiadomości zwykle się różnią dzięki soli. Różne wyniki nie oznaczają różnych kluczy.

Dwa szyfrowania, dwa podpisy, ta sama wiadomość

Rzeczywiste WebCrypto. Osobne klucze RSA 2048 do OAEP i PSS, e = 65537, SHA-256, sól PSS 32 bajty. Klucze testowe pozostają lokalne.

RSA-OAEP · szyfrogramy

Pierwsze szyfrowanieoczekuje
Drugie szyfrowanieoczekuje
Odczytoczekuje

RSA-PSS · podpisy

Pierwszy podpisoczekuje
Drugi podpisoczekuje
Długość wiadomości w bajtachoczekuje

Gotowe do rozpoczęcia.

Pełne wartości przebiegu
Jeszcze nie wykonano obliczeń.

Co należy do standardu, a co do implementacji

Element Rola Czego nie wolno utożsamiać
RSAEP / RSADP Publiczna i prywatna operacja potęgowania Z kompletnym szyfrowaniem
RSAES-OAEP Losowe kodowanie i szyfrowanie Z podpisem PSS
RSASSA-PSS Kodowanie wiadomości i podpis Z szyfrowaniem dokumentu
PKCS #1 v1.5 Osobne starsze kodowania szyfrowania i podpisu Słabość jednego nie jest automatycznie atakiem na drugie
RSA-FDH Schemat podpisu i przejrzysta redukcja w ROM Ze standardowym formatem PSS
RSAEP
RSA Encryption Primitive. Podstawowa operacja szyfrująca RSA.
RSADP
RSA Decryption Primitive. Podstawowa operacja deszyfrująca RSA.

Podstawowym dokumentem mechanizmów jest PKCS #1 v2.2, RFC 8017, §§3–9. Jest to uzgodniona specyfikacja opublikowana jako RFC kategorii Informational. Dobór parametrów, kodowania kluczy i dozwolonych algorytmów należy dodatkowo do profilu wdrożenia. Nie przenosimy dawnych domyślnych parametrów dokumentu do nowej aplikacji bez sprawdzenia.

Obliczenia prywatne zwykle przyspiesza CRT. Dla wejścia yy liczymy ydmod(p−1)modpy^{d\bmod(p-1)}\bmod p i ydmod(r−1)modry^{d\bmod(r-1)}\bmod r, a potem składamy wynik. Implementacja musi chronić się przed kanałami bocznymi i błędami obliczeń. Blinding losowo przekształca wejście przed tajną operacją i usuwa maskę po niej. Samo użycie CRT nie daje tych zabezpieczeń.

RSA może podpisywać transkrypt w TLS 1.3, ale TLS 1.3 nie stosuje starej wymiany klucza przez szyfrowanie RSA. To przykład, dlaczego nazwa algorytmu nie określa jeszcze jego roli. Zobacz RFC 8446, §§1.2 i 4.2.3. Wymagania dla generowania kluczy i podpisów RSA oraz ECDSA opisuje także FIPS 186-5. RSA nie jest postkwantowe. Zwiększenie modułu nie zastępuje migracji do innej rodziny problemów, omawianej w W15.

TLS
Transport Layer Security. Protokół ochrony komunikacji, zapewniający m.in. poufność i integralność.
ECDSA
Elliptic Curve Digital Signature Algorithm. Algorytm podpisu cyfrowego na krzywych eliptycznych.

Powiązania: dowód RSA-FDH, C17, L12.

W10c. RSA-FDH: sfałszowany podpis rozwiązuje trudne zadanie

W dowodzie Schnorra potrzebujemy dwóch odpowiedzi i odejmowania równań. W RSA-FDH jeden właściwie umieszczony podpis może już być rozwiązaniem instancji RSA. Trudność polega na przygotowaniu symulacji, która nie zna klucza prywatnego, a mimo to odpowiada na legalne żądania podpisów.

RSA-FDH: algorytmy i cel przeciwnika

Jest to schemat ΠFDH=(Setup,KeyGen,Sign,Verify)\Pi_{\mathrm{FDH}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Sign},\mathsf{Verify}). Setup ustala profil RSA oraz regułę haszowania do pełnej domeny właściwego modułu. KeyGen tworzy pk=(N,e)pk=(N,e) oraz sk=(N,d)sk=(N,d) zgodnie z opisem kluczy RSA. Dopiero dla tego NN określona jest docelowa grupa hasza. Sign przyjmuje pppp, sksk i wiadomość mm, a zwraca σ∈ZN∗\sigma\in\mathbb Z_N^*. Verify przyjmuje pppp, pkpk, mm i σ\sigma, a zwraca 1 albo 0. Szczegóły haszowania odróżniają ten schemat od PSS.

RSA-FDH: algorytmy i przepływ

Dla danego N funkcja ℋ_FDH ma pełną domenę wyjściową ℤ*_N. Setup ustala sposób jej definiowania dla modułu powstałego w KeyGen.

Π=(Setup,KeyGen,Sign,Verify)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Sign},\mathsf{Verify})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(profil RSA,kodowania)pp=(\text{profil RSA},\text{kodowania})

Rozmiar modułu i parametry wybranej konstrukcji jak w tym rozdziale.

KeyGen(pp)\mathsf{KeyGen}(pp)⟶((N,e),(N,d))\longrightarrow ((N,e),(N,d))
N=p⋅r,p≠rN=p\cdot r,\quad p\ne r
φ(N)=(p−1)⋅(r−1)\varphi(N)=(p-1)\cdot(r-1)
gcd⁡(e,φ(N))=1\gcd(e,\varphi(N))=1
d=e−1modφ(N)d=e^{-1}\bmod\varphi(N)

Wylosuj różne nieparzyste liczby pierwsze p,r według profilu. Wybierz 3 ≤ e < N. Ten wariant z funkcją Eulera zapewnia poprawność. Związek z warunkiem PKCS #1 wyjaśniamy przy kluczach RSA.

Sign(pp,(N,d),m)\mathsf{Sign}(pp,(N,d),m)⟶σ\longrightarrow \sigma
h=ℋFDH(m)h=\mathcal H_{\mathrm{FDH}}(m)
σ=hdmodN\sigma=h^d\bmod N
Verify(pp,(N,e),m,σ)\mathsf{Verify}(pp,(N,e),m,\sigma)⟶b∈{0,1}\longrightarrow b\in\{0,1\}
h=ℋFDH(m)h=\mathcal H_{\mathrm{FDH}}(m)
b=[σe=hmodN]b=[\sigma^e=h\bmod N]

Sprawdź zakres i przynależność podpisu do grupy RSA.

RSA-FDH: czynności i komunikatyPodpisującyWeryfikatorSign: pełna domena RSAPodpis FDHVerify

RSA-FDH

Podpisujący: pp,(N,d),mpp,(N,d),m

Weryfikator: pp,(N,e)pp,(N,e)

  1. Podpisujący, Sign: pełna domena RSA: h=ℋFDH(m)∈ZN∗h=\mathcal H_{\mathrm{FDH}}(m)\in\mathbb Z_N^* σ=hdmodN\sigma=h^d\bmod N
  2. Podpisujący → Weryfikator: (m,σ)(m,\sigma) Podpis FDH
  3. Weryfikator, Verify: σe=?ℋFDH(m)(modN)\sigma^e\stackrel{?}{=}\mathcal H_{\mathrm{FDH}}(m)\pmod N
To rzeczywisty interfejs schematu. Odwrócona kolejność generowania podpisu i hasza pojawia się dopiero w symulatorze dowodu, nie w Sign.

Używamy klucza RSA (N,e)(N,e) z poprzedniego rozdziału. Oznaczenie ℋFDH\mathcal H_{\mathrm{FDH}} dotyczy osobnej wyroczni o pełnej domenie wyjściowej RSA:

ℋFDH:{0,1}∗⟶ZN∗,σ=ℋFDH(m)dmodN.\mathcal H_{\mathrm{FDH}}:\{0,1\}^*\longrightarrow\mathbb Z_N^*, \qquad \sigma=\mathcal H_{\mathrm{FDH}}(m)^d\bmod N.

Weryfikacja wymaga reprezentanta 0≤σ<N0\le\sigma<N i równości σe=ℋFDH(m)modN\sigma^e=\mathcal H_{\mathrm{FDH}}(m)\bmod N. Indeks FDH odróżnia tę funkcję od ℋ\mathcal H do Zq\mathbb Z_q i ℋG1\mathcal H_{G_1} do grupy krzywej. Sam krótki SHA-256 zamieniony na liczbę nie jest losowaniem z pełnej grupy ZN∗\mathbb Z_N^*.

W eksperymencie EUF-CMA przeciwnik A\mathcal A dostaje klucz publiczny. Może adaptacyjnie pytać wyrocznię losową i wyrocznię podpisującą. Wygrywa, jeżeli zwróci akceptowaną parę (m∗,σ∗)(m^*,\sigma^*), przy czym m∗m^* nigdy nie było pytaniem do wyroczni podpisującej. Samo wcześniejsze zapytanie o hasz m∗m^* jest dozwolone. Nie wymagamy, aby przeciwnik odzyskał dd.

Symulator wybiera miejsce trudności przed uruchomieniem ataku

Algorytm redukcji B\mathcal B dostaje (N,e,Y)(N,e,Y), gdzie YY jest losowe w ZN∗\mathbb Z_N^*. Jego celem jest znaleźć zz takie, że ze=YmodNz^e=Y\bmod N. Nie zna dd, pp ani rr.

Niech qHq_H ogranicza liczbę zapytań przeciwnika o hasz, a qSq_S liczbę żądań podpisu. Ustawiamy Q=qH+qS+1Q=q_H+q_S+1. Dodatkowa jedynka pozwala utworzyć wpis podczas końcowej weryfikacji, nawet jeśli przeciwnik nie pytał wcześniej o hasz sfałszowanej wiadomości. Redukcja losuje JJ jednostajnie z {1,…,Q}\{1,\ldots,Q\} przed uruchomieniem A\mathcal A. Pozycje liczą różne wiadomości w tabeli, a nie powtórzenia zapytań.

Zapytanie Co robi redukcja Dlaczego odpowiedź pasuje
Ponowny hasz wiadomości Zwraca zapisany wynik Jedna funkcja daje ten sam wynik
Nowy wpis poza pozycją JJ Losuje um←$ZN∗u_m\overset{\$}{\leftarrow}\mathbb Z_N^* i zapisuje (m,ume,um)(m,u_m^e,u_m) Potęgowanie przez ee jest permutacją grupy
Nowy wpis na pozycji JJ Zapisuje (m,Y,⊥)(m,Y,\bot) YY ma właściwy rozkład, ale jego pierwiastek jest nieznany
Podpis poza pozycją JJ Tworzy wpis, jeśli potrzeba, i zwraca umu_m ume=ℋFDH(m)u_m^e=\mathcal H_{\mathrm{FDH}}(m)
Podpis na pozycji JJ Przerywa symulację Uczciwa odpowiedź rozwiązywałaby instancję RSA

Symbol ⊥\bot oznacza brak znanego pierwiastka. Programowanie wyroczni nie daje przeciwnikowi prawa do zmiany hasza. Jest narzędziem redukcji w idealizowanym modelu. Zwykła implementacja nie może przestawiać SHA-256 na życzenie.

Jedna prywatna tabela, dwa publiczne interfejsy

Redukcja przechowuje dla każdej wiadomości parę T[m]=(hm,um)T[m]=(h_m,u_m). Pierwsza składowa jest odpowiedzią na zapytanie o hasz. Druga jest znanym podpisem, jeżeli redukcja potrafi go przygotować. Obie wyrocznie najpierw sprawdzają tę samą tabelę. Nie prowadzą niezależnych losowań dla tej samej wiadomości.

Przy zwykłym nowym wpisie redukcja zaczyna od jednostajnego um∈ZN∗u_m\in\mathbb Z_N^*. To będzie podpis. Następnie wylicza hm=umemodNh_m=u_m^e\bmod N i zapisuje obie wartości. Jeżeli przyszło zapytanie o hasz, zwraca tylko hmh_m. Jeżeli przyszło żądanie podpisu, zwraca tylko umu_m. Kolejne zapytanie drugiego rodzaju korzysta z już gotowej pary. Nie modyfikuje wcześniej ujawnionego hasza.

  1. Najpierw Hash: powstaje para (hm,um)(h_m,u_m), ale przeciwnik otrzymuje tylko hasz. Potencjalny podpis pozostaje prywatny do żądania Sign.
  2. Najpierw Sign: powstaje ta sama para, przeciwnik otrzymuje podpis, a przyszła odpowiedź Hash jest już ustalona. Przeciwnik może również sam obliczyć publiczne umeu_m^e.
  3. Powtórzone pytanie: odczyt z tabeli bez ponownego losowania. FDH jest tutaj deterministycznym schematem podpisu, inaczej niż PSS ze świeżą solą.
  4. Wyjątkowy wpis JJ: zamiast znanego podpisu zapisujemy (Y,⊥)(Y,\bot). Hash może zwrócić YY, ale Sign tego wpisu musi przerwać symulację.

Tabela oraz informacja o pozycji JJ są wewnętrznym stanem redukcji, nie komunikatem protokołu. Nie dostaje ich ani przeciwnik, ani rzeczywisty podpisujący. W symulacji redukcja zastępuje usługę podpisującą, zamiast prosić ją o użycie nieznanego klucza. Podgląd całej tabeli na rysunku służy wyłącznie studentowi. Wyciekanie tego stanu nie jest dozwolonym zapytaniem w rozpatrywanym eksperymencie.

RSA-FDH · jedna tabela, dwa interfejsy

Model dydaktyczny RSA: N=3233, e=17, J=2N=3233,\ e=17,\ J=2. Drugi różny wpis osadza wyzwanie. Hash i Sign korzystają z tej samej tabeli. Nie jest to implementacja produkcyjnego podpisu.

Interfejs
Prywatny stan redukcji B · bez klucza dPrzeciwnik
A\mathcal A
zapytania i wynikiCzy wpis istnieje?
m∈dom⁡(T)?m\in\operatorname{dom}(T)?
TAK · odczytaj wpis
(h,u)←T[m](h,u)\leftarrow T[m]
NIE · wylosuj podpis
u←$ZN∗u\overset{\$}{\leftarrow}\mathbb Z_N^*
Oblicz hasz z podpisu
h←uemodNh\leftarrow u^e\bmod N
Zapisz raz w tabeli
T[m]←(h,u)T[m]\leftarrow(h,u)
Zwróć tylko odpowiedź
Hash:hSign:u\mathsf{Hash}:h\quad\mathsf{Sign}:u
mm
h lub uh\ \text{lub}\ u
Wyjątek J: wpisz Y zamiast losować podpis. Pierwiastek nieznany.
  1. Sprawdzenie
  2. Losowanie
  3. Publiczne potęgowanie
  4. Zapis
  5. Odczyt
  6. Odpowiedź

Tabela jest pusta. Żadne zapytanie nie zostało wysłane.

Roboczy stan wewnętrznyBrak.

Prywatna tabela redukcji

Widoczna tylko w objaśnieniu. Uczciwy podpisujący w rzeczywistym schemacie jej nie otrzymuje. Redukcja zastępuje jego interfejs.

mmhhuu

Widok przeciwnika

Historia dostarczonych odpowiedzi. Wewnętrzne losowanie i tworzenie wpisu nie są osobnymi komunikatami.

ZapytanieOdpowiedź

Odwrócona kolejność obliczeń, identyczny rozkład pary

Dla zwykłego wpisu porównajmy dwa sposoby przygotowania pary hasz–podpis. Uczciwy schemat wybiera losowy hasz i oblicza jego prywatny pierwiastek. Symulator losuje pierwiastek i stosuje publiczne potęgowanie. Zmienił się kierunek przygotowania pary, nie jej rozkład.

Ta sama para hasz–podpis, dwie kolejności przygotowania
Uczciwy schemat · zna klucz prywatnySymulator · zna tylko klucz publiczny
hm←$ZN∗h_m\overset{\$}{\leftarrow}\mathbb Z_N^*
um←$ZN∗u_m\overset{\$}{\leftarrow}\mathbb Z_N^*
um←hmdmodNu_m\leftarrow h_m^d\bmod N
hm←umemodNh_m\leftarrow u_m^e\bmod N
W obu przypadkach tabela przechowuje tę samą zależność między haszem a podpisem.

Niech φ(N)=∣ZN∗∣\varphi(N)=|\mathbb Z_N^*|. Dla dowolnych a,b∈ZN∗a,b\in\mathbb Z_N^* oba sposoby dają

Pr⁡[(hm,um)=(a,b)]={1/φ(N),a=bemodN,0,a≠bemodN.\Pr[(h_m,u_m)=(a,b)] = \begin{cases} 1/\varphi(N),&a=b^e\bmod N,\\ 0,&a\ne b^e\bmod N. \end{cases}

Wynika to z bijektywności potęgowania RSA. Każdy hasz ma dokładnie jeden pierwiastek w tej grupie. Nie wystarczyłaby jednostajność samych haszy, gdyby podpisy nie były z nimi odpowiednio skorelowane. Tutaj zgadza się cały rozkład pary. Tabela zachowuje go także przy obu kolejnościach zapytań i ich powtórzeniach.

Przeciwnik nie obserwuje kolejności wewnętrznych obliczeń ani prywatnych losowań. W tym modelu nie dostaje też ich pomiarów czasowych. Z samych dostarczanych wartości nie może wykryć zamiany dla zwykłych wpisów. Jest to równość rozkładów, mocniejsza niż jedynie obliczeniowa nierozróżnialność. Cała redukcja może jednak przerwać na Sign wpisu JJ. Nie twierdzimy, że symulator zawsze odpowie na wszystko. Do przerwania zachowuje zgodny widok, a zdarzenie trafienia świeżej fałszywej wiadomości opisujemy osobno poniżej.

RSA-FDH · redukcja z pamięcią wyroczni

Mały moduł 3233. Symulator zna tylko N, e, Y. Poprawne fałszerstwo dostarcza scenariusz dydaktyczny, nie rzeczywisty atak na RSA. Cel J = 2 jest tu ustalony do ilustracji.

Przypadek
RSA-FDH · redukcja z pamięcią wyroczniInstancja RSAznajdź pierwiastekRedukcja Bbez d i faktoryzacjiPrzeciwnik Ainterfejsy H i Sign
(N,e,Y)(N,e,Y)
(N,e)klucz publiczny(N,e)\quad\text{klucz publiczny}
ℋFDH(m1), Sign(m1)\mathcal H_{\mathrm{FDH}}(m_1),\ \mathsf{Sign}(m_1)
u1emodN, u1u_1^e\bmod N,\ u_1
ℋFDH(m2)\mathcal H_{\mathrm{FDH}}(m_2)
Ybez znanego pierwiastkaY\quad\text{bez znanego pierwiastka}
(m∗,σ∗)lub z˙ądanie podpisu(m^*,\sigma^*)\quad\text{lub żądanie podpisu}
z=σ∗jesˊli trafionoz=\sigma^*\quad\text{jeśli trafiono}
Prywatna tabela redukcji · przeciwnik widzi tylko odpowiedzi na swoje zapytania
NrWiadomośćHaszZnany pierwiastek
Tabela oczekuje na zapytania.
Wyzwanie Yoczekuje
Wynik redukcjioczekuje

Gotowe do rozpoczęcia.

Pełne wartości przebiegu
Jeszcze nie wykonano obliczeń.

Rozkład odpowiedzi, świeżość i sukces

  1. Zgodność rozkładu. Dla zwykłego wpisu umu_m jest jednostajne, a potęgowanie jest bijekcją. Wynik umeu_m^e jest więc jednostajny w tej samej grupie co YY. Tabela zachowuje spójność odpowiedzi i podpisów.
  2. Właściwe trafienie. Rozpatrzmy zdarzenie, że A\mathcal A tworzy poprawne fałszerstwo i JJ jest pozycją m∗m^*. Świeżość m∗m^* oznacza, że redukcja nigdy nie musiała podpisywać tego wpisu. Nie przerwała więc symulacji z tego powodu.
  3. Ekstrakcja bez cofania. Poprawność fałszerstwa daje (σ∗)e=YmodN(\sigma^*)^e=Y\bmod N. Redukcja zwraca po prostu z=σ∗z=\sigma^*.

Jeżeli prawdopodobieństwo udanego fałszerstwa wynosi ϵ\epsilon, ten prosty argument daje

Pr⁡[B odwraca RSA] ≥ ϵqH+qS+1.\Pr[\mathcal B\text{ odwraca RSA}]\ \ge\ \frac{\epsilon}{q_H+q_S+1}.

Można formalnie sprzęgnąć prawdziwy eksperyment z symulacją dla każdego wyboru JJ. Do chwili ewentualnego przerwania widoki mają ten sam rozkład. Dla każdego udanego świeżego fałszerstwa dokładnie jeden z QQ wyborów wskazuje jego wpis i nie wymusza przerwania. Nieużyte pozycje oznaczają nietrafione losowania, nie pozwalają wybierać JJ po zobaczeniu wyniku.

Czas redukcji obejmuje czas przeciwnika, obsługę tabeli, losowanie odwracalnych reszt i najwyżej QQ publicznych potęgowań. Wyraźny czynnik QQ jest stratą redukcji. Nie jest atakiem o koszcie QQ ani optymalną granicą dla FDH. Ważny jest tu kompletny argument bazowy, nie deklaracja ciasności.

Algorytm redukcji: jeden wybór celu, jedna wspólna tabela

Poniższy zapis zbiera cały dowód w jeden wykonywalny logicznie algorytm. Redukcja zna wyłącznie (N,e,Y)(N,e,Y) i swoje losowania. Nie wylicza pierwiastka YY przed otrzymaniem fałszerstwa. Wiersze tabeli numerujemy w chwili pierwszego pojawienia się nowej wiadomości, niezależnie od rodzaju zapytania.

Inicjalizacja:
    Q = q_H + q_S + 1
    J = jednostajna pozycja od 1 do Q
    T = pusta tabela, Signed = pusty zbiór

Ensure(m):
    jeżeli m jest w T, zwróć T[m]
    i = liczba wierszy T + 1
    jeżeli i = J, wpisz T[m] = (i, Y, brak pierwiastka)
    w przeciwnym razie:
        wylosuj jednostajne u z odwracalnych reszt modulo N
        wpisz T[m] = (i, u^e mod N, u)
    zwróć T[m]

Hash(m):
    (i, h, u) = Ensure(m)
    zwróć h

Sign(m):
    (i, h, u) = Ensure(m)
    dodaj m do Signed
    jeżeli i = J, przerwij całą próbę redukcji
    zwróć u

Po otrzymaniu (m*, sigma*):
    odrzuć, jeśli m* jest w Signed lub sigma* ma zły zakres
    (i, h, u) = Ensure(m*)
    odrzuć, jeśli (sigma*)^e mod N != h lub i != J
    zwróć sigma* jako pierwiastek RSA dla Y

Dlaczego zgadywanie ma koszt dokładnie Q, a nie jeszcze jeden iloczyn strat?

Wyobraźmy sobie pomocniczy uczciwy eksperyment, w którym znamy także prywatny klucz RSA. Możemy w nim obsłużyć wszystkie zapytania i dopiero do analizy dołożyć niezależny losowy indeks JJ. Każdy wiersz ma ten sam jednostajny rozkład hasza. W wybranym wierszu można ten hasz utożsamić z jednostajnym wyzwaniem YY. To sprzężenie rozkładów, nie polecenie wyboru YY przez rzeczywistą redukcję.

Niech I∗I^* będzie indeksem wiadomości poprawnego świeżego fałszerstwa w tym eksperymencie. Dla każdego udanego przebiegu jest dokładnie jedna dobra pozycja J=I∗J=I^* spośród QQ. Nieużyte pozycje nadal są możliwymi nietrafionymi wyborami. Z niezależności pomocniczego JJ:

Pr⁡[Forge∧J=I∗]=∑i=1QPr⁡[Forge∧I∗=i]⋅1Q=ϵQ.\Pr[\mathrm{Forge}\land J=I^*] =\sum_{i=1}^{Q}\Pr[\mathrm{Forge}\land I^*=i]\cdot\frac1Q =\frac{\epsilon}{Q}.

Na tym zdarzeniu wiadomość celu nie wystąpiła w Sign, bo fałszerstwo jest świeże. Rzeczywista redukcja nie potrzebuje więc nieznanego pierwiastka do żadnej wcześniejszej odpowiedzi. Może wykonać cały ten przebieg. Otrzymany podpis spełnia (σ∗)e=Y(\sigma^*)^e=Y i jest rozwiązaniem zadania.

Nie mnożymy dodatkowo przez prawdopodobieństwo „nie było przerwania”. Na dobrym zdarzeniu brak takiego przerwania już wynika ze świeżości. To najważniejsze powiązanie definicji EUF-CMA z rachunkiem redukcji. Na pozostałych zdarzeniach redukcja może przerwać albo nie trafić celu.

Różnica względem forking lemma

RSA-FDH nie potrzebuje dwóch transkryptów. Trudna instancja znajduje się w jednym wyniku hasza. Przeciwnik zwraca jej pierwiastek jako podpis. W Schnorrze trudna instancja jest w kluczu publicznym, a rozwiązanie wydobywamy dopiero z dwóch zgodnych równań z różnymi wyzwaniami.

Schemat Co redukcja umieszcza i gdzie Co musi uzyskać
RSA-FDH YY w jednym odgadniętym wierszu Hash Jeden świeży podpis tej wiadomości
Schnorr A=gaA=g^a w kluczu publicznym Dwa podpisy ze wspólnym zobowiązaniem i różnym wyzwaniem
Okamoto g2=g1αg_2=g_1^\alpha w relacji generatorów Reprezentację klucza inną od zapamiętanej
Herranz–Sáez Ai=AαiA_i=A^{\alpha_i} we wszystkich kluczach pierścienia Dwa podpisy z tym samym wektorem zobowiązań i jedną zmienioną odpowiedzią Hash

W ostatnim wierszu „odpowiedź Hash” oznacza wyzwanie cjc_j, a nie skalarną odpowiedź podpisu zz. Szczegóły tych trzech redukcji rozwijamy w części o pełnych dowodach.

Co dokładnie cytujemy

Bellare i Rogaway, The Exact Security of Digital Signatures: How to Sign with RSA and Rabin, EUROCRYPT 1996, analizują FDH oraz konstruują PSS. Powyżej pokazaliśmy dydaktyczny wariant zgadywania wpisu, z jawnym doliczeniem zapytania końcowego. Nie jest to dowód bezpieczeństwa całego PKCS #1 ani powód, by zastępować PSS własnym kodowaniem. Późniejsze ulepszenia redukcji FDH nie zmieniają tej różnicy między schematem, modelem i konkretną granicą.

Sprawdź rozumienie: dlaczego zwrócenie losowego elementu grupy zamiast umeu_m^e utrudniłoby podpisywanie? Dlaczego trafienie wpisu podpisanej wiadomości nie daje dozwolonego fałszerstwa? Dlaczego nie używamy tu forking lemma? Zadania i warianty przerwania: C17 i L12.