Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

Hoi Habr!

В earste diel Yn dit artikel, wy besprutsen wêrom't it miskien wêze nedich te generearjen willekeurige nûmers foar dielnimmers dy't net fertrouwe inoar, hokker easken wurde foarsteld foar sokke willekeurige getallengenerators, en beskôge twa oanpakken foar harren útfiering.

Yn dit diel fan it artikel sille wy in oare oanpak fan tichterby besjen dy't drompelhantekeningen brûkt.

In bytsje kryptografy

Om te begripen hoe't drompelhantekeningen wurkje, moatte jo in bytsje basale kryptografy begripe. Wy sille twa begripen brûke: skalaren, of gewoan sifers, dy't wy sille oanjaan mei lytse letters (x, y) en punten op 'e elliptyske kromme, dy't wy sille oantsjutte mei haadletters.

Om de basis fan drompelhantekeningen te begripen, hoege jo net te begripen hoe't elliptyske krommes wurkje, oars as in pear basis dingen:

  1. Punten op in elliptyske kromme kinne wurde tafoege en fermannichfâldige mei in skalaar (wy sille fermannichfâldigje mei in skalaar oantsjutte as xG, hoewol't de notaasje Gx ek faak brûkt yn 'e literatuer). It resultaat fan optellen en fermannichfâldigjen mei in skalaar is in punt op in elliptyske kromme.

  2. It witten allinnich it punt G en syn produkt mei in skalaar xG kin net berekkene wurde x.

Wy sille ek it konsept fan in polynoom brûke p(x) diploma k-1. Yn it bysûnder sille wy de folgjende eigenskip fan polynomen brûke: as wy de wearde kenne p(x) foar eltse k oars x (en wy hawwe gjin mear ynformaasje oer p(x)), kinne wy ​​berekkenje p(x) foar immen oars x.

It is nijsgjirrich dat foar elke polynoom p(x) en wat punt op 'e kromme Gde betsjutting kennen p(x)G foar eltse k ferskillende betsjuttings x, wy kinne ek berekkenje p(x)G foar eltse x.

Dit is genôch ynformaasje om te graven yn 'e details fan hoe't drompelhântekeningen wurkje en hoe't se se brûke om willekeurige nûmers te generearjen.

Willekeurige getallengenerator op drompel hântekeningen

Litte wy dat sizze n dielnimmers wolle generearje in willekeurich getal, en wy wolle eltsenien meidwaan k der wiene genôch fan harren te generearjen in oantal, mar sa dat de oanfallers dy't kontrôle k-1 of minder dielnimmers koene it generearre oantal net foarsizze of beynfloedzje.

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

Stel dat der sa'n polynoom is p(x) diploma k-1 wat de earste dielnimmer wit p (1), wit de twadde p(2), ensafuorthinne (n- wit p(n)). Wy geane ek oan dat foar guon foarbeskaaide punt G Eltsenien wit it p(x)G foar alle wearden x. Wy sille belje p(i) "privee komponint" ie dielnimmer (omdat allinnich ide ste dielnimmer ken har), en baarch "iepenbiere komponint" i-de dielnimmer (omdat alle dielnimmers har kenne). As jo ​​ûnthâlde, kennis baarch net genôch om te herstellen p(i).

Sa'n polynoom oanmeitsje sadat allinnich i-De earste dielnimmer en gjinien oars wisten syn privee komponint - dit is it meast komplekse en nijsgjirrige diel fan it protokol, en wy sille it hjirûnder analysearje. Litte wy no oannimme dat wy sa'n polynoom hawwe en alle dielnimmers kenne har privee komponinten.

Hoe kinne wy ​​sa'n polynoom brûke om in willekeurich getal te generearjen? Om te begjinnen, wy moatte wat tekenrige dat is net earder brûkt as ynfier nei de generator. Yn it gefal fan in blockchain, de hash fan it lêste blok h is in goede kandidaat foar sa'n line. Lit dielnimmers wolle meitsje in willekeurich getal mei help h lykas sied. Dielnimmers konvertearje earst h nei in punt op 'e kromme mei elke foarôf definieare funksje:

H = scalarToPoint(h)

Dan elke dielnimmer i berekkent en publisearret Hi = p(i)H, wat kinne se dwaan om't se witte p(i) en H. Ferklearring Hik lit oare dielnimmers net de privee komponint weromsette iste dielnimmer, en dêrom kin ien set fan partikuliere komponinten brûkt wurde fan blok nei blok. Sa hoecht it hjirboppe beskreaune djoere polynomiale generaasje-algoritme mar ien kear útfierd te wurden.

Wannear k dielnimmers waarden autopsied Hi = p(i)H, elkenien kin berekkenje Hx = p(x)H foar alle x tank oan it eigendom fan polynomen dat wy besprutsen yn 'e lêste paragraaf. Op dit stuit berekkenje alle dielnimmers H0 = p(0)H, en dit is de resultearjende willekeurige getal. Tink derom dat gjinien it wit p(0), en dêrom de ienige manier om te berekkenjen p(0)H - dit is ynterpolaasje p(x)H, dat is allinnich mooglik wannear k wearden p(i)H bekend. Iepenje elke lytsere kwantiteit p(i)H jout gjin ynformaasje oer p(0)H.

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

De generator hjirboppe hat alle eigenskippen dy't wy wolle: oanfallers kontrolearje allinich k-1 dielnimmers of minder hawwe gjin ynformaasje of ynfloed op de konklúzje, wylst eltse k dielnimmers kinne berekkenje de resultearjende oantal, en eltse subset fan k dielnimmers sille altyd komme ta itselde resultaat foar deselde sied.

D'r is ien probleem dat wy hjirboppe soarchfâldich mijden. Foar ynterpolaasje om te wurkjen, is it wichtich dat de wearde Hi dat waard publisearre troch eltse dielnimmer i it wie echt itselde p(i)H. Sûnt gjinien útsein i-de dielnimmer wit net p(i), gjinien útsein i-de dielnimmer kin dat net ferifiearje Hi feitlik korrekt berekkene, en sûnder ienich kryptografysk bewiis fan krektens Hik in oanfaller kin publisearje eltse wearde as Hoi, en willekeurich beynfloedzje de útfier fan de willekeurige getallengenerator:

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2Ferskillende wearden fan H_1 stjoerd troch de earste dielnimmer liede ta ferskate resultearjende H_0

D'r binne op syn minst twa manieren om de korrektheid te bewizen Hik, wy sille beskôgje se neidat wy analysearje de generaasje fan de polynoom.

Polynomiale generaasje

Yn 'e lêste paragraaf hawwe wy oannommen dat wy sa'n polynoom hawwe p(x) diploma k-1 dat de dielnimmer i wit p(i), en gjinien oars hat gjin ynformaasje oer dizze wearde. Yn 'e folgjende paragraaf sille wy dat ek nedich hawwe foar guon foarbepaalde punt G elkenien wist p(x)G foar alle x.

Yn dizze seksje sille wy oannimme dat elke dielnimmer lokaal wat privee kaai hat xi, sa dat elkenien wit de oerienkommende iepenbiere kaai Xi.

Ien mooglik protokol foar generaasje fan polynomen is as folget:

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

  1. Elke dielnimmer i makket lokaal in willekeurige polynoom pi(x) graad k-1. Se stjoere dan elke dielnimmer j betsjutting pi (j), fersifere mei iepenbiere kaai Xj. Allinnich dus i-y и j-y dielnimmer witte pik (j). Dielnimmer i ek iepenbier oankundige pi(j)G foar alle j от 1 до k ynklusyf.

  2. Alle dielnimmers brûke wat konsensus om te kiezen k dielnimmers waans polynomen sille wurde brûkt. Sûnt guon dielnimmers miskien offline binne, kinne wy ​​net wachtsje oant elkenien n dielnimmers sille publisearje polynomen. It resultaat fan dizze stap is in set Z besteande út op syn minst k polynomen makke yn stap (1).

  3. Dielnimmers soargje derfoar dat de wearden dy't se kenne pi (j) oerienkomme mei iepenbier oankundige pi(j)G. Nei dizze stap yn Z allinnich polynomialen dêr't privee oerdroegen pi (j) oerienkomme mei iepenbier oankundige pi(j)G.

  4. Elke dielnimmer j berekkent syn privee komponint p(j) as in som pi(j) foar allegear i в Z. Elke dielnimmer berekkent ek alle wearden p(x)G as in som pi(x)G foar alle i в Z.

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

notysje dat p(x) - it is echt in polynoom k-1, want it is de som fan it yndividu pi (x), elk fan dat is in polynoom fan graad k-1. Dan, note dat wylst elke dielnimmer j wit p(j), se hawwe gjin ynformaasje oer p(x) foar x ≠ j. Ja, om dizze wearde te berekkenjen, moatte se alles witte pi(x), en sa lang as de dielnimmer j wit net op syn minst ien fan de selektearre polynomen, se hawwe net genôch ynformaasje oer p(x).

Dit is it hiele polynomiale generaasjeproses dat nedich wie yn 'e lêste seksje. Stappen 1, 2 en 4 hjirboppe hawwe in frij dúdlik ymplemintaasje. Mar stap 3 is net sa triviaal.

Spesifyk moatte wy dat fersifere kinne bewize pi(j) echt oerienkomme mei de publisearre pi(j)G. As wy it net bewize kinne, de oanfaller i kin stjoere jiskefet ynstee pi(j) oan dielnimmer j, en dielnimmer j sil de echte betsjutting net kinne krije pi(j), en sil net by steat wêze om te berekkenjen syn privee komponint.

D'r is in kryptografysk protokol wêrmei jo in ekstra berjocht kinne oanmeitsje bewiisi (j), sa dat eltse dielnimmer, hawwende wat wearde e, а также proofi (j) и pi(j)G, kin dat lokaal ferifiearje e - it is echt pi(j), fersifere mei de dielnimmer syn kaai j. Spitigernôch, de grutte fan sokke bewiis is ongelooflijk grut, en jûn dat it is nedich om te publisearjen O(nk) Sokke bewiis kin net foar dit doel brûkt wurde.

Yn stee fan dat te bewizen pi (j) соответствует pi(j)G kinne wy ​​​​in heul lange perioade tawize yn it polynomiale generaasjeprotokol, wêryn't alle dielnimmers de ûntfongen fersifere kontrolearje pi(j), en as it ûntsifere berjocht net oerienkomt mei it publyk pi (j) G, se publisearje in kryptografysk bewiis dat it fersifere berjocht dat se krigen hawwe ferkeard is. Bewize dat it berjocht net соответствует baarch) folle makliker dan bewize dat it oerienkomt. It moat opmurken wurde dat dit fereasket dat elke dielnimmer op syn minst ien kear online ferskynt yn 'e tiid dy't tawiisd is om sokke bewiis te meitsjen, en fertrout op' e oanname dat as se sa'n bewiis publisearje, it alle oare dielnimmers yn deselde tawiisde tiid sil berikke.

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 2

As in dielnimmer yn dizze perioade net online ferskynde, en hy hie wol op syn minst ien ferkearde komponint, dan kin dy bepaalde dielnimmer net meidwaan oan fierdere nûmergeneraasje. It protokol sil lykwols noch funksjonearje as der op syn minst is k dielnimmers dy't òf krekt de juste komponinten krigen hawwe òf it slagge om bewiis fan inkorrektheid binnen de tawiisde tiid te litten.

Bewiis fan justigens fan H_i

It lêste diel dat noch te besprekken is, is hoe't jo de krektens fan publisearre wurde kinne bewize Hik, nammentlik dat Hi = p(i)H, sûnder iepening p(i).

Lit ús ûnthâlde dat de wearden H, G, p(i)G iepenbier en bekend foar elkenien. Ûntfange operaasje p(i) witte baarch и G neamd diskrete logaritme, of dlog, en wy wolle bewize dat:

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

sûnder iepenbiering p(i). Konstruksjes foar sokke bewizen besteane bygelyks Schnorr Protokol.

Mei dit ûntwerp, elke dielnimmer, tegearre mei Hi stjoert in bewiis fan justigens neffens it ûntwerp.

Sadree't in willekeurich getal wurdt oanmakke, it moat faak brûkt wurde troch oare dielnimmers as dyjingen dy't generearre it. Sokke dielnimmers, tegearre mei it oantal, moatte stjoere allegearre Hi en relatearre bewiis.

In nijsgjirrige lêzer kin freegje: sûnt it lêste willekeurige getal is H0,en en p(0)G - Dit is iepenbiere ynformaasje, wêrom hawwe wy bewiis nedich foar elk yndividu Hik, wêrom net stjoere bewiis dat ynstee

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

It probleem is dat sa'n bewiis net makke wurde kin mei it Schnorr-protokol, om't gjinien de wearde wit p (0), nedich foar it meitsjen fan it bewiis, en wat is mear, de hiele willekeurige getallengenerator is basearre op it feit dat gjinien wit dizze wearde. Dêrom is it nedich om alle wearden te hawwen Hi en har yndividuele bewiis om de korrektheid te bewizen H0.

As d'r lykwols guon operaasjes wiene op punten op elliptyske krommen dy't semantysk fergelykber is mei fermannichfâldigjen, it bewiis fan korrektheid H0 soe wêze triviaal, wy soene gewoan soargje dat

H0 × G = p(0)G × H

As de selektearre kromme stipet elliptyske kromme pairings, dit bewiis wurket. Yn dit gefal H0 is net allinich de útfier fan in willekeurige nûmergenerator, dy't kin wurde ferifiearre troch elke dielnimmer dy't it wit G, H и p(0)G. H0 is ek in hantekening op it berjocht dat waard brûkt as sied, befêstiget dat k и n dielnimmers tekene dit berjocht. Sa, as sied - is de hash fan it blok yn it blockchain-protokol, dan H0 is sawol in multi-hântekening op in blok en in hiel goed willekeurich getal.

Yn ôfsluting

Dit artikel is diel fan in technyske blogsearje TICHTBY. NEAR is in blockchain-protokol en platfoarm foar it ûntwikkeljen fan desintralisearre applikaasjes mei in klam op it gemak fan ûntwikkeling en it gemak fan gebrûk foar ein brûkers.

De protokolkoade is iepen, ús ymplemintaasje is skreaun yn Rust, it kin fûn wurde hjir.

Jo kinne sjen hoe't ûntwikkeling foar NEAR derút sjocht en eksperimintearje yn 'e online IDE hjir.

Jo kinne folgje al it nijs yn it Russysk by telegram groep en yn groep op VKontakte, en yn it Ingelsk yn 'e offisjele twitterje.

Oant sjen!

Boarne: www.habr.com

Add a comment