Dato n
(il numero di giocatori), t
(il valore di soglia) e s
(il segreto), n
genera i segreti generati dall'algoritmo Shamir's Secret Sharing .
L'algoritmo
Ai fini di questa sfida, i calcoli verranno eseguiti in GF (251) (il campo di dimensioni finito 251
, altrimenti noto come numeri interi mod 251 ). Di solito, il campo sarebbe scelto in modo tale che la sua dimensione sia un numero molto maggiore di n
. Per semplificare la sfida, la dimensione del campo sarà costante. 251
è stato scelto perché è il primo più grande rappresentabile da un numero intero senza segno a 8 bit.
- Genera
t-1
numeri interi casuali nell'intervallo (inclusivo)[0, 250]
. Etichettare questi un 1 attraverso un t-1 . - Costruisci un
t-1
polinomio di secondo grado usandos
come valore costante e gli interi casuali dal passaggio 1 come coefficienti dei poteri dix
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Output
(f(z) mod 251)
per ciascunoz
nel range (incluso)[1, n]
.
Implementazione di riferimento
#!/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)
Verifica
Il seguente frammento di stack può essere utilizzato per verificare gli output:
Regole
s
sarà un numero intero non negativo minore di251
en
et
sarà un numero intero positivo minore di251
e maggiore di1
. Inoltre, hai la garanzia che gli input siano validi (significatot <= n
).- L'input e l'output possono essere in qualsiasi formato ragionevole, inequivocabile e coerente.
- I numeri casuali devono essere campionati da una distribuzione uniforme - ogni valore possibile dovrebbe avere la stessa probabilità di essere scelto.
z
ef(z)
? Se stampo una matrice dif(z)
s in ordine,z
è implicito dall'indice.[[1, 5], [2, 2], [3, 9], [4, 14]]
non contiene più informazioni di[5, 2, 9, 14]
.