এককালীন প্যাড প্রয়োগ করুন


13

পটভূমি

একটি এককালীন প্যাড হ'ল এনক্রিপশনের একটি ফর্ম যা সঠিকভাবে ব্যবহার করা হলে ক্র্যাক করা অসম্ভব প্রমাণিত হয়েছে।

এনক্রিপশনটি একটি সরল পঠন গ্রহণ করে (কেবলমাত্র অক্ষরের AZ সমন্বিত) এবং একই দৈর্ঘ্যে (কেবলমাত্র অক্ষরগুলি) এলোমেলো স্ট্রিং তৈরি করে। এই স্ট্রিংটি মূল হিসাবে কাজ করে। প্লেইনেক্সটেক্সের প্রতিটি অক্ষরকে কী-এর সাথে সংশ্লিষ্ট চরিত্রের সাথে যুক্ত করা হয়। সিফারটেক্সটটি নিম্নরূপে গণনা করা হয়েছে: প্রতিটি জুটির জন্য উভয় অক্ষরকে সংখ্যায় রূপান্তর করা হয় (এ = 0, বি = 1, ... জেড = 25)। দুটি সংখ্যা যোগ করা হয়েছে মডুলো 26. এই সংখ্যাটি একটি অক্ষরে ফিরে রূপান্তরিত হয়।

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

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল সংক্ষিপ্ততম প্রোগ্রামটি লেখার জন্য যা উভয়ই এককালীন প্যাড এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারে।

ইনপুটটির প্রথম লাইনে (এসটিডিআইএন), হয় "এনক্রিপিটি" শব্দ বা "ডিক্রিওয়াইপিটি" শব্দটি থাকবে।

শব্দটি যদি এনক্রিপ্ট হয় তবে তার পরের লাইনটি প্লেইন টেক্সট হবে। আপনার প্রোগ্রামে দুটি লাইন আউটপুট করা উচিত (STDOUT- এ), প্রথমটি কী এবং দ্বিতীয়টি সিফারেক্সট।

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

প্লেইন টেক্সট, সিফেরটেক্সট এবং কীতে সর্বদা বড় হাতের অক্ষর AZ থাকা উচিত। এগুলি সর্বদা একক লাইন থাকবে এবং এতে কোনও সাদা স্থান থাকবে না।

কীটি সর্বদা এলোমেলো হওয়া উচিত। এর বড় অংশগুলিকে রানের মধ্যে পুনরাবৃত্তি করা উচিত নয় এবং পাঠ্যের মধ্যে এমন কোনও নিদর্শন পাওয়া যাবেনা।

দুটি সহজ উদাহরণ:

ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME

DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY

>প্রতিনিধিত্ব করে যা লাইন, আউটপুট হয় যাতে আপনি আউটপুট এই চিহ্নের প্রিন্ট করতে হবে না।


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

1
এছাড়াও, সমস্ত চ্যালেঞ্জগুলি ডিফল্টরূপে ভাষা অজ্ঞেয় সম্পর্কিত, তাই আমি সেই ট্যাগটি সরিয়েছি।
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

7
@ ডিএমকেই আপনার প্রথম মন্তব্য সম্পর্কে আমি একমত, তাই আমার যোগাযোগগুলি সুরক্ষিত করার জন্য আমি এই উত্তরগুলি ব্যবহার করার ইচ্ছা করি না।
PhiNotPi

1
সমস্যাটি থেকে এলোমেলোতা ছাড়াই আইএমও আরও মজাদার হত; এলোমেলোতার একটি উত্স ( /dev/random, haveged) দেওয়া হয়েছে, বাইটগুলির সাথে অর্ডগুলি জোর করে এনক্রিপ্ট করুন এবং কী দিয়ে তাদের জিওর করে ডিক্রিপ্ট করুন। gist.github.com/5078264 কী বা এলোমেলোতা স্ট্ডিনের কাছ থেকে পড়া যায়, বার্তা বা সাইফেরেক্সট ফাইল নাম যুক্তি হতে পারে।
ixtmixilix

@ ফিলনটপি আমার কাছে একটি পরামর্শ আছে। তারা যদি সত্যিকারের এলোমেলো উত্স ব্যবহার করে তবে কেন বোনাস দেবেন না (যেমন /dev/hwrng, সিউডো র্যান্ডম ব্যবহারের পরিবর্তে (যা প্রযুক্তিগতভাবে এটি ভেঙে
makes

উত্তর:


8

গল্ফস্ক্রিপ্ট, 53 টি অক্ষর

n%(0=2%{~.,[{26rand 65+}*]:K]}*zip{{-}*~)26%65+}%K]n*

এটি এমন একটি কাজ যার জন্য গল্ফস্ক্রিপ্ট পুরোপুরি উপযুক্ত।

কোডটি সংক্ষিপ্ত রাখতে, আমি উভয়ই এনক্রিপশন এবং ডিক্রিপশনগুলির জন্য একই কোডটি ব্যবহার করছি: ডিক্রিপ্ট করার জন্য, আমি সিফারেক্সট থেকে কীটি বিয়োগ করি, এনক্রিপশন করার সময়, আমি প্রথমে একটি এলোমেলো সিফারেক্সট তৈরি করি এবং তারপরে প্লেটেক্সটটি বিয়োগ করি। তবুও, এনক্রিপশন মোড বাস্তবায়নের জন্য অতিরিক্ত কোডটি প্রোগ্রামের দৈর্ঘ্যের অর্ধেকের বেশি নেয়।

মন্তব্য সহ ডি গল্ফ সংস্করণ:

n %             # split input into an array of lines

# KEY GENERATION FOR ENCRYPTION MODE:
(               # extract the first line from the array
0 = 2 %         # check if the first char of that line is odd (E = 69)...
{               # ...and execute this block if it is:
    ~           # dump the remaining lines (of which the should be only one) on the stack
    . ,         # calculate the length of the last line...
    [ { 26 rand 65 + } * ]  # ...make an array of that many random letters...
    :K          # ...and assign it to K
    ]           # collect all the lines, including K, back into an array
} *

# ENCRYPTION / DECRYPTION ROUTINE:
zip             # transpose the array of 2 n-char strings into n 2-char strings...
{               # ...and execute this block for each 2-char string:
    {-} *       # subtract the second char code from the first
    ~ )         # negate the result (using the two's complement trick -x = ~x+1)
    26 % 65 +   # reduce modulo 26 and add 65 = A
} %

# OUTPUT:
K ] n*         # join the result and K (if defined) with a newline, stringifying them

4

রুবি ( 200 185)

নমুনা চালিত + ডাব্লুসি:

$ ruby onetimepad.rb
ENCODE
ANOTHERTESTINPUTZZZ
ZYCLGHDWLDASFUTHWKC
BPMIBXOXTPTQIVBMDPX
$ ruby onetimepad.rb
DECODE
ZYCLGHDWLDASFUTHWKC
BPMIBXOXTPTQIVBMDPX
ANOTHERTESTINPUTZZZ
$ wc onetimepad.rb
       4       7     185 onetimepad.rb
def f;gets.scan(/./).map{|b|b.ord-65};end
s=->a{a.map{|b|(b+65).chr}*''}
r=->b,a,o{s[a.zip(b).map{|a,b|(a.send o,b)%26}]}
puts(gets=~/^D/?r[f,f,:+]:[s[k=(p=f).map{rand 26}],r[k,p,:-]])

s[k=(p=f).map{rand 26}],r[k,p,:-]লেখা উচিতs[k=f.map{rand 26}],r[k,$_,:-]
হাউলেথ

@ হোলথ কোনও কাজ করেন না, যেমনটি $_পড়েছেন কেবল শেষ লাইন gets। একটি লাইন পড়ার পরে fনা .scan(/./).map{|b|b.ord-65}
jsvnm

3

হাস্কেল, 203 টি অক্ষর

import Random
main=newStdGen>>=interact.(unlines.).(.lines).f.randomRs('A','Z')
f k['E':_,x]=[z const k x,z(e(+))k x]
f _[_,k,x]=[z(e(-))k x]
e(%)k x=toEnum$65+o x%o k`mod`26
o c=fromEnum c-65;z=zipWith

উদাহরণ:

$ runghc OneTimePad.hs <<< $'ENCRYPT\nHELLOWORLD'
QMNQKGFZFD
XQYBYCTQQG
$ runghc OneTimePad.hs <<< $'DECRYPT\nQMNQKGFZFD\nXQYBYCTQQG'
HELLOWORLD

3

পার্ল, 220 171 টি অক্ষর

if(<>=~/D/){$_=<>;$w=<>;print chr((ord(substr$w,$i++,1)-ord$1)%26+65)while/(.)/g}else{$_=<>;$c.=chr((ord($1)-65+($i=rand(26)))%26+65),print chr$i+65while/(.)/g;print$/.$c}

নমুনা রান:

ENCRYPT
HELLO
CCTKK
JGEVY

DECRYPT
CCTKK
JGEVY
HELLO

দ্রষ্টব্য: কমপক্ষে আমি এটি চালানোর সময়, "চালিয়ে যাওয়ার জন্য কোনও কী টিপুন ..." শেষ আউটপুটটির শেষে যুক্ত হয়। আমি আশা করি এটি ঠিক আছে, কারণ এটি প্রোগ্রামের অংশ নয়। যদি তা না হয় তবে আমি এটি তৈরি করতে পারি যাতে এটি পরবর্তী লাইনে প্রদর্শিত হয়।

পার্লে এটি আমার প্রথম আসল প্রোগ্রাম এবং আমার প্রথম গল্ফ, তাই আমি টিপসটির সত্যই প্রশংসা করব। এছাড়াও, আমি /(.)/gইন্টারনেটে খুঁজে পেয়েছি , তবে এটি কীভাবে কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই (এটি কি একটি নিয়মিত প্রকাশ? আমি এখনও সেগুলি শিখিনি) have কেউ আমাকে এটা ব্যাখ্যা করতে পারেন?

সম্পাদনা: ইলমারি করোনেনকে আমাকে রেজিজেপস সম্পর্কে সাহায্য করার জন্য ধন্যবাদ, আমি আমার নতুন জ্ঞানটি 7 টি চরিত্র বাঁচাতে ব্যবহার করেছি!

প্রসারিত, সামান্য প্রশস্ত সংস্করণ:

if(<>=~/D/){
    $_=<>;
    $w=<>;
    print chr((ord(substr$w,$i++,1)-ord$1)%26+65)while/(.)/g
}
else{
    $_=<>;
    $c.=chr((ord($1)-65+($i=rand(26)))%26+65),print chr$i+65while/(.)/g;
    print$/.$c
}

হ্যাঁ, /(.)/gএকটি regexp হয়। আপনি যদি পার্ল গল্ফ খেলতে যান তবে আপনি অবশ্যই তা জানতে চাইবেন। perldoc.perl.org/perlre.html কোনও খারাপ শুরুর জায়গা নয়।
ইলমারি করোনেন

2

পাইথন - 304 295

import random
r=raw_input
R=lambda s:range(len(s))
o=lambda c:ord(c)-65
j=''.join
if r()[0]=='D':
 s=r()
 d=r()
 print j(chr((o(s[i])-o(d[i]))%26+65)for i in R(s))
else:
 s=r()
 d=[random.randint(0,26)for i in R(s)]
 print j(chr((o(s[i])+d[i])%26+65)for i in R(s))
 print j(chr(n+65)for n in d)

আমি বিশ্বাস করি যে এটি চশমাটি ঠিক ঠিক পূরণ করে ( '>'ইনপুট প্রোট্টের শুরুতে অন্তর্ভুক্ত সহ )) এটি ইনপুটকে বৈধতা দেয় না, তাই আমি মনে করি যে এটির বাইরে কোনও অক্ষর দিলে এটি কেবল আবর্জনার আউটপুট তৈরি করবে [A-Z]। এটি কেবল ইনপুট কমান্ডের প্রথম অক্ষরও পরীক্ষা করে। যে কোনও কিছু দিয়ে শুরু করার Dফলে একটি ডিক্রিপশন হবে এবং অন্য যে কোনও কিছুতে একটি এনক্রিপশনের ফলাফল হবে।


আমি আপনাকে মুদ্রণের আশা করিনি >, আমি কোন লাইন আউটপুট ছিল তা প্রদর্শনের জন্য এটি ব্যবহার করছিলাম। আপনাকে সেগুলি বাস্তবায়ন করতে হবে না।
PhiNotPi

ঠিক আছে, শীতল, 9 টিরও কম অক্ষর।
গর্ডন বেইলি

1

সি ++ - 220 241 অক্ষর, 4 টি লাইন

#include<cstdlib>
#include<cstdio>
#define a scanf("%s"
char i,s[99],t[99];int main(){a,t);a,s);if(t[0]>68){for(;s[i];++i)s[i]=(s[i]+(t[i]=rand()%26+65))%26+65;puts(t);}else for(a,t);s[i];++i){s[i]=65+t[i]-s[i];if(s[i]<65)s[i]+=26;}puts(s);}

সম্পাদনা 1- এমএসভিএস স্ট্যান্ডার্ড লাইব্রেরিতে অনেকগুলি অপ্রয়োজনীয় ফাইল অন্তর্ভুক্ত বলে মনে হচ্ছে যার অর্থ হ'ল আইওসটিতে আমার যা যা আছে তার সবগুলি অন্তর্ভুক্ত ছিল তবে এটি অন্যান্য সংকলকগুলির সাথে কাজ করে নি। প্রকৃত ফাইলগুলির জন্য পরিবর্তিত আইওএস যেগুলি ফাংশনগুলির প্রয়োজন সেগুলি সিএসডিডিলেব এবং সিএসটিডিওতে উপস্থিত হয়। এটি নির্দেশ করার জন্য ইলমারি করোনেনকে ধন্যবাদ।


আমার জন্য সংকলন করে না: g++ otp.cppবলেছেনotp.cpp: In function ‘int main()’: otp.cpp:3: error: ‘scanf’ was not declared in this scope otp.cpp:3: error: ‘rand’ was not declared in this scope otp.cpp:3: error: ‘puts’ was not declared in this scope otp.cpp:3: error: ‘puts’ was not declared in this scope
ইলমারি করোনেন

হুঁ, এটি আশ্চর্যজনক, আমি ভিজ্যুয়াল স্টুডিও ব্যবহার করি। <io> এর জন্য <কনিও.হুল> এবং <স্টডিও.এস> থাকা অবশ্যই মানসম্মত হতে হবে। আমি ধরে নিয়েছি শিরোনামগুলি সর্বদা একই প্রয়োগগুলি বিভিন্ন বাস্তবায়নে অন্তর্ভুক্ত করে। আমি পরে এটি দেখতে হবে, ধন্যবাদ।
স্কট লোগান

1

পাইথন - 270

import random
i=raw_input  
m=i()
a=i()
r=range(len(a))
o=ord
j=''.join
if m=='ENCRYPT':
  k=j(chr(65+random.randint(0,25)) for x in r)
  R=k+"\n"+j(chr((o(a[x])+o(k[x]))%26+65) for x in r)
elif m=='DECRYPT':
  k=i()
  R=j(chr((o(k[x])-o(a[x]))%26+65) for x in r)
print R

নমুনা আউটপুট:

$ python onetimepad.py 
ENCRYPT
HELLOWORLD
UXCYNPXNNV
BBNJBLLEYY
$ python onetimepad.py 
DECRYPT
UXCYNPXNNV
BBNJBLLEYY
HELLOWORLD

চরিত্র গণনা:

$ wc -c onetimepad.py 
270 onetimepad.py

1

জে: 94 বাইট

3 :0]1
c=:(26&|@)(&.(65-~a.&i.))
r=:1!:1@1:
((],:+c)[:u:65+[:?26$~#)@r`(r-c r)@.('D'={.)r 1
)

সমস্ত প্রয়োজনীয় সাদা স্থান গণনা করা হয়।

মন্তব্য করা সংস্করণ:

3 :0]1                                          NB. Make a function and call it
c=:(26&|@)(&.(65-~a.&i.))                       NB. Adverb for operating on the alphabet
                                                NB. (used for adding and subtracting the pad)
r=:1!:1@1:                                      NB. Read input line and decide (right to left)
((],:+c)[:u:65+[:?26$~#)@r   ` (r-c r)            @. ('D'={.)r 1
NB. Encryption (ger    0)    | Decryption (ger 1)| Agenda               
NB. pad,:(crypt=:plain + pad)| crypt - pad       | If D is first input, do (ger 1), else do (ger 0)
)

1

সি # ( 445 416)

সমষ্টি সম্পর্কে ভুলে গেছেন। বেশ কিছুটা কেটে দিন।

কিছুটা গল্ফড:

namespace G {
using System;
using System.Linq;
using x = System.Console;
class P {
    static void Main() {
        string p = "", c = "", k = "";
        Random r = new Random();
        int i = 0;
        if (x.ReadLine()[0] == 'E') {
            p = x.ReadLine();
            k=p.Aggregate(k,(l,_)=>l+(char)r.Next(65,90));
            c=p.Aggregate(c,(m,l)=>m+(char)((l+k[i++])%26+65));
            x.WriteLine(k + "\n" + c);
        } else {
            k = x.ReadLine();
            c = x.ReadLine();
            p=c.Aggregate(p,(l,a)=>l+(char)((a-k[i++]+26)%26+65));
            x.WriteLine(p);
        }
    }
}

}

Golfed:

namespace G{using System;using System.Linq;using x=System.Console;class P{static void Main(){string p="",c="",k="";Random r=new Random();int i=0;if (x.ReadLine()[0]=='E'){p=x.ReadLine();k=p.Aggregate(k,(l,_)=>l+(char)r.Next(65,90));c=p.Aggregate(c,(m,l)=>m+(char)((l+k[i++])%26+65));x.WriteLine(k+"\n"+c);}else{k=x.ReadLine();c=x.ReadLine();p=c.Aggregate(p,(l,a)=>l+(char)((a-k[i++]+26)%26+65));x.WriteLine(p);}}}}

0

সি (সংকলক পতাকাগুলির জন্য 159 + 11)

Golfed:

d(a,b){return(a+b+26)%26+65;}a;char s[999],b,*c=s-1;main(){g;a=*s-69;g;while(*++c)a?b=-*c,*c=getchar():putchar(b=rand()%26+65),*c=d(*c,b);a||puts("");puts(s);}

Ungolfed:

d(a,b){
    //*a = (*a + b - 2*65 + 26) % 26 + 65; 
    return (a + b + 26) % 26 + 65;
}
a; char s[999], b, *c = s-1;
main(){
    gets(s);
    a = *s - 69; // -1 if decrypt 0 if encrypt
    gets(s);
    while(*++c){
        if(!a)
            putchar(b = rand() % 26 + 65); // 'A'
        else
            b = -*c, *c = getchar();
        *c = d(*c,b);
    }
    if(!a) puts("");
    puts(s);
}

সংকলন -Dg=gets(s)

উদাহরণ:

$./onetimepad
ENCRYPT
FOOBAR
>PHQGHU
>UVEHHL
$./onetimepad
DECRYPT
PHQGHU
UVEHHL
>FOOBAR

প্রতিবার চালানোর সময় আমি একই কী পেয়েছি - এলোমেলোতা নেই।
শুক্রবার

0

জাভাস্ক্রিপ্ট 239

var F=String.fromCharCode
function R(l){var k='';while(l--)k+=F(~~(Math.random()*26)+65);return k}
function X(s,k,d){var o='',i=0,a,b,c
while(i<s.length)a=s.charCodeAt(i)-65,b=k.charCodeAt(i++)-65,c=d?26+(a-b):a+b,o+=F((c%26)+65)
return o}

ব্যবহার:

var str = "HELLOWORLD";
var key = R(str.length);
var enc = X(str, key, false);
console.log(enc);
console.log(X(enc,key, true));

0

রুবি - 184 179 177 অক্ষর

def g;gets.scan(/./).map{|c|c.ord-65}end
m,=g
k=(s=g).map{rand 26}
m==4?(puts k.map{|c|(c+65).chr}*'';y=:+):(k,s=s,g)
puts s.zip(k).map{|c,o|(c.send(y||:-,o).to_i%26+65).chr}*''

এটি এইভাবে চালান: $ ruby pad-lock.rb

যদি কেউ আগ্রহী হয় তবে এটি অদম্য সংস্করণে দেওয়া হয়েছে (যদিও এটি গল্ফযুক্তগুলির সাথে একেবারে আপ টু ডেট নয়)

def prompt
    gets.scan(/./).map{ |c|c.ord - 65 }
end

mode = prompt[0]
operator = :-
secret = prompt
key = secret.map { |char| rand(26) }

if mode == 4 # the letter E, or ENCRYPT
    key.map { |char| print (char + 65).chr }
    puts
    operator = :+
else
    # make the old secret the new key,
    # and get a new secret (that has been encrypted)
    key, secret = secret, prompt
end

chars = secret.zip(key).map do |secret_char, key_char|

    # if mode == 4 (E) then add, otherwise subtract
    i = secret_char.send(operator, key_char).to_i

    ((i % 26) + 65).chr
end

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