Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

Héy Habr!

В bagian kahiji Dina artikel ieu, urang bahas naha éta bisa jadi diperlukeun pikeun ngahasilkeun angka acak pikeun pamilon anu teu percanten ka silih, naon sarat anu nempatkeun maju pikeun generator angka acak misalna, sarta dianggap dua pendekatan kana palaksanaan maranéhna.

Dina bagian artikel ieu, urang bakal nyandak katingal ngadeukeutan di pendekatan sejen anu ngagunakeun tanda tangan bangbarung.

Saeutik kriptografi

Pikeun ngartos kumaha tanda tangan bangbarung jalan, anjeun kedah ngartos kriptografi dasar sakedik. Urang bakal ngagunakeun dua konsép: skalar, atawa ngan ukur angka, anu bakal ditandaan ku hurup leutik (x, y) sareng titik-titik dina kurva elliptic, anu bakal ditandaan ku hurup kapital.

Pikeun ngartos dasar-dasar tanda tangan ambang, anjeun henteu kedah ngartos kumaha kurva elliptic jalan, sanés sababaraha hal dasar:

  1. Titik dina kurva elliptic bisa ditambahkeun jeung dikali skalar a (urang nuduhkeun multiplikasi ku skalar salaku xG, sanajan notasi Gx ogé mindeng dipaké dina sastra). Hasil tina tambahan sarta multiplikasi ku skalar mangrupa titik dina kurva elliptic.

  2. Nyaho ukur titik G jeung produk na kalawan skalar a xG teu bisa diitung x.

Urang ogé bakal ngagunakeun konsép polynomial a p(x) derajat k-1. Khususna, urang bakal nganggo sipat polinomial di handap ieu: upami urang terang nilaina p(x) keur naon k béda x (sareng kami henteu gaduh inpormasi langkung seueur ngeunaan p(x)), urang bisa ngitung p(x) keur saha deui x.

Éta metot nu keur polynomial nanaon p(x) jeung sababaraha titik dina kurva Gnyaho hartina p(x)G keur naon k béda harti x, urang ogé bisa ngitung p(x)G keur naon x.

Ieu mangrupikeun inpormasi anu cekap pikeun ngagali detil ngeunaan kumaha tanda tangan bangbarung jalan sareng cara ngagunakeunana pikeun ngahasilkeun nomer acak.

Generator angka acak dina tanda tangan bangbarung

Hayu urang nyebutkeun éta n pamilon rék ngahasilkeun jumlah acak, sarta kami hoyong saha pikeun ilubiung k aya cukup di antarana pikeun ngahasilkeun angka, tapi ku kituna panyerang anu ngadalikeun k-1 atawa pangsaeutikna pamilon teu bisa ngaduga atawa pangaruh jumlah dihasilkeun.

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

Anggap aya polynomial kitu p(x) derajat k-1 naon pamilon kahiji nyaho p (1), anu kadua terang p(2), teras salajengna (n- th nyaho p(n)). Urang ogé nganggap yén pikeun sababaraha titik predetermined G sadayana terang p(x)G pikeun sakabéh nilai x. Urang bakal nelepon p(i) "komponén pribadi" ipamilon th (sabab ngan ipamilon th nyaho dirina), jeung p(i)G "komponén umum" i-Pamilon th (sabab sakabeh pamilon nyaho dirina). Sakumaha anjeun émut, pangaweruh p(i)G teu cukup pikeun mulangkeun p(i).

Nyiptakeun polinomial sapertos kitu waé i-Pamilon kahiji sareng teu aya anu sanés terang komponén pribadina - ieu mangrupikeun bagian anu paling rumit sareng pikaresepeun tina protokol, sareng kami bakal nganalisis éta di handap. Pikeun ayeuna mah, hayu urang nganggap yen urang boga polynomial kitu jeung sakabeh pamilon nyaho komponén swasta maranéhanana.

Kumaha urang tiasa nganggo polinomial sapertos pikeun ngahasilkeun jumlah acak? Pikeun mimitian, urang peryogi sababaraha senar anu henteu kantos dianggo salaku input pikeun generator. Dina kasus blockchain, hash tina blok terakhir h mangrupakeun calon alus pikeun garis sapertos. Hayu pamilon rék nyieun angka acak ngagunakeun h kawas siki. Pamilon ngonversi heula h ka hiji titik dina kurva ngagunakeun sagala fungsi nu geus ditangtukeun:

H = skalarToPoint(h)

Lajeng unggal pamilon i ngitung jeung publishes Hi = p(i)H, naon bisa maranéhna ngalakukeun sabab nyaho p(i) jeung H. Panyingkepan Habdi teu ngidinan pamilon séjén mulangkeun komponén swasta ipamilon th, sarta ku kituna hiji set komponén swasta bisa dipaké ti blok ka blok. Ku kituna, algoritma generasi polynomial mahal dijelaskeun di handap ngan perlu dieksekusi sakali.

iraha k pamilon diotopsi Hi = p(i)H, dulur bisa ngitung Hx = p(x)H pikeun sadayana x hatur nuhun kana sipat polynomials nu urang bahas dina bagian panungtungan. Dina momen ieu, sadaya pamilon ngitung H0 = p(0)H, sareng ieu mangrupikeun nomer acak anu dihasilkeun. Punten dicatet yén teu aya anu terang p(0), sarta ku kituna hijina cara keur ngitung p(0)H – ieu interpolasi p(x)H, nu ngan mungkin lamun k nilai p(i)H dipikanyaho. Bukaan kuantitas anu langkung alit p(i)H henteu masihan inpormasi ngeunaan p(0)H.

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

Generator di luhur ngagaduhan sadaya pasipatan anu urang pikahoyong: panyerang ngan ukur ngadalikeun k-1 pamilon atawa kirang boga informasi atawa pangaruh kana kacindekan, bari sagala k pamilon bisa ngitung jumlah hasilna, sarta sagala sawaréh ti k pamilon bakal salawasna datang ka hasil anu sarua pikeun cikal sarua.

Aya hiji masalah anu urang taliti dihindari di luhur. Pikeun interpolasi jalan, hal anu penting yén nilai Hi nu diterbitkeun ku unggal pamilon i éta bener éta sarua p(i)H. Kusabab taya sahijieun iwal i-th pamilon teu nyaho p(i), taya sahijieun iwal i-pamilon th teu bisa pariksa yen Hi sabenerna diitung bener, sarta tanpa bukti cryptographic of correctness Habdi hiji lawan bisa nyebarkeun sagala nilai salaku Baraya, sarta wenang pangaruh kaluaran generator angka acak:

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2Béda nilai H_1 dikirim ku pamilon kahiji ngakibatkeun béda hasilna H_0

Sahenteuna aya dua cara pikeun ngabuktikeun kabeneran Habdi, urang bakal mertimbangkeun aranjeunna sanggeus urang nganalisis generasi polynomial nu.

Generasi polinomial

Dina bagian panungtungan urang nganggap yen urang boga polynomial misalna p(x) derajat k-1 yén pamilon i terang p(i), sareng teu aya anu sanés gaduh inpormasi ngeunaan nilai ieu. Dina bagian salajengna urang ogé bakal butuh nu keur sababaraha titik predetermined G dulur terang p(x)G pikeun sadayana x.

Dina bagian ieu urang bakal nganggap yén unggal pamilon lokal boga sababaraha konci swasta xi, Sapertos sadayana terang kana konci umum anu aya Xi.

Hiji kamungkinan protokol generasi polynomial nyaéta kieu:

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

  1. Unggal pamilon i sacara lokal nyiptakeun polinomial sawenang-wenang pi(x) darajat k-1. Aranjeunna lajeng ngirim unggal pamilon j harti pi(j), énkripsi ku konci umum Xj. Kitu waé i-th и j-th peserta nyaho pabdi (j). Pamilon i ogé umum ngumumkeun pi(j)G pikeun sadayana j от 1 ka k inklusif.

  2. Sadaya pamilon nganggo sababaraha konsensus pikeun milih k pamilon anu polinomial bakal dipaké. Kusabab sababaraha pamilon tiasa offline, urang teu tiasa ngantosan dugi sadayana n pamilon bakal nyebarkeun polynomials. Hasil tina léngkah ieu mangrupikeun set Z diwangun ku sahenteuna k polinomial dijieun dina hambalan (1).

  3. Pamilon mastikeun yén nilai anu aranjeunna terang pi(j) pakait jeung ngumumkeun masarakat awam pi(j)G. Saatos léngkah ieu Z ngan polynomials pikeun nu pribadi dikirimkeun pi(j) pakait jeung ngumumkeun masarakat awam pi(j)G.

  4. Unggal pamilon j ngitung komponén swasta na p(j) salaku jumlah pi(j) pikeun sakabéh i в Z. Unggal pamilon ogé ngitung sakabéh nilai p(x)G salaku jumlah pi(x)G pikeun sakabéh i в Z.

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

Catet éta p(x) - éta bener polinomial k-1, sabab éta jumlah individu pi(x), nu masing-masing mangrupakeun polinomial derajat k-1. Lajeng, dicatet yén bari unggal pamilon j terang p(j), aranjeunna teu boga informasi ngeunaan p(x) keur x ≠ j. Mémang, pikeun ngitung nilai ieu, aranjeunna kedah terang sadayana pi(x), sarta salami pamilon j teu nyaho sahenteuna salah sahiji polynomials dipilih, aranjeunna teu boga informasi cukup ngeunaan p(x).

Ieu sakabéh prosés generasi polynomial anu diperlukeun dina bagian panungtungan. Léngkah 1, 2 sareng 4 di luhur ngagaduhan palaksanaan anu cukup jelas. Tapi lengkah 3 teu jadi trivial.

Husus, urang kedah tiasa ngabuktikeun yén énkripsi pi(j) bener-bener luyu jeung nu diterbitkeun pi(j)G. Lamun urang teu bisa ngabuktikeun eta, penyerang i bisa ngirim sampah gantina pi(j) ka pamilon j, jeung pamilon j moal bisa meunangkeun nilai nyata pi(j), sarta moal bisa ngitung komponén swasta na.

Aya protokol kriptografi anu ngamungkinkeun anjeun nyiptakeun pesen tambahan buktii(j), sahingga sagala pamilon, ngabogaan sababaraha nilai e, oge buktina (j) и pi(j)G, tiasa sacara lokal pariksa éta e - éta bener pi(j), énkripsi sareng konci pamilon j. Hanjakal, ukuran bukti sapertos incredibly badag, sarta nunjukkeun yen perlu nyebarkeun O(nk) Bukti sapertos kitu teu tiasa dianggo pikeun tujuan ieu.

Gantina ngabuktikeun éta pi(j) соответствует pi(j)G urang tiasa ngalokasikeun waktos anu ageung pisan dina protokol generasi polinomial, dimana sadaya pamilon mariksa énkripsi anu ditampi. pi(j), sareng upami pesen anu didekripsi henteu cocog sareng masarakat pi (j) G, aranjeunna nyebarkeun buktina cryptographic yén pesen énkripsi aranjeunna nampi henteu leres. Buktikeun éta pesen teu соответствует pi(G) loba gampang ti ngabuktikeun yén éta cocog. Ieu kudu dicatet yén ieu merlukeun unggal pamilon pikeun némbongan online sahenteuna sakali salila waktu allotted pikeun nyieun bukti sapertos, sarta ngandelkeun asumsi yén lamun aranjeunna nyebarkeun bukti misalna hiji, éta bakal ngahontal sakabeh pamilon sejenna dina waktos allotted sarua.

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 2

Lamun hiji pamilon teu némbongan online salila periode waktu ieu, sarta anjeunna boga sahanteuna hiji komponén salah, mangka pamilon husus moal bisa ilubiung dina generasi angka salajengna. Protokol bakal kitu, masih fungsina lamun aya sahanteuna k pamilon anu boh ngan narima komponén bener atawa junun ninggalkeun bukti incorrectness dina jangka waktu nu ditangtukeun.

Bukti kabeneran H_i

Bagian anu terakhir anu tetep dibahas nyaéta kumaha ngabuktikeun kabeneran publikasi Habdi, nyaéta éta Hi = p(i)H, tanpa muka p(i).

Hayu urang inget yen nilai H, G, p(i)G umum jeung dipikawanoh ku dulur. Nampi operasi p(i) terang p(i)G и G disebut logaritma diskrit, atawa dlog, sareng kami hoyong ngabuktikeun yén:

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

tanpa panyingkepan p(i). Konstruksi pikeun bukti sapertos aya, contona Protokol Schnorr.

Kalawan desain ieu, unggal pamilon, babarengan jeung Hi ngirimkeun hiji bukti correctness nurutkeun rarancang.

Sakali jumlah acak dihasilkeun, éta mindeng perlu dipaké ku pamilon lian ti jalma anu dihasilkeun éta. Pamilon sapertos kitu, sareng nomerna, kedah ngirim sadayana Hi jeung bukti patali.

Hiji pamaca hayang weruh bisa nanya: saprak angka acak final nyaéta H0, jeung p(0)G – Ieu informasi umum, naha urang peryogi bukti pikeun tiap individu Habdi, naha henteu ngirim bukti yén gantina

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

Masalahna nyaéta bukti sapertos kitu henteu tiasa diciptakeun nganggo Protokol Schnorr sabab teu aya anu terang nilaina p (0), perlu nyieun buktina, sarta naon deui, sakabéh angka generator acak ieu dumasar kana kanyataan yén taya sahijieun weruh nilai ieu. Kituna perlu mibanda sagala nilai Hi jeung bukti individu maranéhanana pikeun ngabuktikeun correctness H0.

Sanajan kitu, lamun aya sababaraha operasi dina titik dina kurva elliptic nu semantically sarupa multiplication, bukti correctness. H0 bakal trivial, urang ngan saukur mastikeun yén

H0 × G = p(0)G × H

Lamun kurva dipilih ngarojong pasangan kurva elliptic, bukti ieu jalan. Dina hal ieu H0 teu ukur kaluaran tina generator angka acak, nu bisa diverifikasi ku sagala pamilon anu weruh G, H и p(0)G. H0 ogé tanda tangan dina pesen anu dianggo salaku siki, mastikeun yén k и n pamilon nandatanganan pesen ieu. Ku kituna, lamun bibit - nyaéta Hash tina blok dina protokol blockchain, teras H0 nyaeta duanana mangrupa multi-signature on blok jeung nomer acak pohara alus.

dina kacindekan

Tulisan ieu mangrupikeun bagian tina séri blog téknis DEUKEUT. NEAR mangrupikeun protokol blockchain sareng platform pikeun ngembangkeun aplikasi desentralisasi kalayan tekenan kana betah pangwangunan sareng betah dianggo pikeun pangguna akhir.

Kodeu protokol dibuka, palaksanaan kami ditulis dina Rust, éta tiasa dipendakan di dieu.

Anjeun tiasa ningali naon pamekaran pikeun NEAR sareng ékspérimén dina IDE online di dieu.

Anjeun tiasa nuturkeun sadaya warta dina basa Rusia di grup telegram jeung grup dina VKontakte, jeung dina basa Inggris dina resmi twitter.

Pendak deui engké!

sumber: www.habr.com

Tambahkeun komentar