Étant donné n(le nombre de joueurs), t(la valeur seuil) et s(le secret), sortez les nsecrets 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. 251a été choisi car il s'agit du plus grand nombre premier représentable par un entier non signé 8 bits.
- Générez
t-1des entiers aléatoires dans la plage (inclusive)[0, 250]. Marquez ces un 1 par un t-1 . - Construire un
t-1polynôme de th degré en utilisantscomme 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 chacunzdans 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
ssera un entier non négatif inférieur à251, etnettsera un entier positif inférieur251et 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.
zetf(z)? Si j'imprime un tableau def(z)s dans l'ordre,zest impliqué par index.[[1, 5], [2, 2], [3, 9], [4, 14]]ne contient pas plus d'informations que[5, 2, 9, 14].