Verilen n
(oyuncu sayısı), t
(eşik değeri) ve s
(sır), Shamir'in Gizli Paylaşım algoritmasın
tarafından üretilen sırları çıkarır .
Algoritma
Bu zorluğun amaçları için, hesaplamalar GF (251) (sonlu boyut alanı 251
, aksi halde tamsayı mod 251 olarak bilinir ) içinde yapılacaktır. Normalde, alan, büyüklüğü çok daha büyük olacak şekilde seçilecektir n
. Zorluğu basitleştirmek için alan boyutu sabit olacaktır. 251
8 bit işaretsiz tamsayı ile temsil edilebilen en büyük asal olduğu için seçilmiştir.
t-1
(Kapsayıcı) aralığında rastgele tamsayılar oluşturun[0, 250]
. Bu etiket , bir 1 ile bir t-1 .- Sabit değer ve adım 1'den rastgele tamsayıları kullanarak güçlerin katsayıları olarak bir
t-1
derece polinomu oluşturun : f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * bir t-1 .s
x
- (Dahil) aralığındaki
(f(z) mod 251)
her biri için çıktı .z
[1, n]
Referans uygulaması
#!/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)
Doğrulama
Çıktıları doğrulamak için aşağıdaki Yığın Parçacığı kullanılabilir:
kurallar
s
daha az bir negatif olmayan bir tamsayı olacaktır251
ven
vet
daha pozitif tamsayı daha az olacaktır251
ve daha büyük1
. Ayrıca, girişlerin geçerli olduğu garanti edilir (anlamt <= n
).- Giriş ve çıkış makul, açık ve tutarlı bir formatta olabilir.
- Rastgele sayılar düzgün bir dağılımdan örneklenmelidir - olası her bir değerin eşit seçilme olasılığı olmalıdır.
z
vef(z)
? Birf(z)
s sırasını sırayla yazdırırsam ,z
dizin tarafından ima edilir.[[1, 5], [2, 2], [3, 9], [4, 14]]
daha fazla bilgi içermiyor[5, 2, 9, 14]
.