সিফারস্যাবার এনক্রিপশন


11

নীচে বর্ণিত হিসাবে একটি সাইফার সাবার এনক্রিপশন প্রোগ্রাম প্রয়োগ করুন । নির্দেশিকা:

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

সিফারস্যাবারটি আরসি 4 / আর্কফুরের একটি বৈকল্পিক, সুতরাং আমি পরবর্তীকালের বর্ণনা দিয়ে শুরু করব, তারপরে সিফারস্যাবারটি তার পরিবর্তনগুলি করে।

0. আরসি 4 / আর্কফোর

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

কী সেটআপ

দুটি অ্যারে Sএবং S2256 দৈর্ঘ্যের উভয়ই সেট আপ করুন যেখানে k_1কীটির প্রথম বাইট এবং k_nশেষটি।

S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]

( S2সমস্ত 256 বাইট পূরণ না হওয়া পর্যন্ত বার বার কীটির বাইটগুলি দিয়ে পূর্ণ করা হয়))

তারপরে, j0 থেকে আরম্ভ করুন এবং 256 বার এলোমেলো করুন:

j = 0
for i in (0 .. 255)
    j = (j + S[i] + S2[i]) mod 256
    swap S[i], S[j]
end

এটি কী সেটআপ সম্পূর্ণ করে। S2অ্যারে আর এখানে ব্যবহৃত হয়, এবং ধৌত করা যেতে পারে।

সাইফার স্ট্রিম জেনারেশন

আরম্ভ করুন iএবং j0 এ, তারপরে নিম্নলিখিত স্ট্রিমটি উত্পন্ন করুন:

i = 0
j = 0
while true
    i = (i + 1) mod 256
    j = (j + S[i]) mod 256
    swap S[i], S[j]
    k = (S[i] + S[j]) mod 256
    yield S[k]
end

এনক্রিপ্ট / ডিক্রিপ্টিং ডেটা

  • এনক্রিপ্ট করতে, XOR প্লেইন টেক্সট সহ মূলধারার আউটপুট
  • ডিক্রিপ্ট করার জন্য, সিফেরেক্সটেক্সট সহ কী-স্ট্রিম আউটপুট এক্সওআর করুন

1. সাইফারস্যাবার

সাইফারস্যাবার (যা আমরা এই প্রশ্নে প্রয়োগ করছি) এটি দুটি উপায়ে আরসি 4 / আর্কফুরের একটি বৈচিত্র্য:

10-বাইট চতুর্থ / ননস

কোনও বার্তা এনক্রিপ্ট করার সময়, 10 টি এলোমেলো বাইটগুলি পাওয়া উচিত, যেমন মাধ্যমে /dev/urandom, এবং এনক্রিপ্ট করা আউটপুটটির প্রথম 10 বাইটে লেখা উচিত। কোনও বার্তা ডিক্রিপ্ট করার সময়, ইনপুটটির প্রথম 10 বাইট হ'ল IV এটি এনক্রিপ্ট করতে ব্যবহৃত হয়।

আরসি 4 / আরকফোর কী সেটআপ স্টেজটি কী passphrase || IVহিসাবে চালিত হয় , যেখানে passphraseব্যবহারকারী-নির্দিষ্ট পাসফ্রেজটি IVউপরে বর্ণিত হিসাবে বর্ণনা করা হয়েছে, এবং সংক্ষিপ্তকরণ ||। সুতরাং, "হ্যালো, বিশ্ব!" এর একটি পাসফ্রেজ এবং "সুপারকালিফ" এর আইভি (যদিও এটি অসম্ভব: অসম্ভব) এর ফলশ্রুতিতে "হ্যালো, ওয়ার্ল্ড! সুপার ক্যালিফ" এর চাবি তৈরি হবে।

কী সেটআপের একাধিক পুনরাবৃত্তি

ডাব্লুইইপি এনক্রিপশনকে পুরোপুরি ভাঙা করে তোলে এমন দুর্বলতা রোধে সহায়তার জন্য, আরসি 4-র কী সেটআপ পর্বের শিফলিং লুপটি একটি ব্যবহারকারী-নির্দিষ্ট সংখ্যক বার চালিত হয়। jপুনরাবৃত্তির মধ্যে মানটি ধরে রাখা উচিত should

2. পরীক্ষা ভেক্টর

আপনার প্রোগ্রামগুলি পরীক্ষা করতে আপনি কয়েকটি পরীক্ষামূলক ভেক্টর ব্যবহার করতে পারেন। তদ্ব্যতীত, খুঁতখুঁতে ossifrage একটি নির্মিত CipherSaber এনক্রিপশন & ডিক্রিপশন টুল যা আপনি আপনার ফলাফল যাচাই করতে ব্যবহার করতে পারেন।

আপনার কেবলমাত্র এনক্রিপশন প্রোগ্রামটি প্রয়োগ করতে হবে। আপনার ডিক্রিপশন প্রোগ্রাম সরবরাহ করার দরকার নেই, তবে সঠিক কী ব্যবহার করে সঠিকভাবে প্রয়োগ করা ডিক্রিপশন প্রোগ্রামের সাথে প্রক্রিয়া করার সময় আপনার এনক্রিপশন প্রোগ্রামটির আউটপুট অবশ্যই মূল ইনপুটটিতে সঠিকভাবে গোলটেপ করা উচিত।

উত্তর:


7

পাইথ, 100 বাইট

$import os$KsM$os.urandom(10)$JuuXN@LN,T=+Z+@NT@+CMzKT)bGQU=b256=Z0sCM+K.exCb@=XJ=N@LJ,hk=+Z@Jhk)sNw

এই স্ক্রিপ্টটি $কমান্ডটি ব্যবহার করে যা পাইথন কোড চালানোর অনুমতি দেয়। সার্ভারে দূষিত কোড চালানো রোধ করতে, এই আদেশটি অনলাইন সংকলকটিতে অক্ষম করা হয়েছে। আপনাকে এটি অফ-লাইন সংকলক দিয়ে চালাতে হবে যা আপনি এখানে খুঁজে পেতে পারেন ।

ইনপুটটি ফর্ম্যাটে রয়েছে:

secret key
5 (number of repeats)
secret message

প্রোগ্রামটি এনক্রিপ্ট করা স্ট্রিংকে আউটপুট দেয়, এতে অক্ষয় অক্ষর থাকতে পারে। আপনি যদি সিফারস্যাবার এনক্রিপশন এবং ডিক্রিপশন সরঞ্জামটি ব্যবহার করে এটি যাচাই করতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন যা স্ট্রিংটিকে হেক্সাডেসিমাল ডিজিটের একটি সিরিজে রূপান্তর করে।

$import os$KsM$os.urandom(10)$JuuXN@LN,T=+Z+@NT@+CMzKT)bGQU=b256=Z0         
jdm.[2.HCd`0
sCM+K.exCb@=XJ=N@LJ,hk=+Z@Jhk)sNw

পাইথ ক্রিপ্টোগ্রাফিক সুরক্ষিত সিউডোর্যান্ডম সংখ্যাগুলি সমর্থন করে না এবং পাইথন থেকে এগুলি আমদানি করতে 25 বাইট লাগে। একটি সংক্ষিপ্ত কোড, যা পাইথের / পাইথনের সাধারণ সিউডোর্যান্ডম-নম্বর জেনারেটর ব্যবহার করে এবং অনলাইন সংকলকটিতেও কাজ করে:

KmO=b256TJuuXN@LN,T=+Z+@NT@+CMzKT)bGQUb=Z0sCM+K.exCb@=XJ=N@LJ,hk=+Z@Jhk)sNw

অনলাইনে এটি ব্যবহার করে দেখুন: স্ট্রিং বা হেক্সাডেসিমাল ডিজিটের একটি সিরিজ ফেরত

কোডটি বিশেষ কিছু নয়। কেবলমাত্র প্রচুর নোংরা অ্যাসাইনমেন্ট এবং তাত্ক্ষণিক গণিত ফলাফলগুলির পুনরায় ব্যবহার এবং তালিকা-অদলবদলের কৌশলটি দ্বিগুণ প্রয়োগ করা ।

ব্যাখ্যা:

                                  implicit: z = 1st input (= key string)
                                  Q = 2nd input (number of repetitions)
$import os$KsM$os.urandom(10)$
$import os$                       import Python's os module
              $os.urandom(10)$    create 10 cryptographically secure 
                                  pseudo-random bytes
            sM                    convert them to ints
           K                      store them in K

JuuXN@LN,T=+Z+@NT@+CMzKT)bGQU=b256
                             =b256assign b with 256
 u                         QUb    start with G = [0, 1, ..., 255], 
                                  evaluate the following expression Q times and
                                  update G with the result each time:
  u                      bG         start with N = G, 
                                    for each T in [0, 1, ..., 255] evaluate the
                                    following expression and update N each time:
                   CMz                convert key to list of ints
                  +   K               extend it with K
                 @     T              take the Tth element (modulo length)
              @NT                     take the Tth element of N
             +                        add these two values
           +Z                         add Z (with is initially 0)
          =                           and update Z with the result
        ,T  Z                         make the pair of indices [T, Z] 
     @LN                              look-up their values in N
   XN                   )             and switch these two values in N
J                                 assign the result (the key setup) to J

=Z0                               set Z to 0

sCM+K.exCb@=XJ=N@LJ,hk=+Z@Jhk)sNw 
                                w read a string from input (message)
     .e                           map each index k, char b in message to:
                         @Jhk       look-up the (k+1)th element in J
                      =+Z           add it to Z and update Z
                   ,hk  Z           make the pair of indices [k+1,Z]
                @LJ                 look-up their values in J
              =N                    assign the result to N
            XJ N             )      swap these values in J
           =                        and update J with the result
          @  J                sN    take the sum(N)th element of J
        Cb                          convert b to int
       x                            bitwise xor of these two elements
   +K                             insert K at the beginning
 CM                               convert each element to char
s                                 sum them (generate a string)
                                  implicitly print

স্পষ্টতই, অন্তর্নির্মিত পাইথ ফাংশনগুলিতে ক্রিপ্টোগ্রাফিক সুরক্ষিত সিউডোর্যান্ডম সংখ্যা নেই । আপনি নিজের প্রবেশটি যেমন রাখবেন তেমন রাখতে পারেন এবং এটি গ্রিন টিকের জন্য যোগ্যতা অর্জন করবে না বা আপনি urandom"জয়ের" বিষয়ে চিন্তা করলে আপনি এমন একটি সংস্করণ তৈরি করতে পারেন যা ব্যবহার করে (যা আপনি পছন্দ করলে একটি পৃথক এন্ট্রি হতে পারে)। :-)
ক্রিস জেস্টার-ইয়াং

@ ক্রিসজেস্টার-ইয়াং এর জন্য দুঃখিত। পাইথনের র্যান্ডম-সংখ্যা জেনারেটরটি এতটা নিরাপত্তাহীন বলে আমি ভাবিনি। 25 বাইট ব্যয়ে এটি সংশোধন করা হয়েছে।
জাকুব

4

পাইথন 2 - 373 350 326 317 বাইট

পাইথ সম্ভবত পরে আসবে। একটি ফাংশন সংজ্ঞায়িত করে, c(p,d,r,m)যা পাসফ্রেজ এবং ডেটার জন্য বাইট তালিকা গ্রহণ করে এবং পুনরাবৃত্তি এবং মোডের জন্য int যা 1 যখন এনক্রিপ্ট হয় এবং যখন 0 ডিক্রিপ্ট হয় তখন এটি কেবল কারণ IV এর সাথে ডিল করা হয়। বাইট তালিকা ফেরত দেয়।

import os
B=256
def c(p,d,r,m):
    if m:v=map(ord,os.urandom(10))
    else:v,d=d[:10],d[10:]
    p+=v;S=range(B);T=(p*B)[:B];j=0;exec"for i in range(B):j=(j+S[i]+T[i])%B;S[i],S[j]=S[j],S[i]\n"*r;o=[];i=j=0
    for b in d:i=-~i%B;j=(j+S[i])%B;S[i],S[j]=S[j],S[i];k=(S[i]+S[j])%B;o+=[S[k]^b]
    return v+o if m else o

এখানে কিছু পরীক্ষার কোড / সহায়ক সহায়তা রয়েছে:

phrase = "hello"
text = "Mary had a little lamb, little lamb, little lamb"
N = 5

def make_bytes(string):
    return map(ord, string)

def make_string(bytes):
    return "".join(map(chr, bytes))

def make_hex(bytes):
    return " ".join("%02x" % i for i in bytes)

def from_hex(hex_str):
    return [int(i, 16) for i in hex_str.split()]

cipher = c(make_bytes(phrase), make_bytes(text), N, 1)
print make_hex(cipher)
plain = c(make_bytes(phrase), cipher, N, 0)
print make_string(plain)

আপনার কেবল একটি এনক্রিপশন প্রোগ্রাম লিখতে হবে। সুতরাং আপনি else:v,d=d[:10],d[10:]অংশটি সরাতে পারেন ।
জাকুবে

3

রুবি - 263 অক্ষর

এটি 2010 সালে স্ট্যাকওভারফ্লোতে মূল প্রশ্নের আমার রুবি উত্তর! এটি একটি প্রোগ্রামে সমস্ত এনকোডার এবং ডিকোডার

প্যারামিটারগুলি হ'ল:
e বা d (এনকোড বা ডিকোডের জন্য)
কী
সংখ্যাটি

$ ruby saber.rb e gnibbler 10 < in.txt | ruby saber.rb d gnibbler 10

o,k,l=ARGV;print o<'e'?(v=STDIN.read(10))*0:v=(0..9).map{rand(256).chr}.join;j=0;E=255
S=Array 0..255;(S*l.to_i).each{|i|j=j+S[i]+((k+v)*E)[i].ord&E;S[i],S[j]=S[j],S[i]};i=j=0
STDIN.each_byte{|c|i=i+1&E;j=j+S[i]&E;S[i],S[j]=S[j],S[i];print (c^S[S[i]+S[j]&E]).chr}

2

সি, 312 বাইট

কমান্ড লাইনে একটি কী এবং কী মিক্সিং পুনরাবৃত্তি গণনা গ্রহণ করে, তারপরে স্ট্ডিনে স্টাডআউটে সমস্ত কিছু এনক্রিপ্ট করে। এটি BSD / ডারউইন লাইব্রেরি ফাংশন ব্যবহার করে arc4random()যা আরসি 4 ভিত্তিক PRNG। এটি স্বয়ংক্রিয়ভাবে বীজ তৈরি করে, তাই ফলাফলগুলি প্রতিবারই আলাদা হবে।

unsigned char n,i,j,q,x,t,s[256],k[256];main(int c,char**v){for(strcpy(k,v[1]),n=strlen(k);x<10;x++)putchar(k[n++]=arc4random());do{s[i]=i;}while(++i);for(x=atoi(v[2]);x--;)do{t=s[i];s[i]=s[j+=s[i]+k[i%n]];s[j]=t;}while(++i);for(;(c=getchar())>0;){q+=s[++i];t=s[i];s[i]=s[q];s[q]=t;t=s[i]+s[q];putchar(c^s[t]);}}

টিডিয়ার সংস্করণ:

unsigned char n,i,j,q,x,t,s[256],k[256];
main(int c,char**v) {
  for (strcpy(k,v[1]),n=strlen(k);x<10;x++) putchar(k[n++]=arc4random());
  do {
    s[i]=i;
  }
  while(++i);
  for (x=atoi(v[2]);x--;) do {
    t=s[i];
    s[i]=s[j+=s[i]+k[i%n]];
    s[j]=t;
  }
  while (++i);
  for (;(c=getchar())>0;) {
    q+=s[++i];
    t=s[i];
    s[i]=s[q];
    s[q]=t;
    t=s[i]+s[q];
    putchar(c^s[t]);
  }
}

উদাহরণ:

$ echo -n 'Ciphersaber' | ./csgolf 'hello' 20 | xxd -p
0f6257c330e5e01c3eab07bc9cb4ee4c3eaa514a85

1

পাইথন - 266 অক্ষর

এটি 2010 সালে স্ট্যাকওভারফ্লোতে মূল প্রশ্নের আমার পাইথন উত্তর! এটি একটি প্রোগ্রামে সমস্ত এনকোডার এবং ডিকোডার

প্যারামিটারগুলি হ'ল:
e বা d (এনকোড বা ডিকোডের জন্য)
কী
সংখ্যাটি

$ python saber.py e gnibbler 10 < in.txt | python saber.py d gnibbler 10

এই সংস্করণটি আরসি 4 এর 2 টি লুপকে একটিতে মার্জ করার চেষ্টা করে (এখনও পর্যন্ত 11 বাইট সংরক্ষণ করে ...)

import os,sys;X,Y=sys.stdin.read,os.write;_,o,k,l=sys.argv;p='d'<o
V=(X,os.urandom)[p](10);Y(1,V*p);E,S=255,range(256)
for q in S*int(l),X():
 t=q<'';j=0;i=-t
 for c in q:i=i+1&E;j=j+S[i]+t*ord(((k+V)*E)[i])&E;S[i],S[j]=S[j],S[i];t or Y(1,chr(ord(c)^S[S[i]+S[j]&E]))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.