Mengingat n
(jumlah pemain), t
(nilai ambang), dan s
(rahasia), menampilkan n
rahasia yang dihasilkan oleh algoritma Berbagi Rahasia Shamir .
Algoritma
Untuk keperluan tantangan ini, perhitungan akan dilakukan dalam GF (251) (bidang ukuran terbatas 251
, atau dikenal sebagai bilangan bulat mod 251 ). Biasanya, bidang akan dipilih sedemikian rupa sehingga ukurannya adalah yang utama jauh lebih besar daripada n
. Untuk menyederhanakan tantangan, ukuran bidang akan konstan. 251
telah dipilih karena ini merupakan prime terbesar yang dapat diwakili oleh integer 8-bit unsigned.
- Hasilkan
t-1
bilangan bulat acak dalam rentang (inklusif)[0, 250]
. Label ini sebuah 1 melalui sebuah t-1 . - Bangun
t-1
derajat polinomial menggunakans
sebagai nilai konstan dan bilangan bulat acak dari langkah 1 sebagai koefisien dari kekuatanx
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Output
(f(z) mod 251)
untuk masing-masingz
dalam kisaran (inklusif)[1, n]
.
Implementasi Referensi
#!/usr/bin/env python
from __future__ import print_function
import random
import sys
# Shamir's Secret Sharing algorithm
# Input is taken on the command line, in the format "python shamir.py n t s"
n, t, s = [int(x) for x in sys.argv[1:4]]
if t > n:
print("Error: t must be less than or equal to n")
exit()
if n not in range(2, 251):
print("Error: n must be a positive integer less than 251")
exit()
if t not in range(2, 251):
print("Error: t must be a positive integer less than 251")
exit()
if s not in range(251):
print("Error: s must be a non-negative integer less than 251")
exit()
p = 251
a = [random.randrange(0, 251) for x in range(t-1)]
def f(x):
return s + sum(c*x**(i+1) for i,c in enumerate(a))
# Outputting the polynomial is for explanatory purposes only, and should not be included
# in the output for the challenge
print("f(x) = {0} + {1}".format(s, ' + '.join('{0}*x^{1}'.format(c, i+1) for i,c in enumerate(a))))
for z in range(1, n+1):
print(f(z) % p)
Verifikasi
Cuplikan Stack berikut dapat digunakan untuk memverifikasi output:
Aturan
s
akan menjadi bilangan bulat non-negatif kurang dari251
, dann
dant
akan menjadi bilangan bulat positif kurang dari251
dan lebih besar dari1
. Selanjutnya, Anda dijamin bahwa inputnya valid (artinyat <= n
).- Input dan output dapat dalam format yang masuk akal, tidak ambigu, dan konsisten.
- Nomor acak harus diambil sampelnya dari distribusi yang seragam - setiap nilai yang mungkin harus memiliki probabilitas yang sama untuk dipilih.
z
danf(z)
? Jika saya mencetak arrayf(z)
s secara berurutan,z
tersirat oleh indeks.[[1, 5], [2, 2], [3, 9], [4, 14]]
tidak mengandung informasi lebih dari[5, 2, 9, 14]
.