Mengingat n(jumlah pemain), t(nilai ambang), dan s(rahasia), menampilkan nrahasia 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. 251telah dipilih karena ini merupakan prime terbesar yang dapat diwakili oleh integer 8-bit unsigned.
- Hasilkan
t-1bilangan bulat acak dalam rentang (inklusif)[0, 250]. Label ini sebuah 1 melalui sebuah t-1 . - Bangun
t-1derajat polinomial menggunakanssebagai 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-masingzdalam 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
sakan menjadi bilangan bulat non-negatif kurang dari251, danndantakan menjadi bilangan bulat positif kurang dari251dan 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.
zdanf(z)? Jika saya mencetak arrayf(z)s secara berurutan,ztersirat oleh indeks.[[1, 5], [2, 2], [3, 9], [4, 14]]tidak mengandung informasi lebih dari[5, 2, 9, 14].