Dado n
(el número de jugadores), t
(el valor del umbral) y s
(el secreto), n
generan 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. 251
ha sido elegido porque es el primo más grande representable por un entero sin signo de 8 bits.
- Genere
t-1
enteros aleatorios en el rango (inclusive)[0, 250]
. Etiquetar estos un 1 a través de un t-1 . - Construya un
t-1
polinomio de grado th usandos
como 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 unoz
en 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
s
será un número entero no negativo menor que251
,n
yt
será un número entero positivo menor251
y 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.
z
yf(z)
? Si imprimo una matriz def(z)
s en orden,z
está implícito en el índice.[[1, 5], [2, 2], [3, 9], [4, 14]]
no contiene más información que[5, 2, 9, 14]
.