ป.ร. ให้ไว้n
(จำนวนของผู้เล่น) t
(ค่าเกณฑ์) และs
(ความลับ) เอาท์พุทn
ลับที่สร้างขึ้นโดยอัลกอริทึมที่ใช้ร่วมกันความลับของมิร์
อัลกอริทึม
สำหรับจุดประสงค์ของการท้าทายนี้การคำนวณจะกระทำในGF (251) (เขตข้อมูลขนาด จำกัด251
หรือที่รู้จักกันในชื่อจำนวนเต็มmod 251 ) ตามปกติแล้วฟิลด์จะถูกเลือกเพื่อให้ขนาดของมันใหญ่กว่าn
มาก เพื่อลดความท้าทายขนาดของสนามจะคงที่ 251
ได้รับเลือกเนื่องจากเป็นจำนวนที่ใหญ่ที่สุดที่สามารถแทนได้โดยเลขจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อ
- สร้าง
t-1
จำนวนเต็มสุ่มใน (รวม)[0, 250]
ช่วง ป้ายเหล่านี้1ผ่านT-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)
การตรวจสอบ
Stack Snippet ต่อไปนี้สามารถใช้เพื่อตรวจสอบผลลัพธ์:
กฎระเบียบ
s
จะเป็นจำนวนเต็มไม่เป็นลบน้อยกว่า251
และn
และt
จะเป็นจำนวนเต็มบวกน้อยกว่าและมากกว่า251
1
นอกจากนี้คุณรับประกันได้ว่าปัจจัยการผลิตที่ถูกต้อง (ความหมายt <= n
)- อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่สมเหตุสมผลไม่คลุมเครือและสอดคล้องกัน
- สุ่มตัวเลขที่จะสุ่มตัวอย่างจากการกระจายเครื่องแบบ - แต่ละค่าที่เป็นไปได้ควรมีความน่าจะเป็นเท่ากันของการเลือก
z
และf(z)
? ถ้าฉันสั่งพิมพ์อาเรย์ของf(z)
เรียงตามลำดับz
จะถูกบอกเป็นนัยโดยดัชนี ไม่ได้มีข้อมูลมากกว่า[[1, 5], [2, 2], [3, 9], [4, 14]]
[5, 2, 9, 14]