Враховуючи n
(кількість гравців), t
(порогове значення) та s
(секрет), виведіть n
секрети, що генеруються алгоритмом «Таємного обміну Шаміра» .
Алгоритм
Для цілей цього виклику обчислення будуть проведені в GF (251) (кінцеве поле розміру 251
, інакше відоме як цілі числа mod 251 ). Зазвичай поле було б вибране таким, щоб його розмір був просто більшим, ніж n
. Щоб спростити виклик, розмір поля буде постійним. 251
було обрано тому, що це найбільше просте представлене 8-бітне ціле число, яке не підписується.
- Створення
t-1
випадкових цілих чисел у (включно) діапазоні[0, 250]
. Додайте ці з 1 через в Т-1 . - Побудуйте
t-1
многочленs
першого ступеня, використовуючи як постійне значення та випадкові цілі числа з кроку 1 як коефіцієнти потужностейx
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Вихідні дані
(f(z) mod 251)
для кожногоz
в (включно) діапазоні[1, n]
.
Довідкова реалізація
#!/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)
Перевірка
Наступний фрагмент стека може бути використаний для перевірки результатів:
Правила
s
буде невід'ємним цілим числом менше251
,n
іt
буде додатними цілими числами менше251
і більше, ніж1
. Крім того, ви гарантуєте, що введення є дійсними (сенсt <= n
).- Введення та вихід можуть бути у будь-якому розумному, однозначному та послідовному форматі.
- Випадкові числа слід вибирати з рівномірного розподілу - кожне можливе значення повинно мати однакову ймовірність вибору.
z
іf(z)
? Якщо я друкую масивf(z)
s по порядку,z
мається на увазі індекс.[[1, 5], [2, 2], [3, 9], [4, 14]]
не містить більше інформації, ніж[5, 2, 9, 14]
.