Hey Habr!
В
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:
-
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.
-
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.
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.
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:
Nilai 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:
-
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.
-
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).
-
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.
-
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.
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.
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
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
Ing kesimpulan
Artikel iki minangka bagéan saka seri blog teknis
Kode protokol mbukak, implementasine kita ditulis ing Rust, bisa ditemokake
Sampeyan bisa ndeleng apa pembangunan kanggo NEAR katon lan eksprimen ing IDE online
Sampeyan bisa tindakake kabeh warta ing Russian ing
О скорых встреч!
Source: www.habr.com