শামিরের সিক্রেট শেয়ারিং


17

প্রদত্ত n(খেলোয়াড়ের সংখ্যা), t(প্রান্তিক মান) এবং s(গোপনীয়তা) শামির সিক্রেট শেয়ারিং অ্যালগরিদমn দ্বারা উত্পন্ন গোপনগুলি আউটপুট দেয় ।

অ্যালগরিদম

এই চ্যালেঞ্জের উদ্দেশ্যে, গণনাগুলি জিএফ (251) (আকারের সীমাবদ্ধ ক্ষেত্র 251, অন্যথায় পূর্ণসংখ্যা 251 হিসাবে পরিচিত ) এ করা হবে। সাধারণত, ক্ষেত্রটি এমনটি বেছে নেওয়া হবে যে এর আকারটি তার চেয়ে অনেক বেশি বড় n। চ্যালেঞ্জকে সহজ করার জন্য, ফিল্ডের আকারটি স্থির থাকবে। 251এটি বেছে নেওয়া হয়েছে কারণ এটি 8-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার দ্বারা সবচেয়ে বড় প্রধান প্রতিনিধিত্বযোগ্য।

  1. t-1(অন্তর্ভুক্ত) ব্যাপ্তিতে এলোমেলো পূর্ণসংখ্যা তৈরি করুন [0, 250]। এই লেবেল একটি 1 মাধ্যমে একটি টি-1
  2. একটি নির্মানের t-1ম ডিগ্রী বহুপদী ব্যবহার sধ্রুবক মান হিসাবে এবং ক্ষমতা কোফিসিয়েন্টস হিসাবে ধাপ 1 থেকে র্যান্ডম পূর্ণসংখ্যার x: চ (x) = গুলি + X * একটি 1 + X 2 * একটি 2 ... + X T- 1 * একটি টি -1
  3. (অন্তর্ভুক্ত) ব্যাপ্তির (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)।
  • ইনপুট এবং আউটপুট যে কোনও যুক্তিসঙ্গত, দ্ব্যর্থহীন এবং সামঞ্জস্যপূর্ণ ফর্ম্যাটে হতে পারে।
  • অবিচ্ছিন্ন বিতরণ থেকে এলোমেলো সংখ্যাগুলি নমুনা করতে হয় - প্রতিটি সম্ভাব্য মানটি বেছে নেওয়ার সমান সম্ভাবনা থাকা উচিত।

1
আমাদের কি আউটপুট দিতে হবে z এবং f(z) ? যদি আমি f(z)ক্রমানুসারে একটি অ্যারে মুদ্রণ করি তবে zসূচক দ্বারা প্রেরণ করা হয়। [[1, 5], [2, 2], [3, 9], [4, 14]]এর চেয়ে বেশি তথ্য ধারণ করে না [5, 2, 9, 14]
orlp


@orlp ফেয়ার পয়েন্ট
মেগো

কোন টেস্টকেস?
লিকি নুন

4
@ ল্যাকিয়ুনুন যেহেতু এই প্রশ্নটি এলোমেলোভাবে ট্যাগ করা হয়েছে , তাই আমি মনে করি যাচাইয়ের স্নিপেট পরীক্ষার মামলার তুলনায় অনেক বেশি মূল্যবান যা প্রতিটি রানের ক্ষেত্রে পৃথক হবে।
FryAmTheEggman

উত্তর:


13

জেলি , 15 বাইট

251©xX€⁵0¦ḅЀ%®

কমান্ড-লাইন আর্গুমেন্ট হিসাবে t , n , এবং গুলি আশা করে । এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

251©xX€⁵0¦ḅЀ%®  Main link. Left argument: t. Right argument: n Third argument: s

251©             Yield 251 and copy it to the register.
    x            Repeat [251] t times.
     X€          Random choice each; pseudo-randomly choose t integers from
                 [1, ..., 251]. Since 251 = 0 (mod 251), this is equivalent to
                 choosing them from [0, ..., 250].
       ⁵0¦       Replace the last generated integer (index 0) with s (⁵).
          ḅЀ    Interpret the resulting array as a base-k number, for each k in
                 [1, ..., n], and convert to integer.
              ®  Yield 251 from the register.
             %   Take the generated integers modulo 251.

3
শেষের পূর্ণসংখ্যার প্রতিস্থাপনটি এত মার্জিত :) :)
লিন

8

গণিত, 59 56 বাইট

Mod[Power~Array~{#2,#-1}.RandomInteger[250,#-1]+#3,251]&

টি , এন এবং এস অর্ডারে তিনটি আর্গুমেন্ট নেয় । এন সারি এবং টি -1 কলাম সহ 2 ডি-অ্যারে তৈরি করে । প্রতিটি সারি ভেক্টর জে , 1 থ্রু এন থেকে সংখ্যাযুক্ত , থ্রু জে টি -1 এর শক্তি ধারণ করে । তারপরে 0 থ্রু 250 এর মধ্যে পরিসীমাটিতে এলোমেলো পূর্ণসংখ্য সহগের একটি ভেক্টর টি দিয়ে তৈরি করা হয় -1 মানযে ম্যাট্রিক্স-গুন 2d-বিন্যস্ত সাথে আছেন, এবং তারপর উপাদান ভিত্তিক এবং মডিউল 251 নেওয়া এর প্রতিটি বহুপদী মান পেতে যোগ করা হয় এন পয়েন্ট।


1
ঠিক একটি 79-বাইট উত্তর পোস্ট করতে চলেছি, সঙ্গে দুর্দান্ত কৌশল Sum!
LegionMammal978

1
আমি একটি ভিন্ন পদ্ধতির পেয়েছি, কিন্তু এটি বর্তমানে দুটি বাইট দীর্ঘ। এটি কীভাবে সংক্ষিপ্ত করবেন কীভাবে আপনার ধারণা থাকতে পারে:Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
মার্টিন এন্ডার



3

জাভাস্ক্রিপ্ট, 181 বাইট

(n,t,s)=>{r=Array(t-1).fill(0).map($=>{return Math.random()*251});f=(x=>{p = 0;r.map((k,c)=>p+=k*Math.pow(x, c));return s+p});_=Array(t-1).fill(0);_.map((l,i)=>_[i]=f(i));return _;}

Ungolfed:

(n, t, s) => {
    r = Array(t - 1).fill(0).map($ =>{return Math.random() * 251});
    f = (x => {
        p = 0;
        r.map((k, c) => p += k * Math.pow(x, c));
        return s + p
    });
    _ = Array(t - 1).fill(0);
    _.map((l, i) => _[i] = f(i));
    return _;
}

আমি কীভাবে এটি সঠিকভাবে চেক করতে জানি না, তবে আমি জানি যে জেএসকে নতুন অ্যারে জুড়ে মানচিত্রটি পাওয়া যেহেতু আপাতভাবে .mapঅনির্ধারিত মানগুলিকে এড়িয়ে চলেছে তা বেদনাদায়ক ছিল । যদি কেউ উন্নতির কোনও উপায় বা ত্রুটিগুলি দেখেন তবে আমাকে জানাতে দ্বিধা করবেন না।


123 বাইট:(n,t,s,A=f=>Array(t-1).fill(0).map(f),r=A($=>Math.random()*251))=> A((l,i,_,p=0)=>(r.map((k,c)=>p+=k*Math.pow(i,c)),s+p))
ডেনড্রোবিয়াম

আপনি ব্যবহার করছেন না n, যা ভুল বলে মনে হচ্ছে। আপনার কোডটিও 1-ভিত্তিক সূচকটি ধরে নিয়েছে বলে মনে হচ্ছে। [...Array()]একটু খাটো fiil()। এছাড়াও, শেষ দুটি লাইন হ্রাস করা যেতে পারেreturn _.map(f);
নীল

3

সি #, 138 134 বাইট

(n,t,s)=>new int[n+1].Select((_,x)=>(s+new int[t-1].Select(k=>new Random(e).Next(251)).Select((c,i)=>c*Math.Pow(x+1,i+1)).Sum())%251);

সি # ল্যাম্বদা যেখানে ইনপুট থাকে intএবং আউটপুট হয় একটি IEnumerable<double>। আপনি নেট কোডের উপর আমার কোড চেষ্টা করতে পারেন

আমি আমার অ্যালগরিদমের বৈধতা সম্পর্কে 100% নিশ্চিত নই, যদি আমি কিছু ভুল বুঝি তবে মন্তব্য করুন।

@ রাগির কৌতুক সহ 4 বাইট সংরক্ষণ করা হয়েছে ।


3

এমএটিএল , 20 19 বাইট

251tliq3$Yrihi:ZQw\

ইনপুট অর্ডার t, s, n

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

251t    % Push 251 twice
l       % Push 1
iq      % Take input t. Subtract 1
3$Yr    % Generate t-1 random integers in [1 2 ... 251]
ih      % Take input s. Concatenate with the random integers
i:      % Take input n. Generate range [1 2 ... n]
ZQ      % Evvaluate polynomial at those values
w       % Swap to move copy og 251 to the top of the stack
\       % Modulo. Implicitly display


1

জাভাস্ক্রিপ্ট (ES6), 116 বাইট

(n,t,s)=>[...Array(n)].map((_,i)=>++i&&t.reduce((r,a)=>r*i+a)%251,t=[...Array(t)].map(_=>--t?Math.random()*251|0:s))

আমি মনে করি এই বিরল ক্ষেত্রে যেখানে এক চাই reduceবিটের map


1

পাইপথন 3 নুমপি , 103 বাইট সহ

from numpy import*
lambda n,t,s:[poly1d(append(random.randint(0,251,t-1),s))(i+1)%251for i in range(n)]

আমি সত্যই বলতে পারি যে আমি কখনই কোড গল্ফের জন্য NumPy ব্যবহার করার আশা করিনি ...

একটি বেনাম ফাংশন যা যুক্তির মাধ্যমে ইনপুট নেয় এবং একটি তালিকা দেয়।

কিভাবে এটা কাজ করে

from numpy import*         Import everything in the NumPy library
lambda n,t,s...            Function with input number of players n, threshold value t and
                           secret s
random.randint(0,251,t-1)  Generate a NumPy array R of t-1 random integers in [0,250]
append(...,s)              Append s to R
poly1d(...)                Generate a polynomial p of order t-1 with coefficients R and
                           constant term s
...for i in range(n)       For all integers i in [0,n-1]...
...(i+1)                   ...evaluate p(i+1), so for all integers in [1,n]...
...%251                    ...and take modulo 251
...:[...]                  return as list

আইডিয়নে চেষ্টা করে দেখুন


1

জে , 32 30 বাইট

251|(1+i.@{.)p.~{:0}251?@#~1&{

N , t এবং s এর মানগুলির সাথে একটি তালিকা নেয় ।

@ ডেনিসের সমাধান থেকে সূচক 0 ধারণাটি প্রতিস্থাপন ব্যবহার করে 2 বাইট সংরক্ষণ করা হয়েছে ।

ব্যাখ্যা

251|(1+i.@{.)p.~{:0}251?@#~1&{  Input: [n t s]
                           1&{  Select at index 1 (t)
                    251  #~     Create that many copies of 251
                       ?@       Generate that many random integers in [0, 251)
                {:              Get the tail of the input (s)
                  0}            Replace the value at index 0 of the random integer list
                                with s to make a coefficient list of the polynomial
          {.                    Get the head of the input (n)
       i.@                      Make the range [0, n-1]
     1+                         Add 1 to each to get [1, n]
             p.~                Evaluate the polynomial at each value [1, n]
251|                            Take each value mod 251 and return

0

জাভা 8, 224 বাইট:

(n,t,s)->{int[]W=new int[t-1];for(int i=0;i<t-1;i++){W[i]=new java.util.Random().nextInt(251);};long[]O=new long[n];for(int i=1;i<=n;i++){long T=0;for(int h=1;h<t;h++){T+=W[h-1]*Math.pow(i,h);}O[i-1]=((T+s)%251);}return O;};

একটি জাভা 8 লাম্বদা এক্সপ্রেশন। কমা দ্বারা পৃথককৃত পূর্ণসংখ্যার অ্যারের আউটপুট দেয় এবং আউটপুট অ্যারেতে জাভা longবা 64৪-বিট স্বাক্ষরিত পূর্ণসংখ্যা, ডেটা টাইপ, যার উপরে অ্যারেতে আউটপুট থাকে তার পরিসীমা অতিক্রম না হওয়া পর্যন্ত পুরোপুরি কাজ করে -200

এটি অনলাইন চেষ্টা করুন! (Ideone)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.