Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

Hej Habr!

В den första delen I den hĂ€r artikeln diskuterade vi varför det kan vara nödvĂ€ndigt att generera slumptal för deltagare som inte litar pĂ„ varandra, vilka krav som stĂ€lls för sĂ„dana slumptalsgeneratorer och övervĂ€gde tvĂ„ metoder för deras implementering.

I den hÀr delen av artikeln ska vi titta nÀrmare pÄ en annan metod som anvÀnder tröskelsignaturer.

Lite kryptografi

För att förstÄ hur tröskelsignaturer fungerar behöver du förstÄ lite grundlÀggande kryptografi. Vi kommer att anvÀnda tvÄ begrepp: skalÀrer, eller helt enkelt siffror, som vi kommer att beteckna med gemener (x, y) och punkter pÄ den elliptiska kurvan, vilka vi kommer att beteckna med versaler.

För att förstÄ grunderna i tröskelsignaturer behöver du inte förstÄ hur elliptiska kurvor fungerar, förutom nÄgra grundlÀggande saker:

  1. Punkter pÄ en elliptisk kurva kan adderas och multipliceras med en skalÀr (vi betecknar multiplikation med en skalÀr som xG, Àven om notationen Gx (anvÀnds ocksÄ ofta i litteraturen). Resultatet av addition och multiplikation med en skalÀr Àr en punkt pÄ en elliptisk kurva.

  2. Vet bara poÀngen G och dess produkt med en skalÀr xG kan inte berÀknas x.

Vi kommer ocksÄ att anvÀnda polynombegreppet p(x) grader k-1. Vi kommer sÀrskilt att anvÀnda följande polynomegenskap: om vi kÀnner till vÀrdet p(x) för vilken som helst k annorlunda x (och vi har ingen ytterligare information om p(x)), kan vi berÀkna p(x) för alla andra x.

Det Àr intressant att för vilket polynom som helst p(x) och nÄgon punkt pÄ kurvan G, medveten om betydelsen p(x)G för vilken som helst k olika betydelser x, kan du ocksÄ berÀkna p(x)G för vilken som helst x.

Denna information rÀcker för att grÀva i detaljerna om hur tröskelsignaturer fungerar och hur man anvÀnder dem för att generera slumptal.

Slumptalsgenerator för tröskelsignaturer

LÄt oss anta att n deltagarna vill generera ett slumptal, och vi vill att alla ska delta k av dem var tillrÀckliga för att generera ett antal, men sÄ att angriparna som kontrollerar k-1 eller fÀrre deltagare kunde inte förutsÀga eller pÄverka det genererade talet.

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

LÄt oss anta att det finns ett sÄdant polynom p(x) grader k-1, vad den första deltagaren vet p(1), den andra vet p(2), och sÄ vidare (n-th vet p(n)). LÄt oss ocksÄ anta att för nÄgon förutbestÀmd punkt G alla vet p(x)G för alla vÀrden x. Vi kommer att ringa pi) "privat komponent" i-te deltagaren (eftersom endast i-e deltagaren kÀnner henne), och gris "offentlig komponent" i-e deltagaren (eftersom alla deltagare kÀnner henne). Som du minns, kunskap gris inte tillrÀckligt för att ÄterstÀlla pi).

Att skapa ett sÄdant polynom sÄ att endast i-den:e deltagaren och ingen annan kÀnde till hans privata komponent - detta Àr den mest komplexa och intressanta delen av protokollet, och vi kommer att analysera den nedan. LÄt oss för tillfÀllet anta att vi har ett sÄdant polynom, och alla deltagare kÀnner till sina privata komponenter.

Hur kan vi anvĂ€nda ett sĂ„dant polynom för att generera ett slumptal? Först behöver vi en strĂ€ng som inte har anvĂ€nts som indata till generatorn tidigare. NĂ€r det gĂ€ller en blockkedja, hashen för det sista blocket h — Ă€r en bra kandidat för en sĂ„dan linje. LĂ„t deltagarna vilja generera ett slumptal med hjĂ€lp av h som frö. Först konverterar deltagarna h till en punkt pĂ„ kurvan med hjĂ€lp av en fördefinierad funktion:

H = skalÀrTillPunkt(h)

Sedan varje deltagare i berÀknar och publicerar Hi = p(i)H, vad de kan göra eftersom de vet p(i) och H. Avslöjande Hi tillÄter inte andra deltagare att ÄterstÀlla den privata komponenten i-te deltagaren, och dÀrför kan en uppsÀttning privata komponenter anvÀndas frÄn block till block. SÄledes behöver den dyra polynomgenereringsalgoritmen som beskrivs nedan bara utföras en gÄng.

NĂ€r k deltagarna exponerades Hi = p(i)H, alla kan lista ut det Hx = p(x)H för alla x tack vare polynomegenskapen som vi diskuterade i föregĂ„ende avsnitt. Vid denna tidpunkt berĂ€knar alla deltagare H0 = p(0)H, och detta Ă€r det resulterande slumpmĂ€ssiga talet. Observera att ingen vet p(0), och dĂ€rför det enda sĂ€ttet att rĂ€kna p(0)H – detta Ă€r en interpolering p(x)H, vilket bara Ă€r möjligt nĂ€r k vĂ€rden p(i)H Ă€r kĂ€nda. Öppning av mindre kvantiteter p(i)H ger ingen information om p(0)H.

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

Generatorn ovan har alla egenskaper vi vill ha: angripare som endast kontrollerar k-1 eller fÀrre deltagare har ingen information eller inflytande pÄ resultatet, medan alla k deltagarna kan berÀkna det resulterande talet och vilken delmÀngd som helst av k Deltagarna kommer alltid att komma fram till samma resultat för samma frö.

Det finns ett problem som vi noggrant undvek ovan. För att interpolering ska fungera Àr det viktigt att vÀrdet Hi som publicerades av varje deltagare i det var verkligen jÀmnt p(i)H. Eftersom ingen annan i-deltagaren vet inte pi), ingen annan Àn i-deltagaren kan inte verifiera att Hi den berÀknades faktiskt korrekt, och utan kryptografiskt bevis pÄ korrektheten Hen angripare kan publicera vilket vÀrde som helst som Hej, och godtyckligt pÄverka utdata frÄn slumptalsgeneratorn:

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2Olika vĂ€rden pĂ„ H_1 som skickas av den första deltagaren leder till olika resulterande H_0

Det finns minst tvÄ sÀtt att bevisa riktigheten Hi, vi kommer att betrakta dem efter att vi har analyserat polynomets generering.

Polynomgenerering

I förra avsnittet antog vi att vi har ett sÄdant polynom p(x) grader k-1 vilken deltagare i vet pi), och ingen annan har nÄgon information om denna betydelse. I nÀsta avsnitt behöver vi ocksÄ det för en förutbestÀmd punkt G alla visste p(x)G för alla x.

I det hÀr avsnittet antar vi att varje deltagare har en privat nyckel lokalt. xi, sÄ att alla kÀnner till motsvarande publika nyckel Xi.

Ett möjligt protokoll för polynomgenerering Àr följande:

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

  1. Varje deltagare i skapar lokalt ett godtyckligt polynom pi(x) av graden k-1. Sedan skickar de den till varje deltagare j betyder pi(j), krypterad med den publika nyckeln Xj. SĂ„ bara i-th Đž j-th deltagaren vet pi(j). Deltagare i tillkĂ€nnager Ă€ven offentligt pi(j)G för alla j frĂ„n 1 ĐŽĐŸ k inkluderande.

  2. Alla deltagare anvÀnder nÄgon form av konsensus för att vÀlja k deltagare vars polynom kommer att anvÀndas. Eftersom vissa deltagare kan vara offline kan vi inte vÀnta tills alla n Deltagarna kommer att publicera polynom. Resultatet av detta steg Àr en uppsÀttning Z bestÄende av minst k polynom skapade i steg (1).

  3. Deltagarna Àr övertygade om att de vÀrderingar de kÀnner till pi(j) motsvarar offentligt tillkÀnnagivna pi(j)G. Efter detta steg i Z endast polynom för vilka privat överförda pi(j) motsvarar offentligt tillkÀnnagivna pi(j)G.

  4. Varje deltagare j berĂ€knar dess privata komponent p(j) som en summa pi(j) för alla i ĐČ Z. Varje deltagare berĂ€knar ocksĂ„ alla vĂ€rden p(x)G som en summa pi(x)G för alla i ĐČ Z.

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

Observera att p(x) – detta Ă€r verkligen ett gradpolynom k-1, eftersom det Ă€r summan av individen pi(x), som vart och ett Ă€r ett polynom av grad k-1. LĂ€gg sedan mĂ€rke till att medan varje deltagare j vet p(j), de har ingen information om p(x) för x ≠ j. För att berĂ€kna detta vĂ€rde behöver de faktiskt veta allt pi(x), och medan deltagaren j kĂ€nner inte till minst ett av de valda polynomen, har de inte tillrĂ€cklig information om p(x).

Detta Àr hela processen för att generera polynomet som behövdes i förra avsnittet. Steg 1, 2 och 4 ovan har en ganska uppenbar implementering. Men steg 3 Àr inte sÄ trivialt.

Mer specifikt behöver vi kunna bevisa att krypterad pi(j) motsvarar de publicerade pi(j)G. Om vi ​​inte kan bevisa det, angriparen i kan skicka skrĂ€p istĂ€llet pi(j) deltagare joch deltagare j kommer inte att kunna förstĂ„ den verkliga innebörden pi(j), och kommer inte att kunna berĂ€kna dess privata komponent.

Det finns ett kryptografiskt protokoll som lÄter dig skapa ett ytterligare meddelande bevisi(j), sÄ att varje deltagare, som har nÄgot vÀrde e, samt bevis(j) О pi(j)G, kan lokalt verifiera att e - det Àr verkligen pi(j), krypterad med deltagarens nyckel j. TyvÀrr Àr omfattningen av sÄdana bevis otroligt stor, och med tanke pÄ att de behöver publiceras O (nk) sÄdan bevisning kan inte anvÀndas för detta ÀndamÄl.

IstÀllet för att bevisa att pi(j) motsvarar pi(j)G kan vi allokera en mycket stor tidsperiod i polynomgenereringsprotokollet, under vilken alla deltagare kontrollerar den mottagna krypterade pi(j), och om det dekrypterade meddelandet inte matchar det offentliga pi(j)G, de publicerar ett kryptografiskt bevis pÄ att det krypterade meddelandet de mottagit Àr felaktigt. Bevisa att meddelandet ingen motsvarar gris) mycket enklare Àn att bevisa att det stÀmmer överens. Det bör noteras att detta krÀver att varje deltagare dyker upp online minst en gÄng under den avsatta tiden för att skapa sÄdana bevis, och bygger pÄ antagandet att om de publicerar ett sÄdant bevis kommer det att nÄ alla andra deltagare inom samma avsatta tid.

Är det möjligt att generera slumptal om vi inte litar pĂ„ varandra? Del 2

Om en deltagare inte dök upp online under denna tidsperiod, och faktiskt hade minst en felaktig komponent, kommer just denna deltagare inte att kunna delta i ytterligare nummergenerering. Protokollet kommer dock fortfarande att fungera om det finns minst k deltagare som antingen precis fÄtt rÀtt komponenter eller lyckades lÀmna bevis pÄ felaktigheter inom den tilldelade tiden.

Bevis pÄ riktigheten av H_i

Den sista delen som ÄterstÄr att diskutera Àr hur man bevisar riktigheten av det publicerade Hjag, nÀmligen att Hi = p(i)H, utan öppning pi).

LÄt oss komma ihÄg att vÀrderingarna H, G, p(i)G offentlig och kÀnd för alla. Mottagningsoperation pi) menande gris О G kallas diskret logaritm, eller dlog, och vi vill bevisa att:

dlog(p(i)G, G) = dlog(Hi, H)

utan avslöjande pi). Konstruktioner för sÄdana bevis finns, till exempel Schnorr-protokollet.

Med denna design, varje deltagare tillsammans med Hi skickar ett bevis pÄ korrekthet enligt konstruktionen.

NÀr ett slumptal vÀl har genererats behöver det ofta anvÀndas av andra deltagare Àn de som genererade det. SÄdana deltagare mÄste skicka all information tillsammans med numret. Hi och stödjande bevis.

En nyfiken lĂ€sare kanske frĂ„gar: eftersom det slutliga slumptalet Ă€r H0, och p(0)G – Detta Ă€r offentlig information, varför behöver vi bevis för varje individ? Hjag, varför inte skicka bevis istĂ€llet för att

dlog(p(0)G, G) = dlog(H0, H)

Problemet Àr att man inte kan skapa ett sÄdant bevis med Schnorr-protokollet eftersom ingen kÀnner till vÀrdet. p(0), vilket Àr nödvÀndigt för att skapa beviset, och dessutom Àr hela slumptalsgeneratorn baserad pÄ det faktum att ingen kÀnner till detta vÀrde. DÀrför Àr det nödvÀndigt att ha alla vÀrden Hi och deras individuella bevis för att bevisa riktigheten H0.

Om det emellertid fanns nÄgon operation pÄ punkter pÄ elliptiska kurvor som semantiskt liknade multiplikation, skulle beviset för korrekthet H0 det vore trivialt, vi skulle helt enkelt se till att

H0 × G = p(0)G × H

Om den valda kurvan stöder elliptiska kurvpar, sĂ„dana bevis fungerar. I det hĂ€r fallet H0 Ă€r inte bara utdata frĂ„n en slumptalsgenerator som kan verifieras av vilken deltagare som helst som vet G, H Đž p(0)G. H0 Ă€r ocksĂ„ signaturen pĂ„ meddelandet som anvĂ€ndes som frö, vilket bekrĂ€ftar att k Đž n deltagarna undertecknade detta meddelande. SĂ„, om frö – detta Ă€r hashen för ett block i blockkedjeprotokollet, dĂ„ H0 – det Ă€r bĂ„de en multisignatur pĂ„ blocket och ett mycket bra slumptal.

Sammanfattningsvis

Den hÀr artikeln Àr en del av en teknisk bloggserie NEAR. NEAR Àr ett blockkedjeprotokoll och en plattform för att utveckla decentraliserade applikationer med fokus pÄ enkel utveckling och anvÀndarvÀnlighet för slutanvÀndare.

Protokollkoden Àr öppen, vÄr implementering Àr skriven i Rust, den kan hittas hÀr.

Du kan se hur utvecklingen för NEAR ser ut och experimentera i online-IDE hÀr.

Du kan följa alla nyheter pÄ ryska pÄ telegramgrupp och grupp pÄ VKontakte, och pÄ engelska i det officiella Twitter.

Ses snart!

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster