Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

Hoy Habr!

Π’ ang unang bahagi Sa artikulong ito, tinalakay namin kung bakit maaaring kailanganin na bumuo ng mga random na numero para sa mga kalahok na hindi nagtitiwala sa isa't isa, kung anong mga kinakailangan ang iniharap para sa gayong mga random na generator ng numero, at isinasaalang-alang ang dalawang diskarte sa kanilang pagpapatupad.

Sa bahaging ito ng artikulo, titingnan natin ang isa pang diskarte na gumagamit ng mga lagda ng threshold.

Medyo cryptography

Upang maunawaan kung paano gumagana ang mga lagda ng threshold, kailangan mong maunawaan ang isang maliit na pangunahing cryptography. Gagamit tayo ng dalawang konsepto: mga scalar, o simpleng mga numero, na tutukuyin natin sa pamamagitan ng maliliit na titik (x, y) at mga punto sa elliptic curve, na ating tutukuyin sa pamamagitan ng malalaking titik.

Upang maunawaan ang mga pangunahing kaalaman sa mga lagda ng threshold, hindi mo kailangang maunawaan kung paano gumagana ang mga elliptic curve, maliban sa ilang pangunahing bagay:

  1. Ang mga puntos sa isang elliptic curve ay maaaring idagdag at i-multiply sa isang scalar (ituturing natin ang multiplikasyon sa isang scalar bilang xG, bagama't ang notasyon Gx madalas ding ginagamit sa panitikan). Ang resulta ng pagdaragdag at pagpaparami ng isang scalar ay isang punto sa isang elliptic curve.

  2. Alam lang ang punto G at ang produkto nito na may scalar xG hindi makalkula x.

Gagamitin din natin ang konsepto ng isang polynomial p(x) degree k-1. Sa partikular, gagamitin namin ang sumusunod na katangian ng mga polynomial: kung alam namin ang halaga p(x) para sa anumang k iba x (at wala na kaming karagdagang impormasyon tungkol sa p(x)), maaari nating kalkulahin p(x) para sa sinumang iba pa x.

Ito ay kagiliw-giliw na para sa anumang polynomial p(x) at ilang punto sa kurba Galam ang kahulugan p(x)G para sa anumang k iba't ibang kahulugan x, maaari din nating kalkulahin p(x)G para sa anumang x.

Ito ay sapat na impormasyon upang maghukay sa mga detalye kung paano gumagana ang mga lagda ng threshold at kung paano gamitin ang mga ito upang makabuo ng mga random na numero.

Random na number generator sa mga lagda ng threshold

Sabihin na natin n gusto ng mga kalahok na bumuo ng random na numero, at gusto naming makilahok ang sinuman k mayroong sapat sa kanila upang makabuo ng isang numero, ngunit upang ang mga attackers na kumokontrol k-1 o mas kaunting mga kalahok ay hindi mahuhulaan o maimpluwensyahan ang nabuong bilang.

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

Kumbaga may ganyang polynomial p(x) degree k-1 kung ano ang alam ng unang kalahok p (1), alam ng pangalawa p(2), at iba pa (n-alam na p(n)). Ipinapalagay din namin na para sa ilang paunang natukoy na punto G alam ng lahat p(x)G para sa lahat ng halaga x. Tatawagan namin p(i) "pribadong bahagi" iika-kalahok (dahil lamang ikilala siya ng ika-kalahok), at p(i)G "pampublikong bahagi" i-th participant (kasi kilala siya ng lahat ng kalahok). Tulad ng naaalala mo, kaalaman p(i)G hindi sapat upang maibalik p(i).

Paglikha ng tulad ng isang polynomial kaya na lamang i-Ang ikatlong kalahok at walang ibang nakakaalam ng kanyang pribadong bahagi - ito ang pinaka kumplikado at kawili-wiling bahagi ng protocol, at susuriin namin ito sa ibaba. Sa ngayon, ipagpalagay natin na mayroon tayong ganoong polynomial at alam ng lahat ng kalahok ang kanilang mga pribadong bahagi.

Paano natin magagamit ang gayong polynomial upang makabuo ng random na numero? Upang magsimula, kailangan namin ng ilang string na hindi pa ginamit bilang input sa generator. Sa kaso ng isang blockchain, ang hash ng huling bloke h ay isang magandang kandidato para sa naturang linya. Hayaan ang mga kalahok na gustong gumawa ng random na numero gamit h parang binhi. Nag-convert muna ang mga kalahok h sa isang punto sa curve gamit ang anumang paunang natukoy na function:

H = scalarToPoint(h)

Pagkatapos ng bawat kalahok i kinakalkula at inilathala Kumusta = p(i)H, anong magagawa nila dahil alam nila p(i) at H. Pagbubunyag Hhindi ko pinapayagan ang ibang mga kalahok na ibalik ang pribadong bahagi iika-kalahok, at samakatuwid ang isang hanay ng mga pribadong bahagi ay maaaring gamitin mula sa bawat bloke. Kaya, ang mamahaling polynomial generation algorithm na inilarawan sa ibaba ay kailangan lang isagawa nang isang beses.

Kapag k ang mga kalahok ay na-autopsy Kumusta = p(i)H, lahat ay kayang kalkulahin Hx = p(x)H para sa lahat x salamat sa pag-aari ng polynomial na tinalakay natin sa huling seksyon. Sa sandaling ito, kinakalkula ng lahat ng mga kalahok H0 = p(0)H, at ito ang resultang random na numero. Mangyaring tandaan na walang nakakaalam p(0), at samakatuwid ang tanging paraan upang makalkula p(0)H – ito ay interpolation p(x)H, na posible lamang kapag k halaga p(i)H kilala. Pagbubukas ng anumang mas maliit na dami p(i)H ay hindi nagbibigay ng anumang impormasyon tungkol sa p(0)H.

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

Ang generator sa itaas ay may lahat ng mga katangian na gusto namin: mga umaatake na kumokontrol lamang k-1 kalahok o mas kaunti ay walang impormasyon o impluwensya sa konklusyon, habang mayroon k maaaring kalkulahin ng mga kalahok ang resultang numero, at anumang subset ng k ang mga kalahok ay palaging darating sa parehong resulta para sa parehong binhi.

May isang problema na maingat naming iniiwasan sa itaas. Para gumana ang interpolation, mahalaga na ang halaga Hi na inilathala ng bawat kalahok i ito ay talagang pareho p(i)H. Dahil walang iba maliban i-hindi alam ng kalahok p(i), walang iba maliban sa i-hindi mabe-verify iyon ng kalahok Hi aktwal na kinakalkula nang tama, at walang anumang cryptographic na patunay ng kawastuhan Hi isang attacker ay maaaring mag-publish ng anumang halaga bilang Kumusta, at arbitraryong nakakaimpluwensya sa output ng random number generator:

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2Ang iba't ibang halaga ng H_1 na ipinadala ng unang kalahok ay humahantong sa iba't ibang nagreresultang H_0

Mayroong hindi bababa sa dalawang paraan upang patunayan ang tama Hi, isasaalang-alang natin ang mga ito pagkatapos nating suriin ang henerasyon ng polynomial.

Polinomyal na henerasyon

Sa huling seksyon, ipinapalagay namin na mayroon kaming ganoong polynomial p(x) degree k-1 na ang kalahok i alam p(i), at walang ibang may anumang impormasyon tungkol sa halagang ito. Sa susunod na seksyon kakailanganin din natin iyon para sa ilang paunang natukoy na punto G alam ng lahat p(x)G para sa lahat x.

Sa seksyong ito, ipagpalagay namin na ang bawat kalahok ay lokal na mayroong ilang pribadong susi xi, sa gayon ay alam ng lahat ang kaukulang pampublikong susi Xi.

Ang isang posibleng polynomial generation protocol ay ang mga sumusunod:

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

  1. Bawat kalahok i lokal na lumilikha ng isang arbitrary na polynomial pi(x) degree k-1. Pagkatapos ay ipinapadala nila ang bawat kalahok j halaga pi(j), naka-encrypt gamit ang pampublikong key Xj. Kaya lang i-ika ΠΈ j-ika alam ng kalahok pi(j). kalahok i inihayag din sa publiko pi(j)G para sa lahat j mula sa 1 sa k kasama.

  2. Gumagamit ang lahat ng kalahok ng ilang pinagkasunduan upang pumili k mga kalahok na ang polynomials ay gagamitin. Dahil maaaring offline ang ilang kalahok, hindi kami makapaghintay hanggang sa lahat n ang mga kalahok ay maglalathala ng mga polynomial. Ang resulta ng hakbang na ito ay isang set Z binubuo ng hindi bababa sa k polynomial na ginawa sa hakbang (1).

  3. Tinitiyak ng mga kalahok na alam nila ang mga halaga pi(j) ay tumutugma sa inihayag sa publiko pi(j)G. Pagkatapos ng hakbang na ito Z mga polynomial lamang na pribadong ipinadala pi(j) ay tumutugma sa inihayag sa publiko pi(j)G.

  4. Bawat kalahok j kinakalkula ang pribadong bahagi nito p(j) bilang kabuuan pi(j) para sa lahat i Π² Z. Kinakalkula din ng bawat kalahok ang lahat ng mga halaga p(x)G bilang kabuuan pi(x)G para sa lahat ng i Π² Z.

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

Mangyaring tandaan na ang p(x) – ito ay talagang isang polynomial k-1, dahil ito ang kabuuan ng indibidwal pi(x), na ang bawat isa ay polynomial ng degree k-1. Pagkatapos, tandaan na habang ang bawat kalahok j alam p(j), wala silang impormasyon tungkol sa p(x) para sa x β‰  j. Sa katunayan, upang makalkula ang halagang ito, kailangan nilang malaman ang lahat pi(x), at basta ang kalahok j ay hindi alam ang kahit isa sa mga napiling polynomial, wala silang sapat na impormasyon tungkol sa p(x).

Ito ang buong proseso ng pagbuo ng polynomial na kailangan sa huling seksyon. Ang mga hakbang 1, 2 at 4 sa itaas ay may medyo halatang pagpapatupad. Ngunit ang hakbang 3 ay hindi gaanong mahalaga.

Sa partikular, kailangan nating mapatunayan na naka-encrypt iyon pi(j) ay talagang tumutugma sa mga nai-publish pi(j)G. Kung hindi natin mapapatunayan, ang umaatake i maaaring magpadala ng basura sa halip pi(j) sa kalahok j, at kalahok j hindi makukuha ang tunay na halaga pi(j), at hindi makalkula ang pribadong bahagi nito.

Mayroong isang cryptographic protocol na nagbibigay-daan sa iyong lumikha ng karagdagang mensahe patunayi(j), na ang sinumang kalahok, ay may ilang halaga e, Π° Ρ‚Π°ΠΊΠΆΠ΅ proofi(j) ΠΈ pi(j)G, maaaring lokal na i-verify iyon e - ito talaga pi(j), naka-encrypt gamit ang susi ng kalahok j. Sa kasamaang palad, ang laki ng naturang ebidensya ay hindi kapani-paniwalang malaki, at ibinigay na ito ay kinakailangan upang mai-publish O(nk) Ang nasabing ebidensya ay hindi maaaring gamitin para sa layuning ito.

Sa halip na patunayan iyon pi(j) tumutugma sa pi(j)G maaari tayong maglaan ng napakalaking yugto ng panahon sa polynomial generation protocol, kung saan sinusuri ng lahat ng kalahok ang natanggap na naka-encrypt pi(j), at kung ang decrypted na mensahe ay hindi tumutugma sa publiko pi(j)G, nag-publish sila ng cryptographic na patunay na hindi tama ang naka-encrypt na mensahe na natanggap nila. Patunayan na ang mensahe hindi tumutugma sa pi(G) mas madali kaysa patunayan na tumutugma ito. Dapat tandaan na nangangailangan ito ng bawat kalahok na lumitaw online nang hindi bababa sa isang beses sa panahon na inilaan upang lumikha ng naturang ebidensya, at umaasa sa pagpapalagay na kung mag-publish sila ng gayong patunay, maaabot nito ang lahat ng iba pang kalahok sa parehong inilaang oras.

Posible bang bumuo ng mga random na numero kung hindi tayo nagtitiwala sa isa't isa? Bahagi 2

Kung ang isang kalahok ay hindi lumitaw online sa panahong ito, at mayroon siyang hindi bababa sa isang maling bahagi, kung gayon ang partikular na kalahok ay hindi makakasali sa karagdagang pagbuo ng numero. Gayunpaman, gagana pa rin ang protocol kung mayroon man lang k mga kalahok na nakatanggap lamang ng mga tamang bahagi o nakapag-iwan ng patunay ng kamalian sa loob ng inilaang oras.

Mga patunay ng kawastuhan ng H_i

Ang huling bahagi na nananatiling tatalakayin ay kung paano patunayan ang kawastuhan ng nailathala Hako, iyon ay Kumusta = p(i)H, nang hindi binubuksan p(i).

Tandaan natin na ang mga halaga H, G, p(i)G publiko at kilala ng lahat. Tumanggap ng operasyon p(i) nakakaalam p(i)G ΠΈ G tinatawag na discrete logarithm, o dlog, at gusto naming patunayan na:

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

nang walang pagsisiwalat p(i). Ang mga konstruksyon para sa gayong mga patunay ay umiiral, halimbawa Schnorr Protocol.

Sa disenyong ito, ang bawat kalahok, kasama ang Hi nagpapadala ng patunay ng kawastuhan ayon sa disenyo.

Kapag nabuo ang isang random na numero, madalas itong kailangang gamitin ng mga kalahok maliban sa mga nakabuo nito. Ang nasabing mga kalahok, kasama ang numero, ay dapat magpadala ng lahat Hi at kaugnay na ebidensya.

Maaaring magtanong ang isang matanong na mambabasa: dahil ang panghuling random na numero ay H0, at p(0)G – Ito ay pampublikong impormasyon, bakit kailangan natin ng patunay para sa bawat indibidwal Hako, bakit hindi magpadala ng patunay na sa halip

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

Ang problema ay ang gayong patunay ay hindi maaaring gawin gamit ang Schnorr Protocol dahil walang nakakaalam ng halaga p (0), kinakailangan upang lumikha ng patunay, at higit pa, ang buong random na generator ng numero ay batay sa katotohanang walang nakakaalam ng halagang ito. Samakatuwid ito ay kinakailangan upang magkaroon ng lahat ng mga halaga Hi at ang kanilang indibidwal na katibayan upang patunayan ang kawastuhan H0.

Gayunpaman, kung mayroong ilang operasyon sa mga punto sa mga elliptic curve na katulad ng semantiko sa multiplikasyon, ang patunay ng kawastuhan H0 magiging walang kuwenta, sisiguraduhin lang namin iyon

H0 Γ— G = p(0)G Γ— H

Kung sinusuportahan ng napiling curve elliptic curve pairings, gumagana ang patunay na ito. Sa kasong ito H0 ay hindi lamang ang output ng isang random na generator ng numero, na maaaring ma-verify ng sinumang kalahok na nakakaalam G, H ΠΈ p(0)G. H0 ay isa ring lagda sa mensahe na ginamit bilang isang binhi, na nagpapatunay na iyon k ΠΈ n nilagdaan ng mga kalahok ang mensaheng ito. Kaya, kung buto - ay ang hash ng block sa blockchain protocol, kung gayon H0 ay parehong multi-signature sa isang bloke at isang napakagandang random na numero.

Sa pagtatapos

Ang artikulong ito ay bahagi ng isang teknikal na serye ng blog NEAR. Ang NEAR ay isang blockchain protocol at platform para sa pagbuo ng mga desentralisadong application na may diin sa kadalian ng pagbuo at kadalian ng paggamit para sa mga end user.

Ang protocol code ay bukas, ang aming pagpapatupad ay nakasulat sa Rust, ito ay matatagpuan dito.

Maaari mong makita kung ano ang hitsura ng pag-unlad para sa NEAR at mag-eksperimento sa online na IDE dito.

Maaari mong sundin ang lahat ng mga balita sa Russian sa grupo ng telegrama at grupo sa VKontakte, at sa Ingles sa opisyal twitter.

Hanggang sa muli!

Pinagmulan: www.habr.com

Magdagdag ng komento