Hei Habr!
В
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:
-
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.
-
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.
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.
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:
Nilai 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:
-
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
-
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).
-
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.
-
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.
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.
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
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
Sebagai kesimpulan
Artikel ini adalah bagian dari seri blog teknis
Kode protokol terbuka, implementasi kami ditulis dalam Rust, dapat ditemukan
Anda dapat melihat seperti apa pengembangan NEAR dan bereksperimen di IDE online
Anda dapat mengikuti semua berita dalam bahasa Rusia di
Sampai berjumpa lagi!
Sumber: www.habr.com