Cho n
(số lượng người chơi), t
(giá trị ngưỡng) và s
(bí mật), xuất ra các n
bí mật được tạo bởi thuật toán Chia sẻ bí mật của Shamir .
Thuật toán
Đối với mục đích của thử thách này, việc tính toán sẽ được thực hiện trong GF (251) (trường hữu hạn về kích thước 251
, còn được gọi là số nguyên mod mod 251 ). Thông thường, trường sẽ được chọn sao cho kích thước của nó lớn hơn nhiều so với n
. Để đơn giản hóa thử thách, kích thước trường sẽ không đổi. 251
đã được chọn vì nó là số nguyên tố lớn nhất có thể biểu thị bằng số nguyên không dấu 8 bit.
- Tạo
t-1
số nguyên ngẫu nhiên trong phạm vi (bao gồm)[0, 250]
. Nhãn này một 1 thông qua một t-1 . - Xây dựng một
t-1
đa thức bậc một sử dụngs
làm giá trị không đổi và các số nguyên ngẫu nhiên từ bước 1 làm hệ số của các lũy thừa củax
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * một t-1 . - Đầu ra
(f(z) mod 251)
cho mỗiz
trong phạm vi (bao gồm)[1, n]
.
Thực hiện tham khảo
#!/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)
xác minh
Đoạn mã sau đây có thể được sử dụng để xác minh đầu ra:
Quy tắc
s
sẽ là một số nguyên không âm nhỏ hơn251
, vàn
vàt
sẽ là các số nguyên dương nhỏ hơn251
và lớn hơn1
. Hơn nữa, bạn được đảm bảo rằng các đầu vào là hợp lệ (có nghĩat <= n
).- Đầu vào và đầu ra có thể ở bất kỳ định dạng hợp lý, rõ ràng và nhất quán.
- Các số ngẫu nhiên sẽ được lấy mẫu từ một phân phối đồng đều - mỗi giá trị có thể sẽ có xác suất được chọn bằng nhau.
z
vàf(z)
? Nếu tôi in một mảngf(z)
s theo thứ tự,z
được ngụ ý bởi chỉ mục.[[1, 5], [2, 2], [3, 9], [4, 14]]
không chứa nhiều thông tin hơn[5, 2, 9, 14]
.