Puncte:1

Falsificarea semnăturii digitale

drapel hu

Înțelegerea mea despre semnăturile digitale este după cum urmează: Alice trimit un mesaj cu o funcție hash criptografică unidirecțională, a cărei ieșire se numește rezumatul mesajului. Apoi criptează rezumatul cu cheia ei privată și apoi îi trimite lui Bob atât mesajul original necriptat/necriptat, cât și versiunea hashing criptată (adică semnătura digitală). Bob folosește aceeași funcție hash pe mesaj și folosește cheia publică a lui Alice pentru a decripta semnătura digitală. Dacă hashurile se potrivesc cu Bob, poate fi sigur că comunică cu Alice.

Nu ar fi posibil ca un hacker să falsifice semnătura lui Alice dacă ar conține cheia ei publică? Nu ar putea să aleagă o semnătură digitală astfel încât, atunci când este decriptată cu cheia publică a lui Alice, să returneze același hash ca și mesajul său fals, deoarece el controlează atât mesajul, cât și semnătura?

Exprimat simbolic: Fie semnătura digitală s, mesajul m, cheia publică a lui Alice să fie pk, funcția de verificare să fie verificare și funcția hash să fie hash.

Hackerul selectează m și s astfel încât hash(m) == verifică(s, pk)

fgrieu avatar
drapel ng
„_Encrypt_ with private key” / „public key to _decrypt_” este o terminologie slabă: criptarea urmărește să facă ceea ce este criptat de neinteligibil de către cine nu deține un secret, iar decriptarea posibilă cu ceva public este împotriva acestui lucru. În semnătură, se _semnează_ cu cheie privată, _verifica_ cu cheie publică, Înțelegerea semnăturii de către întrebare este incorectă. Printre sistemele de semnătură utilizate pe scară largă, multe (EdDSA, ECDSA..) funcționează foarte diferit și niciunul nu funcționează chiar așa. Vă rugăm să [editați](https://crypto.stackexchange.com/posts/99824/edit) întrebarea pentru a oferi sursa acelei (ne)înțelegeri.
fgrieu avatar
drapel ng
Răspundeți la [aceste](https://crypto.stackexchange.com/q/99740/555) [similar](https://crypto.stackexchange.com/q/99307/555) [întrebări](https: //crypto.stackexchange.com/q/3184/555) ajutor?
user216096 avatar
drapel hu
@fgrieu Înțelegerea mea despre semnăturile digitale se bazează pe mai multe surse. Iată un exemplu: https://www.techtarget.com/searchsecurity/definition/digital-signature?amp=1 Pentru a crea o semnătură digitală, software-ul de semnare, cum ar fi un program de e-mail, este utilizat pentru a oferi o singură semnătură. modul hash al datelor electronice care urmează să fie semnate. Un hash este un șir de litere și numere de lungime fixă ​​generat de un algoritm. Cheia privată a creatorului semnăturii digitale este apoi folosită pentru a cripta hash-ul. Hash-ul criptat -- împreună cu alte informații, cum ar fi algoritmul de hashing -- este semnătura digitală.
fgrieu avatar
drapel ng
Sursa pe care o legați prezintă o metodă de a construi un tip de semnătură, dar care nu se potrivește cu modul în care este utilizată semnătura, sau disponibilă prin API-uri/biblioteci standard sau cu câte scheme de semnătură populare funcționează: EdDSA, ECDSA, RSA(SSA)-PSS . Acea sursă folosește o terminologie incorectă. Dă impresia falsă că putem transforma orice criptare cu cheie publică în semnătură. Afirmă o falsitate periculoasă chiar și atunci când reparăm terminologia: „singura modalitate de a decripta/verifica acele date este cu cheia publică a semnatarului” se dovedește a fi greșită pentru sistemul de semnătură pe care îl conturează sursa.
user216096 avatar
drapel hu
@fgrieu Să ne prefacem că am folosit terminologia „corectă” în postarea mea inițială. Mai este posibil scenariul descris?
Puncte:2
drapel ng

TLDR: atacul luat în considerare nu este ușor. Este posibil, sau nu, în funcție de ipoteza neenunțată.


Mai întâi vom reformula întrebarea¹.

Presupunem un sistem de criptare asimetric, similar cu manualul RSA, cu

  • generarea de chei a unei perechi de chei publice/private $(\mathrm{pk},\mathrm{sk})$,
  • criptare $c:=E_\mathrm{pk}(p)$ Unde $p$ este textul simplu, $c$ este textul cifrat
  • decriptarea potrivirii $p:=D_\mathrm{sk}(c)$ care funcționează pentru toți $c$ obtinut ca $E_\mathrm{pk}(p)$
  • Unde $p$ și $c$ sunt dintr-un interval comun $[0,n)$, cu $n$ încorporate în $\mathrm{pk}$ și $\mathrm{sk}$.

Presupunem că acest sistem de criptare este securizat atac de text clar cunoscut.

Ne asumăm un ideal funcția hash $\operatorname{Hash}$ cu ieșire în $[0,h)$, cu $h\le n$ pentru toți $(\mathrm{pk},\mathrm{sk})$ sistemul de criptare generează.

Deducem a semnatura digitala schema unde

  • generarea cheilor este ca în criptare
  • semnătura mesajului $m$ este $s=D_\mathrm{sk}(\operatorname{Hash}(m))$
  • procedura de verificare $\mathrm{Vrfy}_\mathrm{pk}(m,s)$ iesiri Trece dacă $\operatorname{Hash}(m)=E_\mathrm{pk}(s)$, sau Eșuează in caz contrar.

Subliniez că aceasta nu este o modalitate obișnuită de a construi semnătura: nicio schemă de semnătură în uz pe scară largă nu se potrivește destul de², și multe precum DSA, ECDSA, EdDSA sunt foarte diferite.

Întrebarea se întreabă dacă un hacker poate selecta $m$ și $s$ astfel încât $\mathrm{Vrfy}_\mathrm{pk}(m,s)$ ieșire Trece, adică așa încât $\operatorname{Hash}(m)=E_\mathrm{pk}(s)$.


Vești bune: sistemul de semnătură verifică cu succes atunci când mesajul și semnătura sunt nemodificate. Argument: deoarece setul de intrare și ieșire de criptare $E_\mathrm{pk}$ sunt aceleași și există o funcție de decriptare $D_\mathrm{sk}$ care inversează $E_\mathrm{pk}$ pentru toți $p$, ambii $E_\mathrm{pk}$ și $D_\mathrm{sk}$ sunt permutări ale acelui set, una inversă celeilalte. Asa pentru toti $c$ în acel set îl ține $E_\mathrm{pk}(D_\mathrm{sk}(c))=c$. Aplicând aceasta cu $c=\operatorname{Hash}(m)$, care condiția $h\le n$ face posibil pentru toti $m$, înțelegem asta $E_\mathrm{pk}(s)=E_\mathrm{pk}(D_\mathrm{sk}(\operatorname{Hash}(m)))=\operatorname{Hash}(m)$, prin urmare $\mathrm{Vrfy}_\mathrm{pk}(m,s)$ ieșire Trece.

Mai multe vești bune: nu este ușor pentru adversarii posesor de $\mathrm{pk}$ a selecta $m$ și $s$ astfel încât $\operatorname{Hash}(m)=E_\mathrm{pk}(s)$. Nimic simplu nu pare să funcționeze:

  • Când adversarii aleg prima dată arbitrar $m$, și calculați $c=\operatorname{Hash}(m)$, acea $c$ este asemănător aleatoriu, cu excepția faptului că se află în submulțimea inferioară $[0,h)$ de $[0,n)$. Când vor mai încerca să găsească $s$ cu $c=E_\mathrm{pk}(s)$, ei se confruntă, în esență, cu problema decriptării unui text cifrat arbitrar, și asta este greu (se poate dovedi că descifrarea unui text cifrat arbitrar trebuie să fie dificilă în ipoteza KPA pe care am făcut-o despre cifru).
  • Când adversarii aleg prima dată arbitrar $s$ și calculează $E_\mathrm{pk}(e)$, primesc o valoare arbitrară $c$ în $[0,n)$. Nu există asigurare asta $c$ este în raza de acțiune $[0,h)$ (și dacă nu, nu poate fi hash-ul niciunui mesaj $m$). Chiar dacă adversarii pot rezolva acest obstacol alegând $s$ astfel încât $c$ este în raza de acțiune $[0,h)$ (care manual RSA permite, de exemplu, prin realizarea $s=0$ sau $s=1$), o funcție hash ideală este de așa natură încât este greu de găsit din punct de vedere computațional $m$ care hashes la o valoare dată arbitrară $c$ în intervalul de ieșire al hash-ului: aceasta este prima rezistență preimagine a hash-ului.
  • Când adversarii pun mâna pe a $(m,s)$ pereche care trece verificarea, ar putea încerca să găsească $m'$ în afară de $m$ cu $\operatorname{Hash}(m')=\operatorname{Hash}(m)$, care ar asigura că $(m',s)$ trece verificarea. Dar o funcție hash ideală este de așa natură încât este dificil din punct de vedere computațional să faci asta: aceasta este a doua rezistență preimagine a hash-ului.
  • Adversarii ar putea încerca să creeze două mesaje distincte $m$ și $m'$ cu $\operatorname{Hash}(m)=\operatorname{Hash}(m')$, obțineți semnătura $s$ de $m$, și astfel ar fi falsificat altul $(m',s)$ care trece verificarea. Acest lucru este mult mai ușor decât atacurile anterioare (de exemplu, acest lucru este fezabil cu SHA-1 ca $\operatorname{Hash}$, când niciun atac anterior nu este fezabil), dar totuși o funcție hash ideală este de așa natură încât este dificil din punct de vedere computațional să faci asta: aceasta este rezistența la coliziune a hash-ului.

Cele de mai sus nu constituie o dovadă validă de securitate și, mai rău: ar fi dovedit greșit să concluzi că sistemul de semnătură este sigur. În special, cu $h=2^{256}$ (de exemplu, hash-ul este SHA-256) și atunci când sistemul de criptare este manual RSA, acest sistem de semnătură este vulnerabil la o falsificare imaginabilă. Să presupunem un sistem cu cupoane $m$ a formei
A Cupon în valoare de 123.456,78 USD, referință 4C0D5F62CAF6AF32
Să presupunem că semnatarul verifică că a propus $m$ este un cupon bine formatat, că referința sa este unică, primește plata prețului indicat, iar în aceste condiții semnează $m$. The Desmedt și Odlyzko atacă lăsați adversarii să joace acest sistem, cumpărând semnături de cupoane cu valoare redusă și folosind aceste semnături pentru a găsi semnătura unui cupon de valoare mare.

Vești mai bune: cu unele ipoteze adăugate este posibil dovedi că acest sistem de semnătură este sigur. O ipoteză care funcționează pentru RSA este aceea $h$ are aproape tot atâtea biți ca $n$. Acest sistem de semnătură este cunoscut ca Hash de domeniu complet. Dovada este grea, atât de mult încât atunci când FDH a fost luat în considerare pentru prima dată de Mihir Bellare și Peter Rogaway: Securitatea exactă a semnăturilor digitale - Cum să semnați cu RSA și Rabin, în procedurile Eurocrypt 1996, nu au putut dovedi un nivel de securitate satisfăcător (și au conceput un sistem de semnătură mai complex: RSA-PSS, baza pe scară largă RSASSA-PSS). Un nivel de securitate mai bun a fost obținut ani mai târziu de Jean-Sébastien Coron: Despre securitatea exactă a hashului de domeniu complet, în procedurile Crypto 2000 (dar semnătura RSA se stabilizase deja și FDH nu este utilizat pe scară largă).


¹ Principalele diferențe cu formularea întrebării:

  • Semnăm cu decriptarea, nu cu criptarea, deoarece criptarea cu cheia privată și posibilitatea de a decripta cu cheia publică contrazice scopul criptării. De asemenea, nu funcționează în practică, inclusiv cu RSA așa cum este implementat, chiar dacă eliminăm pașii de completare: formatul cheii publice este $(n,e)$ adesea cu o limită de mărime pt $e$, formatul cheii private este $(n,e,d,p,q,d_p,d_q,q_\text{inv})$și încercarea de a împinge cheia publică acolo unde este așteptată cheia privată, sau invers, va eșua.
  • Specificăm un set finit de text cifrat de aceeași dimensiune ca și setul de text simplu, prin urmare criptarea deterministă, altfel generarea sau verificarea semnăturii ar eșua uneori în condiții normale de utilizare.
  • Facem din mesaj o intrare a procedurii de verificare, pentru că așa este definită semnătura în teorie și implementări practice moderne.

² RSASSA-PKCS1-v1_5 este singurul pe care îl știu care se apropie, oricum ar fi $\operatorname{Hash}$ este construit prin concatenarea unui prefix în funcție de dimensiunea biților a $n$ și $H(m)$, Unde $H$ este un hash standard, cum ar fi SHA-256, deci $\operatorname{Hash}$ nu este o funcție hash ideală, deoarece este de așteptat să apară aleatoriu pe domeniul său de ieșire.

Puncte:0
drapel in

În general, nu. În primul rând, trebuie remarcat faptul că majoritatea semnăturilor digitale nu pot fi considerate hash, apoi criptează cu o cheie privată. Criptarea nu poate fi efectuată cu o cheie privată, deoarece oricine are cheia publică ar putea decripta și, de obicei, aceasta este toată lumea. Deci nu oferă confidențialitate.

În sistemul RSA, generarea semnăturii este similară cu criptarea, deoarece exponențiarea modulară cu o cheie (modul și exponent) este inversul operațiunii modulare față de exponențiarea cu cealaltă cheie.Cu toate acestea, în practică, modurile de umplutură RSA - OAEP vs PSS sau PKCS#1 v15 pentru criptare sau generare de semnătură - diferă. Alte scheme de semnătură, cum ar fi ECDSA, nu au o asemănare similară cu o schemă de criptare.

Dar chiar dacă am folosi RSA cu o schemă de umplutură pentru criptare, atunci logica dvs. nu s-ar aplica și de aceea scriu acest răspuns. Acest lucru se datorează faptului că cu criptarea asimetrică directă există o opțiune care nu este prezentă, de ex. blocați criptarea cifrului: decriptarea unui text cifrat poate eșua. Pentru RSA, acest lucru se datorează faptului că unpadding-ul poate eșua, indiferent dacă este o operație de verificare sau decriptare. Deci nu, Bob din schema ta nu poate alege pur și simplu niciunul $s$ în acest caz, și evident că nu o poate obține efectuând el însuși generarea semnăturii, deoarece nu deține cheia privată.

Acest lucru este desigur logic: Bob nu ar trebui să poată genera semnături falsificate. Acesta este scopul unei scheme de semnătură asimetrică.

user216096 avatar
drapel hu
N-am să mint, cea mai mare parte a răspunsului tău a trecut peste capul meu. Îmi puteți recomanda orice material de lectură pentru a-mi înțelege mai bine subiectul, astfel încât să înțeleg mai bine răspunsul dvs.?
Maarten Bodewes avatar
drapel in
Este posibil să citiți specificațiile PKCS#1 ar fi o idee bună; puteți vedea cum este generată semnătura, este descrisă destul de bine.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.