Ehi Habr!
В
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:
-
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.
-
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.
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.
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:
Diversi 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 i sà p(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:
-
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.
-
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).
-
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.
-
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.
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 j sà p(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.
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
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
In cunclusioni
Questu articulu face parte di una serie di blog tecnicu
U codice di protokollu hè apertu, a nostra implementazione hè scritta in Rust, si pò truvà
Pudete vede ciò chì u sviluppu per NEAR s'assumiglia è sperimentà in l'IDE in linea
Pudete seguità tutte e nutizie in russo à
À prestu!
Source: www.habr.com