Dado n(el número de jugadores), t(el valor del umbral) y s(el secreto), ngeneran los secretos generados por el algoritmo de intercambio secreto de Shamir .
El algoritmo
Para los propósitos de este desafío, los cálculos se realizarán en GF (251) (el campo finito de tamaño 251, también conocido como el número entero mod 251 ). Normalmente, el campo se elegiría de tal manera que su tamaño sea un primo mucho mayor que n. Para simplificar el desafío, el tamaño del campo será constante. 251ha sido elegido porque es el primo más grande representable por un entero sin signo de 8 bits.
- Genere
t-1enteros aleatorios en el rango (inclusive)[0, 250]. Etiquetar estos un 1 a través de un t-1 . - Construya un
t-1polinomio de grado th usandoscomo valor constante y los enteros aleatorios del paso 1 como los coeficientes de las potencias dex: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Salida
(f(z) mod 251)para cada unozen el rango (incluido)[1, n].
Implementación de referencia
#!/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)
Verificación
El siguiente fragmento de pila se puede utilizar para verificar salidas:
Reglas
sserá un número entero no negativo menor que251,nytserá un número entero positivo menor251y mayor que1. Además, tiene la garantía de que las entradas son válidas (significadot <= n).- La entrada y la salida pueden estar en cualquier formato razonable, inequívoco y consistente.
- Los números aleatorios se tomarán de una distribución uniforme: cada valor posible debe tener la misma probabilidad de ser elegido.
zyf(z)? Si imprimo una matriz def(z)s en orden,zestá implícito en el índice.[[1, 5], [2, 2], [3, 9], [4, 14]]no contiene más información que[5, 2, 9, 14].