Ești la bar și ai o discuție lejeră despre opțiunile de anonimitate cu câțiva clienți. Domnul de lângă tine pariază pe sistemul PrivateSend de la dash. Alt tip vrea să îți vândă monero. Barmanul este fan ethereum și nu îi pasă de anonimitate. Spune că ”o să se implementeze la un moment dat și asta, nu mai e mult până atunci”. Între mixere, semnături ring și master nodes, te întrebi cu voce tare dacă nu cumva există unelte mai bune să-ți asiguri datele și…discreția financiară.
În capătul celălalt al barului, un tip slab, cu părul rar, se uită la voi și pare că vrea să intre în discuție. Observi și-i zâmbești. Tipul se întinde spre tine, și îți șuieră în ureche – ”zero-knowledge proofs”. Dovadă zero-cuniștințe (să zicem că ar fi varianta în română).
Zero-knowledge proof este un subiect incomod. În mare parte, este incomod pentru că îi face pe oameni să se simtă idioți. Și criptografii și dezvoltatorii au probleme cu subiectul ăsta. În rândurile următoare, vom încerca să facem o descriere cât mai simplă a unui concept avansat.
Vreau să-i avertizez întâi pe cititori. O să sacrific forma în favoarea conținutului. Dacă vedeți că sunt repetitivă, că 4 propoziții la rând încep cu același subiect și că dau câte 3-4 sinonime la același verb, unul după altul, acceptați situația. Este un subiect și așa dificil și lucrurile trebuiesc clarificate la fiecare pas.
Analogia
Imaginează-ți că te abordează pe stradă un om pe care nu l-ai mai văzut niciodată, de care nu ai auzit, un străin oarecare. Îți spune că o cunoaște pe mama ta. Îți mai spune că mama ta e în spital și că trebuie să urci repede în mașina lui și să te ducă la spitalul de urgențe. Ce faci? Îți faci griji în legătură cu mama ta, dar în mod normal ar trebui să fii și destul de suspicios.
Trebuie să verifici dacă individul este de încredere. Așa că începi să îi pui întrebări la care ar trebui să poată să-ți răspundă, dacă spune că îți cunoaște famlia.
Dacă pui întrebări bune, protocolul pe care tocmai l-ai inventat este un exemplu de zero-knowledge proof. Tu, cel care verifică, te asiguri că străinul, sau cel care trebuie să facă dovada, o cunoaște pe mama ta. Faci acest lucru interactiv. Pui întrebări pentru care nu avea cum să se pregătească decât dacă spune adevărul și chiar o cunoaște pe mama ta.
Asta e tot. Avem două părți – verificatorul (tu) și cel care trebuie să facă dovada (individul care te-a abordat pe stradă, necunoscutul). Acesta trebuie să convingă verificatorul că are o informație secretă, adică o informație pe care nu are cum să o certifice. Chiar dacă nu are un document care să ateste că o cunoaște pe mama ta, asta nu înseamnă neapărat că nu o cunoaște. Așadar, trebuie să demonstreze că o cunoaște, fără să dea informația direct verificatorului.
Întrebare-răspuns
Un exemplu bun de zero-knowledge proof ar fi un protocol criptografic de tip întrebare-răspuns.
Prietenul tău, Ferdinand, dă un mesaj pe Twitter și spune că tocmai a mâncat o pizza la pizzeria din colț. Tu știi foarte bine că Ferdinand nu mănâncă de obicei pizza. Te gândești că i-a fost spart contul, așa că îi trimiți un mesaj privat și îi ceri să cripteze mesajul ”da, chiar am mâncat o pizza întreagă” cu parola lui privată. Dacă textul cifrat pe care îl trimite poate să fie decriptat cu cheia publică, știi că are acces la contul de Twitter.
În exemplul de mai sus, este important să reținem că tu, verificatorul, ești cel care alege mesajul pe care cel care trebuie să facă dovada îl va cripta. Dacă cel care face dovada alege mesajul, iar contul lui Ferdinand a fost compromis, atunci atacatorul poate să folosească orice mesaj din trecut pe care Ferdinand l-a criptat cu parola privată la care are acces. De exemplu, să zicem că în trecut Ferdinand a criptat mesajul ”Îmi place acest restaurant”, iar atacatorul are acces și la textul cifrat și la textul original. Atacatorul, fiind responsabil să își dovedească autenticitatea, poate să folosească acel mesaj mai vechi și să îl convingă pe verificator. Acest tip de atac se numește atac replay, adică un atac care se bazează pe o repetiție a unul mesaj mai vechi.
Așadar, atâta timp cât Ferdinand nu a mai criptat în trecut acel mesaj, nu ai nici o problemă. În practică, ar trebui să incluzi de asemenea un nonce (un număr aleatoriu în mesaj), pentru a te asigura că este unic – sau și mai bine, să folosești un algoritm de semnare, care face acest proces în locul tău, mai degrabă decât să folosești criptarea asimetrică.
Pentru că…
Majoritatea dovezilor zero-knowledge lucrează în același fel. Îi cer verificatorului să-l interogheze într-un fel sau altul pe cel care trebuie să facă dovada. De exemplu, trebuie să dovedească faptul că are acces la un fișier. Poate pur și simplu să publice un hash al fișierului. Verificatorul poate să fie convins că acesta are acces la fișier pentru că altfel nu are cum să aibă hash-ul. Probabilitatea să ”ghicești” un hash exact este de ordinul a miliarde și miliarde de încercări. Nu ar fi o soluție viabilă, pentru că ar putea să dureze sute de ani.
Trebuie însă să înțelegem că metoda zero-knowledge proof nu ”rezolvă” anonimitatea. În schimb, reprezintă unul din ingredientele unui sistem de păstrare a anonimității. Alte tipuri de zero-knowledge proofs pot să vină cu funcționalități diferite la aceste sisteme.
Autor – Matt Luongo