Dato n(il numero di giocatori), t(il valore di soglia) e s(il segreto), ngenera 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-1numeri interi casuali nell'intervallo (inclusivo)[0, 250]. Etichettare questi un 1 attraverso un t-1 . - Costruisci un
t-1polinomio di secondo grado usandoscome 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 ciascunoznel 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
ssarà un numero intero non negativo minore di251enetsarà un numero intero positivo minore di251e 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.
zef(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].