
Tere, Habr!
Uues artiklites arutasime, miks vĂ”ib olla vajalik genereerida juhuslikke numbreid osalistele, kes ei usalda ĂŒksteist, millised nĂ”uded sellistele juhuslike numbrite generaatoritele esitatakse ning kaaluti kahte lĂ€henemist nende rakendamiseks.
Selles artikli osas vaatleme ĂŒksikasjalikult veel ĂŒhte lĂ€henemist, mis kasutab lĂ€ve allkirju.
Veidi krĂŒptograafia
Selleks, et mĂ”ista, kuidas lĂ€ve allkirjad töötavad, on vajalik vĂ€hene arusaam pĂ”hilistest krĂŒptograafia mĂ”istetest. Kasutame kahte kontseptsiooni: skalaare ehk lihtsalt numbreid, mida tĂ€histame vĂ€ikeste tĂ€htedega (x, y) ja punkte elliptilisel kĂ”veral, mida tĂ€histame suurte tĂ€htedega.
LĂ€ve allkirjade pĂ”hialuste mĂ”istmiseks ei pea ĂŒldse aru saama, kuidas elliptilised kĂ”verad toimivad, vĂ€lja arvatud mĂ”ned pĂ”hiasjad:
Elliptilise kĂ”vera punkte saab liita ja skalaari kĂŒlge korrutada (skalaari kĂŒlge korrutamist tĂ€histame kui xG, kuigi sĂŒmboolikat Gx kasutatakse ka tihti kirjanduses). Liitmise ja skalaari kĂŒlge korrutamise tulemus on punkt elliptilisel kĂ”veral.
Teades ainult punkti G ja selle korrutist skalaari xG ei saa arvestada x.
Kasutame samuti polĂŒnoomi kontseptsiooni p(x) kraadi k-1. EelkĂ”ige kasutame jĂ€rgmist polĂŒnoomide omadust: kui teame vÀÀrtust p(x) igaĂŒhe jaoks k erinev x (ja ei oma rohkem teavet p(x)), saame arvestada p(x) iga teisega x.
Huvitav on, et iga polĂŒnoomi p(x) ja mingi punkti kohta kĂ”veral, teades vÀÀrtust Gp(x)G erinevate vÀÀrtuste igaĂŒhe jaoks k , on vĂ”imalik ka arvestada xigaga erinevate vÀÀrtuste Seda teavet on piisavalt, et sĂŒveneda ĂŒksikasjadesse, kuidas lĂ€ve allkirjad töötavad ja kuidas neid kasutada juhuslike numbrite genereerimiseks. x.
LĂ€ve allkirjadega juhuslike numbrite generaator
Oletame, et
osalisi soovivad genereerida juhusliku numbri ja tahame, et ĂŒkskĂ”ik milline n neist oleks piisav numbri genereerimiseks, kuid et kurjategijad, kes kontrollivad k -1 vĂ”i vĂ€hem osalisi, ei saaks ennustada vĂ”i mĂ”jutada genereeritud numbrit. kOletame, et eksisteerib selline polĂŒnoom

-1, et esimene osaline teab p(x) kraadi kp(1) , teine teabp(2), ja nii edasi ( -ndal on infonp(n) ). Oletame ka, et mingi eelnevalt mÀÀratletud punkti korralteavad kĂ”ik G kĂ”igi vÀÀrtuste kohta erinevate vÀÀrtuste kĂ”ikide vÀÀrtuste jaoks x. Me nimetame p(i) âprivaatseks komponendiksâ i-ndast osalisest (sest ainult i-ne osaline teab seda), ja p(i)G âavalikuks komponendiksâ i-ndast osalisest (sest kĂ”ik osalised teavad seda). Nagu te mĂ€letate, teadmine p(i)G ei ole piisav, et taastada p(i).
Sellise polĂŒnoomi loomine, et ainult i--ne osaline ja keegi teine ei teaks oma privaatset komponenti â see on protokolli kĂ”ige keerulisem ja huvitavam osa, ja me kĂ€sitleme seda allpool. Oletame, et meil on selline polĂŒnoom, ja kĂ”ik osalised teavad oma privaatseid komponente.
Kuidas me saame kasutada sellist polĂŒnoomi, et genereerida juhuslik number? Esmalt vajame mingit stringi, mis pole varem sissepÀÀsuks genereerijale kasutatud. Blokaadi puhul on eelmise blokki hash h â hea kandidaat selliseks stringiks. Oletame, et osalised tahavad luua juhuslikku numbrit, kasutades h kui seemet. Esmalt konverteerivad osalised h punktiks kĂ”veral, kasutades mĂ”nda eelnevalt mÀÀratud funktsiooni:
H = scalarToPoint(h)
Siis arvutab ja avaldab iga osaline i Hi = p(i)H, mida nad saavad teha, sest nad teavad p(i) ja H. i avamine ei vĂ”imalda teistel osalistel taastada privaatset komponenti -ndast osalisest, ja seetĂ”ttu saab sama privaatsete komponentide komplekti kasutada bloki kaupa. Seega tuleb allpool kirjeldatud kulukas polĂŒnoomi loomise algoritm teostada ainult ĂŒks kord. Hosalised avasid ikĂ”ik saavad arvutada
Kui k x = mida nad saavad teha, sest nad teavad p(x)H HkĂ”igi polĂŒnoomide omaduse tĂ”ttu, millest me eelnevas osas rÀÀkisime. Sel hetkel arvutavad kĂ”ik osalised H0 = p(0)H, x ja see ongi tulemuslik juhuslik number. Pange tĂ€hele, et keegi ei tea p(0), ja seega on ainus viis arvutada p(0)H â see on interpolatsioon p(x)H, mida on vĂ”imalik teha ainult siis, kui vÀÀrtusi p(i)H k teatakse. Iga vĂ€iksema arvu avamine ei anna mingit teavet p(0)H-st. ei anna mingit teavet Ălaltoodud generaator omab kĂ”iki omadusi, mida me soovime: kurjategijad, kes kontrollivad ainult k-

1 osalist vÔi vÀhem, ei oma mingit teavet ega mÔju vÀljundile, samal ajal kui igasugused osalised saavad arvutada tulemuslikku numbrit ning iga osaliste alamhulk jÔuab alati sama tulemuse juurde sama seemne jaoks.1 osalejat vÔi vÀhem ei oma mingit teavet ega mÔju tulemusele, samas kui igasugused k osalejad saavad arvutada tulemuse ja iga alamhulk k osalejatest jÔuab alati sama tulemus sama seemne jaoks.
On ĂŒks probleem, mida me eelnevalt ettevaatlikult vĂ€ltisime. Et interpoleerimine toimiks, on oluline, et vÀÀrtus Hi, mille iga osaleja on avaldanud, i oleks tĂ”eliselt vĂ”rdne p(i)H. Kuna keegi peale i-ndat osalejat ei tea p(i), ei saa keegi peale i--nda osaleja kontrollida, et Hi on tĂ”eliselt Ă”igesti arvutatud, ja ilma mingi krĂŒptograafilise tĂ”endi Ă”iguse kohta, HvĂ”ib kurjategija avaldada mistahes vÀÀrtuse kui Hi, ja suvaliselt mĂ”jutada juhuslike numbrite generaatori vĂ€ljundit.:
Erinevad H_1 vÀÀrtused, mida esimene osaleja saadab, toovad kaasa erinevad lÔpp-H_0-d.
On vĂ€hemalt kaks viisi tĂ”estada Ă”igust Hi, neid kĂ€sitleme pĂ€rast polĂŒnoomi genereerimise arutamist.
PolĂŒnoomi genereerimine
Eelmisel lĂ”igul eeldasime, et meil on selline polĂŒnoom p(x) kraadi k-1, et osaleja i kuidas seda teha. Ja seepĂ€rast kĂ€itub Google ĂŒhes suhtes vĂ€ga targalt: lubab Androidi inimestel teha kĂ”ike omamoodi. p(i), ja keegi teine ei oma selle vÀÀrtuse kohta mingit teavet. JĂ€rgmises lĂ”igus peame samuti arvestama, et mĂ”nes eelnevalt mÀÀratud punktis G kĂ”ik teavad erinevate vÀÀrtuste H0 = p(0)H, x.
Selles lÔigus eeldame, et igal osalejal on kohalikult mingi privaatvÔti xi, ni, et kÔik teavad vastavat avalikku vÔtit Xi.
Ăks vĂ”imalik polĂŒnoomi genereerimise protokoll on jĂ€rgmine:

Iga osaleja i loodab kohalikult suvalise polĂŒnoomi pi(x) jĂ€rku k-1. SeejĂ€rel saadavad nad igale osalejale j vÀÀrtuse pi(j), mis on krĂŒpteeritud avaliku vĂ”tmega Xj. Nii et ainult i-j-nda ja - osaleja teabj-nda i(j). Osaleja pteeb samuti avalikult teada i pi(j)G kaasa arvatud. H0 = p(0)H, j alates 1 kuni k KĂ”ik osalejad kasutavad mingit konsensust, et valida
osalejad, kelle polĂŒnoome kasutatakse. Kuna mĂ”ned osalejad vĂ”ivad olla vĂ€ljaspool vĂ”rku, ei saa me oodata, kuni kĂ”ik k osalejad avaldavad polĂŒnoome. Selle sammu tulemus on hulk n mis koosneb vĂ€hemalt Z polĂŒnoomidest, mis loodi sammus (1) k Osalejad veenduvad, et neile tuntud vÀÀrtused.
i(j) vastavad avalikult teada antud ppi(j)G. PĂ€rast seda sammu peaksid jÀÀma vaid polĂŒnoomid, mille privaatselt edastatud arvutab oma privaatkomponendi Z p(j) ppi(j)G. PĂ€rast seda sammu peaksid jÀÀma vaid polĂŒnoomid, mille privaatselt edastatud
Iga osaleja j nagu summa i(j) kĂ”igi . Iga osaleja arvutab samuti kĂ”ik vÀÀrtused ppi(x)G kĂ”ikide i jaoks. i ja Zp(x) â erinevate vÀÀrtuste . Iga osaleja arvutab samuti kĂ”ik vÀÀrtused see on tĂ”eliselt polĂŒnoom jĂ€rku ja Z.

Pange tĂ€hele, et k-1, sest see on eraldi i(x), millest igaĂŒks on polĂŒnoom astmega k-1. pseega on see summa eraldi k-1. See, while each participant j kuidas seda teha. Ja seepĂ€rast kĂ€itub Google ĂŒhes suhtes vĂ€ga targalt: lubab Androidi inimestel teha kĂ”ike omamoodi. p(j), they have no information about p(x) jaoks x â j. Indeed, to compute this value, they need to know all pi(x), and as long as the participant j doesn't know at least one of the selected polynomials, they lack sufficient information about p(x).
This is the entire polynomial generation process that was required in the previous section. Steps 1, 2, and 4 above have a quite clear implementation. However, step 3 is not so trivial.
Specifically, we need to be able to prove that the encrypted pi(j) indeed corresponds to the published PĂ€rast seda sammu peaksid jÀÀma vaid polĂŒnoomid, mille privaatselt edastatud If we cannot prove this, an attacker i could send garbage instead of pi(j) to the participant j, and the participant j would not be able to obtain the actual value pi(j), and would not be able to calculate their private component..
There is a cryptographic protocol that allows you to create an additional message proofi(j), such that any participant, having some value e, as well as proofi(j) ja pi(j)G, can locally verify that e â this is indeed pi(j), encrypted with participant's key j. Unfortunately, the size of such proof is incredibly large, and considering that it is necessary to publish O(nk) such proofs, they cannot be used for this purpose.
Instead of proving that pi(j) vastab pi(j)G we can in the polynomial generation protocol allocate a very large interval of time, during which all participants check the obtained encrypted pi(j), and if the decrypted message does not match the public pi(j)G, they publish a cryptographic proof that the encrypted message they received is incorrect. Proving that the message ei vastab pi(G) is much easier than proving that it corresponds. It should be noted that this requires each participant to appear in the network at least once during the time allocated for creating such proofs and relies on the assumption that if they published such proof, it will reach all other participants within the same allocated time.

If a participant did not appear in the network during this time period, and they indeed had at least one incorrect component, then this particular participant will not be able to participate in further number generation. The protocol, however, will still function if there is at least k osalejatest, kes kas just said Ôiged komponendid vÔi suutsid jÀtta tÔestuse vale kohta ettenÀhtud ajas.
H_i Ôiguse tÔestused
Viimane osa, mida arutada, on see, kuidas tÔestada avaldatud korrektset Hi, nimelt, et mida nad saavad teha, sest nad teavad ilma avamata. p(i).
KÀidame meeles, et vÀÀrtused H, G, p(i)G on avalikud ja tuntud kÔigile. Saamist teo p(i) teades p(i)G ja G nimetatakse diskreetseks logaritmiks, vÔi dlog, ja me tahame tÔestada, et:
dlog(p(i)G, G) = dlog(Hi, H)
ilma avaldamiseta. p(i)Selliste tÔestuste jaoks on olemas konstruktsioonid, nÀiteks.
Sellise konstruktsiooniga saadab iga osaleja koos Hi tÔestuse Ôiguse jÀrgi konstruktsiooni.
Kui juhuslik number on genereeritud, tuleb seda tihti kasutada osalejatele, kes ei ole selle genereerinud. Sellistele osalejatele tuleb koos numbriga saata kÔik Hi ja seotud tÔestused.
Uuriv lugeja vĂ”ib kĂŒsida: kuna lĂ”plik juhuslik number on H0 ja p(0)G â see on avalik teave, siis miks on vajalik tĂ”estus iga eraldi jaoks Hi, miks mitte saata tĂ”estust selle osas, et
dlog(p(0)G, G) = dlog(H.0, H)
Probleem on selles, et Schnorr protokolli abil ei saa luua sellist tÔestust, sest keegi ei tea vÀÀrtust p(0),mida on vajalik tÔestuse loomiseks, ning veelgi enam, kogu juhuslike numbrite generaator pÔhineb sellel, et keegi ei tea seda vÀÀrtust. SeetÔttu on vajalik omada kÔiki vÀÀrtusi Hi ja nende individuaalseid tÔestusi, et tÔestada Ôigust. H0.
Kuid kui eliptiliste kÔverate punktidel oleks mingisugune tegu, mis on semantiliselt sarnane korrutamisega, siis oleks Ôiguse tÔestamine H0 olnud triviaalne, me lihtsalt kindlustaksime, et
H0 Ă G = p(0)G Ă H.
Kui valitud kĂ”ver toetab siis töötab selline tĂ”estus. Sellisel juhul H0 on mitte ainult juhuslike numbrite generaatori vĂ€ljund, mida saab kontrollida iga osaleja, kes teab G, H, ja p(0)G. H0 on samuti allkiri sĂ”numis, mida kasutati seemnena, kinnitades, et k ja n osalejad allkirjastasid selle sĂ”numi. Seega, kui seeme â on ploki hash plokiahela protokollis, siis H0 - on samaaegselt mitme allkiri plokis ja vĂ€ga hea juhuslik number.
KokkuvÔtteks
See artikkel on osa tehniliste artiklite seeriast blogis. . NEAR â see on plokiahel protokoll ja platvorm detsentraliseeritud rakenduste arendamiseks, mille rĂ”hk on arendamise lihtsusel ja lĂ”ppkasutajate kasutusmugavusel.
Protokolli kood on avatud, meie teostus on kirjutatud Rustis, seda saab leida .
Vaata, kuidas NEAR-i arendus vÀlja nÀeb ja eksperimentida saad veebipÔhises IDE-s .
KÔiki uudiseid vene keeles saab jÀlgida ja , ja inglise keeles ametlikus .
JÔuame taas kokku!
Allikas: habr.com
