Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

Hei Habr!

В bagian pertama Dalam artikel ini, kami membahas mengapa perlu menghasilkan angka acak bagi peserta yang tidak percaya satu sama lain, persyaratan apa yang diajukan untuk penghasil angka acak tersebut, dan mempertimbangkan dua pendekatan untuk penerapannya.

Di bagian artikel ini, kita akan melihat lebih dekat pendekatan lain yang menggunakan tanda tangan ambang batas.

Sedikit kriptografi

Untuk memahami cara kerja tanda tangan ambang batas, Anda perlu memahami sedikit kriptografi dasar. Kita akan menggunakan dua konsep: skalar, atau sekadar angka, yang akan kita nyatakan dengan huruf kecil (x, y) dan titik-titik pada kurva elips, yang akan kita nyatakan dengan huruf kapital.

Untuk memahami dasar-dasar tanda ambang batas, Anda tidak perlu memahami cara kerja kurva elips, selain beberapa hal dasar:

  1. Titik-titik pada kurva elips dapat dijumlahkan dan dikalikan dengan skalar (kita akan menyatakan perkalian dengan skalar sebagai xG, meskipun notasinya Gx juga sering digunakan dalam literatur). Hasil penjumlahan dan perkalian skalar adalah sebuah titik pada kurva elips.

  2. Hanya mengetahui intinya G dan produknya dengan skalar xG tidak dapat dihitung x.

Kami juga akan menggunakan konsep polinomial hal(x) derajat k-1. Secara khusus, kita akan menggunakan sifat polinomial berikut: jika kita mengetahui nilainya hal(x) untuk apa pun k berbeda x (dan kami tidak memiliki informasi lebih lanjut tentangnya hal(x)), kita bisa menghitungnya hal(x) untuk orang lain x.

Menariknya untuk polinomial apa pun hal(x) dan beberapa titik pada kurva Gmengetahui artinya hal(x)G untuk apa pun k arti yang berbeda x, kita juga bisa menghitung hal(x)G untuk apa pun x.

Informasi ini cukup untuk menggali detail tentang cara kerja tanda ambang batas dan cara menggunakannya untuk menghasilkan angka acak.

Generator nomor acak pada tanda tangan ambang batas

Katakanlah itu n peserta ingin membuat nomor acak, dan kami ingin siapa pun berpartisipasi k jumlah mereka cukup untuk menghasilkan angka, tetapi agar penyerang yang mengontrol k-1 peserta atau lebih sedikit tidak dapat memprediksi atau memengaruhi jumlah yang dihasilkan.

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

Misalkan ada polinomial seperti itu hal(x) derajat k-1 apa yang diketahui peserta pertama p (1), yang kedua tahu hal(2), dan seterusnya (n-aku tahu hal(n)). Kami juga berasumsi bahwa untuk beberapa titik yang telah ditentukan sebelumnya G semua orang tahu hal(x)G untuk semua nilai x. Kami akan menelepon hal(i) “komponen pribadi” ipeserta ke (karena saja ipeserta ke-th mengenalnya), dan babi “komponen publik” i-peserta (karena semua peserta mengenalnya). Seperti yang Anda ingat, pengetahuan babi tidak cukup untuk memulihkan hal (saya).

Membuat polinomial sedemikian rupa sehingga saja i-Peserta pertama dan tidak ada orang lain yang mengetahui komponen pribadinya - ini adalah bagian protokol yang paling rumit dan menarik, dan kami akan menganalisisnya di bawah. Untuk saat ini, anggap saja kita mempunyai polinomial seperti itu dan semua partisipan mengetahui komponen privatnya.

Bagaimana kita bisa menggunakan polinomial seperti itu untuk menghasilkan bilangan acak? Untuk memulainya, kita memerlukan beberapa string yang sebelumnya belum pernah digunakan sebagai input ke generator. Dalam kasus blockchain, hash dari blok terakhir h adalah kandidat yang baik untuk lini seperti itu. Biarkan peserta ingin membuat nomor acak menggunakan h seperti benih. Peserta melakukan konversi terlebih dahulu h ke suatu titik pada kurva menggunakan fungsi yang telah ditentukan sebelumnya:

H = skalarToPoint(h)

Kemudian masing-masing peserta i menghitung dan menerbitkan Hai = p(i)H, apa yang bisa mereka lakukan karena mereka tahu p(i) dan H. Pengungkapan Hsaya tidak mengizinkan peserta lain untuk memulihkan komponen pribadi ipeserta ke-th, dan oleh karena itu satu set komponen pribadi dapat digunakan dari blok ke blok. Oleh karena itu, algoritma pembangkitan polinomial mahal yang dijelaskan di bawah ini hanya perlu dijalankan satu kali.

Ketika k peserta diotopsi Hai = p(i)H, semua orang bisa menghitung Hx = hal(x)H untuk semua x berkat sifat polinomial yang telah kita bahas di bagian terakhir. Saat ini, semua peserta menghitung H0 = p(0)H, dan ini adalah nomor acak yang dihasilkan. Harap dicatat bahwa tidak ada yang tahu hal(0), dan karena itu satu-satunya cara untuk menghitung p(0)H – ini adalah interpolasi p(x)H, yang hanya mungkin terjadi ketika k nilai-nilai hal(i)H diketahui. Membuka jumlah yang lebih kecil hal(i)H tidak memberikan informasi apa pun tentang hal(0)H.

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

Generator di atas memiliki semua properti yang kita inginkan: hanya penyerang yang mengendalikan k-1 peserta atau kurang tidak memiliki informasi atau pengaruh terhadap kesimpulan, sementara ada k peserta dapat menghitung jumlah yang dihasilkan, dan subset apa pun k peserta akan selalu mendapatkan hasil yang sama untuk benih yang sama.

Ada satu masalah yang kami hindari dengan hati-hati di atas. Agar interpolasi berfungsi, penting bahwa nilainya Hi yang diterbitkan oleh masing-masing peserta i itu benar-benar sama hal(i)H. Karena tidak ada seorang pun kecuali i-peserta ke-th tidak tahu hal (saya), tidak seorang pun kecuali i-peserta tidak dapat memverifikasinya Hi sebenarnya dihitung dengan benar, dan tanpa bukti kebenaran kriptografis apa pun Hsaya seorang penyerang dapat mempublikasikan nilai apa pun sebagai Hai, dan secara sewenang-wenang mempengaruhi keluaran generator bilangan acak:

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2Nilai H_1 yang berbeda yang dikirimkan oleh peserta pertama menyebabkan H_0 yang dihasilkan berbeda

Setidaknya ada dua cara untuk membuktikan kebenarannya Hi, kami akan mempertimbangkannya setelah kami menganalisis pembuatan polinomial.

Generasi polinomial

Pada bagian terakhir kita berasumsi bahwa kita mempunyai polinomial seperti itu hal(x) derajat k-1 bahwa peserta i tahu hal(i), dan tidak ada orang lain yang memiliki informasi tentang nilai ini. Di bagian selanjutnya kita juga memerlukannya untuk beberapa titik yang telah ditentukan sebelumnya G semua orang tahu hal(x)G untuk semua x.

Pada bagian ini kita akan berasumsi bahwa setiap peserta secara lokal mempunyai beberapa kunci pribadi xi, sedemikian rupa sehingga semua orang mengetahui kunci publik yang sesuai Xi.

Salah satu protokol pembuatan polinomial yang mungkin adalah sebagai berikut:

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

  1. Setiap peserta i secara lokal membuat polinomial sewenang-wenang pi(x) derajat k-1. Mereka kemudian mengirimkan masing-masing peserta j nilai pi(j), dienkripsi dengan kunci publik Xj. Hanya demikian i-y и j-y peserta tahu paku j). Peserta i juga mengumumkan secara terbuka pi(j)G untuk semua j dari 1 untuk k inklusif

  2. Semua peserta menggunakan beberapa konsensus untuk memilih k peserta yang polinomialnya akan digunakan. Karena beberapa peserta mungkin offline, kami tidak dapat menunggu hingga semua peserta n peserta akan mempublikasikan polinomial. Hasil dari langkah ini adalah himpunan Z setidaknya terdiri dari k polinomial yang dibuat pada langkah (1).

  3. Peserta memastikan bahwa nilai-nilai yang mereka ketahui pi(j) sesuai dengan yang diumumkan secara publik pi(j)G. Setelah langkah ini masuk Z hanya polinomial yang ditransmisikan secara pribadi pi(j) sesuai dengan yang diumumkan secara publik pi(j)G.

  4. Setiap peserta j menghitung komponen pribadinya hal(j) sebagai jumlah psaya(j) untuk semua i в Z. Setiap peserta juga menghitung semua nilai hal(x)G sebagai jumlah pi(x)G untuk semua i в Z.

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

Harap dicatat bahwa hal(x) – itu benar-benar polinomial k-1, karena itu adalah jumlah individu pi(x), yang masing-masing merupakan polinomial derajat k-1. Kemudian, catatlah saat masing-masing peserta j tahu hal(j), mereka tidak memiliki informasi tentangnya hal(x) untuk x ≠j. Memang untuk menghitung nilai ini, mereka perlu mengetahui segalanya pi(x), dan selama peserta j tidak mengetahui setidaknya satu dari polinomial yang dipilih, mereka tidak memiliki informasi yang cukup tentangnya hal(x).

Ini adalah keseluruhan proses pembuatan polinomial yang diperlukan di bagian terakhir. Langkah 1, 2 dan 4 di atas memiliki implementasi yang cukup jelas. Namun langkah 3 bukanlah hal yang sepele.

Secara khusus, kita harus dapat membuktikan bahwa itu terenkripsi pi(j) benar-benar sesuai dengan yang dipublikasikan pi(j)G. Jika kita tidak bisa membuktikannya, penyerangnya i mungkin mengirim sampah sebagai gantinya pi(j) kepada peserta j, dan peserta j tidak akan bisa mendapatkan nilai sebenarnya pi(j), dan tidak akan dapat menghitung komponen privatnya.

Ada protokol kriptografi yang memungkinkan Anda membuat pesan tambahan buktii(j), sedemikian rupa sehingga setiap peserta, memiliki nilai tertentu e, maupun bukti(j) и pi(j)G, dapat memverifikasinya secara lokal e - itu benar pi(j), dienkripsi dengan kunci peserta j. Sayangnya, ukuran bukti tersebut sangat besar, dan mengingat hal itu perlu dipublikasikan O (nk) Bukti tersebut tidak dapat digunakan untuk tujuan ini.

Bukannya membuktikan hal itu pi(j) соответствует pi(j)G kita dapat mengalokasikan periode waktu yang sangat besar dalam protokol pembuatan polinomial, di mana semua peserta memeriksa enkripsi yang diterima pi(j), dan jika pesan yang didekripsi tidak sesuai dengan publik pi(j)G, mereka menerbitkan bukti kriptografi bahwa pesan terenkripsi yang mereka terima salah. Buktikan bahwa pesannya tidak соответствует babi) jauh lebih mudah daripada membuktikan bahwa itu cocok. Perlu dicatat bahwa hal ini mengharuskan setiap peserta untuk tampil online setidaknya sekali selama waktu yang ditentukan untuk membuat bukti tersebut, dan bergantung pada asumsi bahwa jika mereka mempublikasikan bukti tersebut, maka bukti tersebut akan sampai ke semua peserta lain dalam waktu yang sama.

Apakah mungkin menghasilkan angka acak jika kita tidak percaya satu sama lain? Bagian 2

Jika peserta tidak muncul online selama periode waktu ini, dan ia memiliki setidaknya satu komponen yang salah, maka peserta tersebut tidak akan dapat berpartisipasi dalam pembuatan nomor selanjutnya. Namun protokol tersebut akan tetap berfungsi jika setidaknya ada k peserta yang baru saja menerima komponen yang benar atau berhasil meninggalkan bukti kesalahan dalam waktu yang ditentukan.

Bukti kebenaran H_i

Bagian terakhir yang masih dibahas adalah bagaimana membuktikan kebenaran publikasi Hsaya, yaitu itu Hai = p(i)H, tanpa membuka hal (saya).

Mari kita ingat bahwa nilai-nilai H, G, p(i)G umum dan diketahui semua orang. Terima operasi hal(i) penuh arti babi и G disebut logaritma diskrit, atau kerja keras, dan kami ingin membuktikan bahwa:

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

tanpa pengungkapan hal(i). Konstruksi untuk pembuktian tersebut ada, misalnya Protokol Schnorr.

Dengan desain ini, setiap peserta beserta Hi mengirimkan bukti kebenaran sesuai desain.

Setelah nomor acak dihasilkan, sering kali nomor tersebut perlu digunakan oleh peserta selain mereka yang menghasilkannya. Peserta tersebut beserta nomornya harus mengirimkan semuanya Hi dan bukti terkait.

Pembaca yang ingin tahu mungkin bertanya: karena bilangan acak terakhir adalah H0, dan p(0)G – Ini informasi publik, kenapa perlu pembuktian bagi masing-masing individu Hi, kenapa tidak mengirimkan bukti itu saja

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

Masalahnya adalah bukti tersebut tidak dapat dibuat menggunakan Protokol Schnorr karena tidak ada yang mengetahui nilainya p (0), diperlukan untuk membuat bukti, dan terlebih lagi, seluruh penghasil bilangan acak didasarkan pada fakta bahwa tidak ada yang mengetahui nilai ini. Oleh karena itu perlu untuk memiliki semua nilai Hi dan bukti individualnya untuk membuktikan kebenarannya H0.

Namun jika terdapat operasi pada titik-titik pada kurva elips yang secara semantik mirip dengan perkalian, maka bukti kebenarannya H0 akan menjadi hal yang sepele, kami hanya akan memastikannya

H0 × G = p(0)G × T

Jika kurva yang dipilih mendukung pasangan kurva eliptik, bukti ini berhasil. Pada kasus ini H0 bukan hanya keluaran dari generator angka acak yang dapat diverifikasi oleh setiap peserta yang mengetahuinya G, H и hal(0)G. H0 juga merupakan tanda tangan pada pesan yang digunakan sebagai benih, mengonfirmasi hal itu k и n peserta menandatangani pesan ini. Jadi, jika benih - adalah hash dari blok dalam protokol blockchain H0 adalah multi-tanda tangan pada sebuah blok dan nomor acak yang sangat bagus.

Sebagai kesimpulan

Artikel ini adalah bagian dari seri blog teknis NEAR. NEAR adalah protokol dan platform blockchain untuk mengembangkan aplikasi terdesentralisasi dengan penekanan pada kemudahan pengembangan dan kemudahan penggunaan bagi pengguna akhir.

Kode protokol terbuka, implementasi kami ditulis dalam Rust, dapat ditemukan di sini.

Anda dapat melihat seperti apa pengembangan NEAR dan bereksperimen di IDE online di sini.

Anda dapat mengikuti semua berita dalam bahasa Rusia di grup telegram и в grup di VKontakte, dan dalam bahasa Inggris secara resmi Indonesia.

Sampai berjumpa lagi!

Sumber: www.habr.com

Tambah komentar