Étant donné n
(le nombre de joueurs), t
(la valeur seuil) et s
(le secret), sortez les n
secrets générés par l'algorithme de partage de secrets de Shamir .
L'algorithme
Aux fins de ce défi, les calculs seront effectués en GF (251) (le champ fini de taille 251
, autrement connu comme les entiers mod 251 ). Normalement, le champ serait choisi de telle sorte que sa taille soit un nombre premier bien supérieur à n
. Pour simplifier le défi, la taille du champ sera constante. 251
a été choisi car il s'agit du plus grand nombre premier représentable par un entier non signé 8 bits.
- Générez
t-1
des entiers aléatoires dans la plage (inclusive)[0, 250]
. Marquez ces un 1 par un t-1 . - Construire un
t-1
polynôme de th degré en utilisants
comme valeur constante et les entiers aléatoires de l'étape 1 comme coefficients des puissances dex
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * un t-1 . - Sortie
(f(z) mod 251)
pour chacunz
dans la plage (incluse)[1, n]
.
Implémentation de référence
#!/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)
Vérification
L'extrait de pile suivant peut être utilisé pour vérifier les sorties:
Règles
s
sera un entier non négatif inférieur à251
, etn
ett
sera un entier positif inférieur251
et supérieur à1
. De plus, vous êtes assuré que les entrées sont valides (ce qui signifiet <= n
).- L'entrée et la sortie peuvent être dans n'importe quel format raisonnable, sans ambiguïté et cohérent.
- Les nombres aléatoires doivent être échantillonnés à partir d'une distribution uniforme - chaque valeur possible devrait avoir une probabilité égale d'être choisie.
z
etf(z)
? Si j'imprime un tableau def(z)
s dans l'ordre,z
est impliqué par index.[[1, 5], [2, 2], [3, 9], [4, 14]]
ne contient pas plus d'informations que[5, 2, 9, 14]
.