यह देखते हुए n
(खिलाड़ियों की संख्या), t
(थ्रेशोल्ड वैल्यू), और s
(सीक्रेट), शमीर के सीक्रेट शेयर एल्गोरिथ्मn
द्वारा उत्पन्न रहस्यों को आउटपुट करता है ।
एल्गोरिथ्म
इस चुनौती के प्रयोजनों के लिए, गणना GF (251) (आकार के परिमित क्षेत्र 251
, अन्यथा पूर्णांक मॉड 251 के रूप में जाना जाता है ) में की जाएगी। आमतौर पर, फ़ील्ड को इस तरह चुना जाएगा कि उसका आकार एक अभाज्य से अधिक हो n
। चुनौती को सरल बनाने के लिए, क्षेत्र का आकार स्थिर रहेगा। 251
चुना गया है क्योंकि यह 8-बिट अहस्ताक्षरित पूर्णांक द्वारा सबसे बड़ा अभाज्य अभाज्य है।
- उत्पन्न
t-1
(सम्मिलित) रेंज में यादृच्छिक पूर्णांकों[0, 250]
। इन लेबल करें एक 1 के माध्यम से एक टी 1 । - लगातार मूल्य और चरण 1 से यादृच्छिक पूर्णांकों के रूप में
t-1
उपयोग कर एक वें डिग्री बहुपद का निर्माण करें :s
शक्तियों की गुणांक के रूप मेंx
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * एक टी -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)
क्रम में एस की एक सरणी प्रिंट करता हूं ,z
तो सूचकांक द्वारा निहित है।[[1, 5], [2, 2], [3, 9], [4, 14]]
से अधिक जानकारी नहीं है[5, 2, 9, 14]
।