Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

Hey Habr!

В sisih pisanan Ing artikel iki, kita rembugan apa iku uga perlu kanggo generate nomer acak kanggo peserta sing ora dipercaya saben liyane, apa syarat sing sijine nerusake kanggo generator nomer acak kuwi, lan dianggep loro pendekatan kanggo implementasine.

Ing bagean artikel iki, kita bakal nliti pendekatan liyane sing nggunakake tandha ambang.

A bit saka kriptografi

Kanggo ngerti cara kerja teken ambang, sampeyan kudu ngerti kriptografi dhasar. Kita bakal nggunakake rong konsep: skalar, utawa mung angka, sing bakal dituduhake nganggo huruf cilik (x, y) lan titik ing kurva elips, sing bakal dituduhake kanthi huruf kapital.

Kanggo ngerti dhasar tandha ambang, sampeyan ora perlu ngerti cara kerja kurva elips, kajaba sawetara perkara dhasar:

  1. Titik ing kurva elips bisa ditambahake lan dikalikan karo skalar (kita bakal nuduhake perkalian karo skalar minangka xG, sanajan notasi Gx uga asring digunakake ing sastra). Asil tambahan lan perkalian kanthi skalar minangka titik ing kurva elips.

  2. Ngerti mung titik G lan produke kanthi skalar xG ora bisa diitung x.

Kita uga bakal nggunakake konsep polinomial p(x) derajat k-1. Utamane, kita bakal nggunakake properti polinomial ing ngisor iki: yen kita ngerti nilai kasebut p(x) kanggo sembarang k beda x (lan kita ora duwe informasi luwih lengkap babagan p(x)), kita bisa ngitung p(x) kanggo wong liya x.

Iku menarik sing kanggo polynomial sembarang p(x) lan sawetara titik ing kurva Gngerti maknane p(x)G kanggo sembarang k beda makna x, kita uga bisa ngitung p(x)G kanggo sembarang x.

Iki cukup informasi kanggo dig menyang rincian carane teken ambang bisa lan carane nggunakake kanggo generate nomer acak.

Generator nomer acak ing teken ambang

Ayo ngomong sing n peserta pengin generate nomer acak, lan kita pengin sapa melu k ana cukup saka wong-wong mau kanggo generate nomer, nanging supaya panyerang sing kontrol k-1 utawa kurang peserta ora bisa prédhiksi utawa mengaruhi nomer kui.

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

Upaminipun wonten polynomial kuwi p(x) derajat k-1 apa peserta pisanan ngerti p (1), sing kapindho ngerti p(2), lan liya-liyane (n- ngerti p(n)). Kita uga nganggep manawa kanggo sawetara titik sing wis ditemtokake G kabeh wong ngerti p(x)G kanggo kabeh nilai x. Kita bakal nelpon p(i) "komponen pribadi" ipeserta th (amarga mung ipeserta th ngerti dheweke), lan p(i)G "komponen umum" i-th peserta (amarga kabeh peserta ngerti dheweke). Nalika sampeyan ngelingi, kawruh p(i)G ora cukup kanggo mulihake p(i).

Nggawe polynomial kuwi supaya mung i-Peserta pisanan lan ora ana wong liya sing ngerti komponen pribadine - iki minangka bagean paling rumit lan menarik saka protokol, lan kita bakal nganalisa ing ngisor iki. Saiki, ayo nganggep manawa kita duwe polinomial kasebut lan kabeh peserta ngerti komponen pribadine.

Kepiye carane bisa nggunakake polinomial kasebut kanggo ngasilake nomer acak? Kanggo miwiti, kita butuh sawetara senar sing durung digunakake minangka input kanggo generator. Ing kasus pamblokiran, hash saka blok pungkasan h iku calon apik kanggo baris kuwi. Ayo peserta pengin nggawe nomer acak nggunakake h kaya wiji. Peserta ngonversi dhisik h menyang titik ing kurva nggunakake fungsi sing wis ditemtokake:

H = skalarToPoint(h)

Banjur saben peserta i ngitung lan nerbitake Hi = p(i)H, apa sing bisa ditindakake amarga padha ngerti p(i) lan H. pambocoran Haku ora ngidini peserta liyane kanggo mulihake komponen pribadi ipeserta th, lan mulane siji pesawat saka komponen pribadi bisa digunakake saka pamblokiran kanggo pamblokiran. Dadi, algoritma generasi polinomial sing larang sing diterangake ing ngisor iki mung kudu dieksekusi sapisan.

Nalika k peserta diotopsi Hi = p(i)H, saben wong bisa ngitung Hx = p(x)H kanggo kabeh x thanks kanggo properti saka polinomial sing kita rembugan ing bagean pungkasan. Ing wayahe, kabeh peserta ngitung H0 = p(0)H, lan iki nomer acak asil. Elinga yen ora ana sing ngerti p(0), lan mulane mung cara kanggo ngetung p(0)H iki interpolasi p(x)H, kang mung bisa nalika k nilai p(i)H dikenal. Mbukak jumlah sing luwih cilik p(i)H ora menehi informasi babagan p(0)H.

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

Generator ing ndhuwur nduweni kabeh sifat sing dikarepake: penyerang mung ngontrol k-1 peserta utawa kurang ora duwe informasi utawa pengaruh ing kesimpulan, nalika ana k peserta bisa ngetung nomer asil, lan sembarang subset saka k peserta bakal tansah teka menyang asil padha kanggo wiji padha.

Ana siji masalah sing kasebut kanthi teliti, nyingkiri ndhuwur. Kanggo interpolasi bisa, iku penting sing Nilai Hi kang diterbitake dening saben peserta i pancen padha p(i)H. Awit ora ana sing kajaba i-th peserta ora ngerti p(i), ora ana sing kajaba i-peserta th ora bisa verifikasi sing Hi bener diitung kanthi bener, lan tanpa bukti kriptografi sing bener Hi penyerang bisa nerbitaké sembarang nilai minangka Hi, lan arbitrarily pengaruhe output saka nomer generator acak:

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2Nilai H_1 sing beda-beda sing dikirim dening peserta pisanan nyebabake H_0 sing beda

Paling ora ana rong cara kanggo mbuktekake bener Hi, kita bakal nimbang wong sawise kita njelasno generasi saka polynomial.

Generasi polinomial

Ing bagean pungkasan kita nganggep yen kita duwe polinomial kasebut p(x) derajat k-1 sing peserta i ngerti p(i), lan ora ana wong liya sing duwe informasi babagan nilai iki. Ing bagean sabanjure, kita uga butuh kanggo sawetara titik sing wis ditemtokake G kabeh wong ngerti p(x)G kanggo kabeh x.

Ing bagean iki kita bakal nganggep yen saben peserta lokal duwe sawetara kunci pribadi xi, supaya saben wong ngerti kunci publik sing cocog Xi.

Siji protokol generasi polinomial sing bisa ditindakake yaiku:

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

  1. Saben peserta i lokal nggawe polinomial arbitrer pi(x) derajat k-1. Dheweke banjur ngirim saben peserta j tegese pi(j), dienkripsi nganggo kunci umum Xj. Mangkono mung i-y и j-y peserta ngerti paku (j). Peserta i uga ngumumake umum pi(j)G kanggo kabeh j saka 1 kanggo k klebu.

  2. Kabeh peserta nggunakake sawetara konsensus kanggo milih k peserta sing polinomial bakal digunakake. Amarga sawetara peserta bisa offline, kita ora bisa ngenteni nganti kabeh wong n peserta bakal nerbitake polinomial. Asil saka langkah iki minangka set Z dumadi saka ing paling k polinomial digawe ing langkah (1).

  3. Peserta nggawe manawa nilai sing dingerteni pi(j) cocog karo sing diumumake umum pi(j)G. Sawise langkah iki Z mung polinomial sing ditularake kanthi pribadi pi(j) cocog karo sing diumumake umum pi(j)G.

  4. Saben peserta j ngetung komponen pribadi p(j) minangka jumlah pi(j) kanggo kabeh i в Z. Saben peserta uga ngetung kabeh nilai p(x)G minangka jumlah pi(x)G kanggo kabeh i в Z.

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

elinga yen p(x) - iku pancen polinomial k-1, amarga iku jumlah saka individu pi(x), masing-masing minangka polinomial derajat k-1. Banjur, elinga yen saben peserta j ngerti p(j), padha ora duwe informasi bab p(x) kanggo x ≠ j. Pancen, kanggo ngetung nilai iki, dheweke kudu ngerti kabeh pi(x), lan anggere peserta j ora ngerti paling siji saka polinomial kapilih, padha ora duwe informasi cukup bab p(x).

Iki kabeh proses generasi polinomial sing dibutuhake ing bagean pungkasan. Langkah 1, 2 lan 4 ing ndhuwur nduweni implementasine sing cukup jelas. Nanging langkah 3 ora pati penting.

Khusus, kita kudu bisa mbuktekake manawa ndhelik pi (j) pancen cocog karo sing diterbitake pi(j)G. Yen kita ora bisa mbuktekake, penyerang i bisa ngirim sampah tinimbang pi (j) kanggo peserta j, lan peserta j ora bakal bisa entuk nilai nyata pi(j), lan ora bakal bisa ngetung komponen pribadi.

Ana protokol kriptografi sing ngidini sampeyan nggawe pesen tambahan buktii(j), supaya sembarang peserta, duwe sawetara nilai e, lan uga bukti (j) и pi(j)G, bisa verifikasi lokal e - iku tenan pi(j), ndhelik karo kunci peserta j. Sayange, ukuran bukti kuwi luar biasa gedhe, lan diwenehi sing perlu kanggo nerbitaké O(nk) Bukti kasebut ora bisa digunakake kanggo tujuan kasebut.

Tinimbang mbuktekaken pi(j) соответствует pi(j)G kita bisa nyedhiakke wektu sing gedhe banget ing protokol generasi polinomial, sajrone kabeh peserta mriksa ndhelik sing ditampa. pi(j), lan yen pesen decrypted ora cocog kanggo umum pi(j)G, padha nerbitaké bukti cryptographic sing pesen ndhelik padha ditampa iku salah. Mbuktekaken sing pesen ora соответствует pi(G) luwih gampang saka mbuktekaken sing cocog. Perlu dicathet yen iki mbutuhake saben peserta katon online paling ora sapisan sajrone wektu sing diwenehake kanggo nggawe bukti kasebut, lan gumantung ing asumsi yen dheweke nerbitake bukti kasebut, bakal tekan kabeh peserta liyane ing wektu sing padha.

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 2

Yen peserta ora katon online sajrone wektu iki, lan dheweke duwe paling ora siji komponen sing salah, banjur peserta tartamtu ora bakal bisa melu ing generasi nomer luwih. Nanging, protokol kasebut isih bisa digunakake yen paling ora ana k peserta sing mung nampa komponen sing bener utawa bisa ninggalake bukti sing ora bener ing wektu sing ditemtokake.

Bukti kabeneran H_i

Bagean pungkasan sing isih kudu dibahas yaiku carane mbuktekake benere diterbitake Hi, inggih punika Hi = p(i)H, tanpa mbukak p(i).

Ayo kita elinga yen nilai-nilai kasebut H, G, p(i)G umum lan dikenal kabeh wong. Nampa operasi p(i) ngerti p(i)G и G disebut logaritma diskrèt, utawa dlog, lan kita pengin mbuktekake manawa:

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

tanpa pambocoran p(i). Konstruksi kanggo bukti kasebut ana, contone Protokol Schnorr.

Kanthi desain iki, saben peserta, bebarengan karo Hi ngirim bukti bener miturut rancangan.

Sawise nomer acak kui, asring perlu digunakake dening peserta liyane saka sing kui. Peserta kasebut, bebarengan karo nomer, kudu ngirim kabeh Hi lan bukti sing gegandhengan.

Pembaca sing kepengin weruh bisa uga takon: amarga nomer acak pungkasan yaiku H0, lan p(0) G – Iki informasi umum, kenapa kita butuh bukti kanggo saben individu Hi, kok ora ngirim bukti sing tinimbang

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

Masalahe yaiku bukti kasebut ora bisa digawe nggunakake Protokol Schnorr amarga ora ana sing ngerti nilai kasebut p (0), perlu kanggo nggawe bukti, lan apa liyane, kabeh generator nomer acak adhedhasar kasunyatan sing ora ana kang ngerti Nilai iki. Mulane iku perlu kanggo duwe kabeh nilai Hi lan bukti individu kanggo mbuktekaken bener H0.

Nanging, yen ana sawetara operasi ing titik ing kurva elips sing semantically padha karo multiplikasi, bukti bener H0 bakal ora pati penting, kita mung bakal nggawe manawa

H0 × G = p(0)G × H

Yen kurva sing dipilih ndhukung pasangan kurva elips, bukti iki dianggo. Ing kasus iki H0 ora mung output generator nomer acak, sing bisa diverifikasi dening peserta sing ngerti G,H и p(0) G. H0 uga minangka tandha ing pesen sing digunakake minangka wiji, sing dikonfirmasi k и n peserta mlebu pesen iki. Mangkono, yen wiji- punika hash saka pamblokiran ing protokol blockchain, banjur H0 iku loro multi-teken ing pemblokiran lan nomer acak apik banget.

Ing kesimpulan

Artikel iki minangka bagéan saka seri blog teknis NEAR. NEAR minangka protokol lan platform pamblokiran kanggo ngembangake aplikasi desentralisasi kanthi penekanan kanggo gampang pangembangan lan gampang digunakake kanggo pangguna pungkasan.

Kode protokol mbukak, implementasine kita ditulis ing Rust, bisa ditemokake kene.

Sampeyan bisa ndeleng apa pembangunan kanggo NEAR katon lan eksprimen ing IDE online kene.

Sampeyan bisa tindakake kabeh warta ing Russian ing grup telegram lan ing grup ing VKontakte, lan ing basa Inggris ing resmi twitter.

О скорых встреч!

Source: www.habr.com

Add a comment