Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

Ehi Habr!

В a prima parte In questu articulu, avemu discututu perchè puderia esse necessariu di generà numeri aleatorii per i participanti chì ùn anu micca fiducia l'un l'altru, chì esigenze sò presentate per tali generatori di numeri aleatorii, è cunzidiratu dui approcci à a so implementazione.

In questa parte di l'articulu, avemu da piglià un sguardu più vicinu à un altru approcciu chì usa signatures di soglia.

Un pocu di criptografia

Per capiscenu cumu si travaglianu e so signatures, avete bisognu di capisce un pocu di criptografia basica. Adupremu dui cuncetti: scalari, o simpricimenti numeri, chì denoteremu cù lettere minuscule (x, y) è punti nantu à a curva ellittica, chì denoteremu cù lettere maiuscule.

Per capiscenu i principii di e signatures di u limitu, ùn avete micca bisognu di capiscenu cumu travaglianu e curve ellittiche, fora di uni pochi di cose basi:

  1. I punti nantu à una curva ellittica ponu esse aghjuntu è multiplicati per un scalare (denuteremu a multiplicazione per un scalare cum'è xG, anche se a notazione Gx ancu spessu usatu in a literatura). U risultatu di l'addizione è a multiplicazione per un scalare hè un puntu nantu à una curva ellittica.

  2. Sapendu solu u puntu G è u so pruduttu cù un scalare xG ùn pò esse calculatu x.

Avemu ancu aduprà u cuncettu di un polinomiu p(x) gradi k-1. In particulare, avemu aduprà a seguente pruprietà di i polinomii : s'è no cunnosci u valore p(x) per ogni k differente x (è ùn avemu micca più infurmazione nantu à p(x)), pudemu calculà p(x) per qualcunu altru x.

Hè interessante chì per ogni polinomiu p(x) è qualchì puntu nantu à a curva Gsapendu u significatu p(x)G per ogni k significati diffirenti x, pudemu ancu calculà p(x)G per ogni x.

Questa hè abbastanza infurmazione per scavà in i dettagli di cumu funzionanu e signature di u sogliu è cumu l'utilizanu per generà numeri aleatorii.

Generatore di numeri aleatorii nantu à e firme di soglia

Dicemu chì n i participanti volenu generà un numeru aleatoriu, è vulemu chì qualcunu participà k ci era abbastanza di elli per generà un numeru, ma cusì chì l'attaccanti chì cuntrullanu k-1 o menu participanti ùn puderanu micca predichendu o influenzà u numeru generatu.

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

Suppone chì ci hè un tali polinomiu p(x) gradi k-1 ciò chì u primu participante sapi p (1), u sicondu sà p (2), eccetera (n- sà p(n)). Assumimu ancu chì per qualchì puntu predeterminatu G tutti sà p(x)G per tutti i valori x. Chjameremu p(i) "componente privatu" iu participante (perchè solu iu participante a cunnosci), è p(i)G "componente publicu" i-th participante (perchè tutti i participanti a cunnosci). Comu vi ricordate, a cunniscenza p(i)G micca abbastanza per restaurà p(i).

Crià un tali polinomiu cusì solu i-U primu participante è nimu hà cunnisciutu u so cumpunente privatu - questu hè a parte più cumplessa è interessante di u protokollu, è l'analizaremu quì sottu. Per avà, supponemu chì avemu un tali polinomiu è tutti i participanti cunnoscenu i so cumpunenti privati.

Cumu pudemu usà un tali polinomiu per generà un numeru aleatoriu? Per principià, avemu bisognu di una corda chì ùn hè micca stata utilizata prima cum'è input à u generatore. In u casu di una blockchain, l'hash di l'ultimu bloccu h hè un bonu candidatu per una tale linea. Chì i participanti volenu creà un numeru aleatoriu usendu h cum'è a sumente. I participanti cunvertisce prima h à un puntu nantu à a curva cù qualsiasi funzione predefinita:

H = scalareToPoint(h)

Allora ogni participante i calcula è publica Hi = p(i)H, chì ponu fà perchè sanu p(i) è H. Divulgazione HÙn permette micca à l'altri participanti di restaurà u cumpunente privatu ith participante, è dunque un inseme di cumpunenti privati ​​pò esse usatu da u bloccu à u bloccu. Cusì, l'algoritmu di generazione polinomiale caru descrittu quì sottu solu deve esse eseguitu una volta.

Quandu k i participanti sò stati autopsiati Hi = p(i)H, ognunu pò calculà Hx = p(x)H per tutti x grazia à a pruprietà di i polinomi chì avemu discututu in l'ultima rùbbrica. À questu mumentu, tutti i participanti calculanu H0 = p(0)H, è questu hè u numeru aleatoriu risultatu. Per piacè nutate chì nimu ùn sà p (0), è dunque l'unicu modu per calculà p (0) H - questu hè l'interpolazione p(x)H, chì hè pussibule solu quandu k valori p(i)H cunnisciutu. Apertura di ogni quantità più chjuca p(i)H ùn furnisce micca infurmazione circa p(0)H.

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

U generatore di sopra hà tutte e proprietà chì vulemu: l'attaccanti cuntrullà solu k-1 participanti o menu ùn anu micca infurmazione o influenza nantu à a cunclusione, mentre chì qualsiasi k i participanti ponu calculà u numeru risultatu, è ogni subset di k i participanti venenu sempre à u listessu risultatu per a listessa sumente.

Ci hè un prublema chì avemu evitatu cù cura sopra. Per l'interpolazione per travaglià, hè impurtante chì u valore Hi chì hè statu publicatu da ogni participante i era veramente u listessu p(i)H. Dapoi nimu eccettu i-esimu participante ùn cunnosci micca p(i), nimu eccettu i-U participante ùn pò micca verificà questu Hi veramente calculatu currettamente, è senza alcuna prova criptografica di correttezza Hi un attaccante pò pubblicà ogni valore cum'è Salute, è influenza arbitrariamente l'output di u generatore di numeri aleatorii:

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2Diversi valori di H_1 mandati da u primu participante portanu à diversi risultati H_0

Ci hè almenu duie manere di pruvà a correzione Hi, avemu da cunsiderà dopu avè analizatu a generazione di u polinomiu.

Generazione polinomiale

In l'ultima rùbbrica avemu presumitu chì avemu un tali polinomiu p(x) gradi k-1 chì u participant ip(i), è nimu altru hà alcuna infurmazione nantu à stu valore. In a prossima seccione avemu ancu bisognu di quellu per qualchì puntu predeterminatu G tutti sapianu p(x)G per tutti x.

In questa sezione assumeremu chì ogni participante in u locu hà una chjave privata xi, tali chì ognunu cunnosce a chjave publica currispundente Xi.

Un pussibili protocolu di generazione polinomiale hè u seguitu:

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

  1. Ogni participante i lucale crea un polinomiu arbitrariu pi(x) gradi k-1. Allora mandanu ogni participante j valore pi(j), criptatu cù chjave publica Xj. Cusì solu i-th и j-th i participanti cunnoscenu pi (j). Participante i annuncia ancu publicamente pi(j)G per tutti j от 1 à k cumpresu.

  2. Tutti i participanti utilizanu qualchì cunsensu per sceglie k participanti chì i so polinomi seranu utilizati. Siccomu alcuni participanti ponu esse offline, ùn pudemu micca aspittà finu à chì tutti n i participanti publicheranu polinomi. U risultatu di stu passu hè un set Z custituitu da almenu k polinomi creati in u passu (1).

  3. I participanti assicuranu chì i valori cunnosci pi(j) currisponde à annunciatu publicamente pi(j)G. Dopu stu passu in Z solu polinomii per i quali trasmessi in privatu pi(j) currisponde à annunciatu publicamente pi(j)G.

  4. Ogni participante j calcula u so cumpunente privatu p(j) cum'è una somma pi (j) per tutti i в Z. Ogni participante calcula ancu tutti i valori p(x)G cum'è una somma pi(x)G per tutti i в Z.

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

nutate chì p (x) - hè veramente un polinomiu k-1, perchè hè a somma di l'individuu pi(x), ognunu di quali hè un polinomiu di gradu k-1. Allora, nutate chì mentri ogni participant jp(j), ùn anu micca infurmazione p(x) di x ≠ j. Infatti, per calculà stu valore, anu bisognu di sapè tuttu pi (x), è finu à u participante j ùn cunnosci micca almenu unu di i polinomii selezziunati, ùn anu micca abbastanza infurmazione p(x).

Questu hè tuttu u prucessu di generazione polinomiale chì era necessariu in l'ultima sezione. I Passi 1, 2 è 4 sopra anu una implementazione abbastanza ovvia. Ma u passu 3 ùn hè micca cusì trivial.

In particulare, ci vole à esse capace di pruvà chì cifri pi(j) currisponde veramente à quelli publicati pi(j)G. Se ùn pudemu micca pruvà, l'attaccante i pò mandà a basura invece pi(j) à u participante j, è participante j ùn serà micca capaci di ottene u valore veru pi(j), è ùn puderà calculà u so cumpunente privatu.

Ci hè un protocolu criptograficu chì permette di creà un missaghju supplementu a provai(j), tali chì ogni participante, avè qualchì valore e, а также prova (j) и pi(j)G, pò verificà localmente chì e - hè veramente pi(j), criptatu cù a chjave di u participant j. Sfurtunatamente, a dimensione di tali evidenza hè incredibbilmente grande, è datu chì hè necessariu di publicà O (nk) Tali evidenza ùn pò esse usata per questu scopu.

Invece di pruvà chì pi(j) соответствует pi(j)G pudemu attribuisce un periudu assai longu di tempu in u protokollu di generazione polinomiale, durante u quale tutti i participanti verificanu u criptu ricivutu. pi(j), è se u messagiu decrypted ùn currisponde micca à u publicu pi(j)G, pubblicanu una prova criptografica chì u messagiu criptu chì anu ricevutu hè sbagliatu. Pruvate chì u messagiu ùn соответствует pi (G) assai più faciule ch'è di pruvà chì currisponde. Hè da nutà chì questu richiede chì ogni participante apparisce in linea almenu una volta durante u tempu attribuitu per creà tali evidenza, è si basa nantu à l'assunzione chì, se publicanu una tale prova, ghjunghjerà à tutti l'altri participanti in u stessu tempu attribuitu.

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 2

Se un participante ùn hè micca apparsu in ligna durante stu periodu di tempu, è hà avutu almenu un cumpunente incorrectu, allora quellu participante particulari ùn puderà participà à più generazione di numeri. U protokollu, in ogni modu, sempre funziona s'ellu ci hè almenu k i participanti chì anu ricevutu solu i cumpunenti curretti o anu sappiutu di lascià a prova di incorrezzione in u tempu attribuitu.

Prove di currettu di H_i

L'ultima parte chì resta à discutiri hè cumu per pruvà a correttezza di u publicatu Hi, vale à dì chì Hi = p(i)H, senza apertura p(i).

Ricordemu chì i valori H, G, p(i)G publicu è cunnisciutu da tutti. Riceve u funziunamentu p(i) sapendu p(i)G и G chjamatu logaritmu discretu, o dlog, è vulemu pruvà chì:

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

senza divulgazione p(i). Custruzzioni per tali prove esistenu, per esempiu Protocolu Schnorr.

Cù stu disignu, ogni participante, cù Hi manda una prova di correttezza secondu u disignu.

Una volta chì un numeru aleatoriu hè generatu, spessu deve esse utilizatu da i participanti altru da quelli chì l'anu generatu. Tali participanti, cù u numeru, deve mandà tutti Hi è evidenza correlata.

Un lettore curiosu pò dumandà: postu chì u numeru aleatoriu finali hè H0, è p(0)G - Questa hè infurmazione publica, perchè avemu bisognu di prova per ogni individuu Hi, perchè ùn mandà micca a prova chì invece

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

U prublema hè chì una tale prova ùn pò micca esse creata cù u Protocolu Schnorr perchè nimu ùn cunnosce u valore p (0), necessariu per creà a prova, è di più, tuttu u generatore di numeri aleatorii hè basatu annantu à u fattu chì nimu cunnosci stu valore. Per quessa, hè necessariu avè tutti i valori Hi è a so evidenza individuale per pruvà a correttezza H0.

Tuttavia, s'ellu ci era una certa operazione nantu à i punti nantu à curve ellittiche chì hè semanticamente simili à a multiplicazione, a prova di currettu H0 saria triviale, avemu da assicurà chì

H0 × G = p(0)G × H

Se a curva scelta sustene accoppiamenti di curve ellittiche, sta prova travaglia. In stu casu H0 ùn hè micca solu l'output di un generatore di numeri aleatorii, chì pò esse verificatu da ogni participante chì sà G, H и p(0)G. H0 hè ancu una firma nantu à u missaghju chì hè stata utilizata cum'è una sumente, cunfirmendu chì k и n i participanti firmavanu stu missaghju. Cusì, se seme - hè l'hash di u bloccu in u protocolu blockchain, allora H0 hè à tempu una multi-firma nantu à un bloccu è un numeru aleatoriu assai bonu.

In cunclusioni

Questu articulu face parte di una serie di blog tecnicu PRIMERA. NEAR hè un protokollu blockchain è una piattaforma per u sviluppu di applicazioni decentralizate cù un enfasi in a facilità di sviluppu è a facilità d'utilizazione per l'utilizatori finali.

U codice di protokollu hè apertu, a nostra implementazione hè scritta in Rust, si pò truvà ccà.

Pudete vede ciò chì u sviluppu per NEAR s'assumiglia è sperimentà in l'IDE in linea ccà.

Pudete seguità tutte e nutizie in russo à gruppu telegram è in gruppu nantu à VKontakte, è in inglese in u ufficiale twitter.

À prestu!

Source: www.habr.com

Add a comment