শিফটি এক্সওরিপশন


15

নিম্নলিখিত স্পেসিফিকেশন প্রদত্ত ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য একটি প্রোগ্রাম বা ফাংশন (বা প্রোগ্রাম / ফাংশনগুলির সেট) লিখুন:

জোড়া লাগানো

  1. প্রতিটি বাইট একে অপরের সাথে এক্সওআর-ইন করে ইনপুটটির একটি এক্সওআর হ্যাশ গণনা করুন।

  2. এই হ্যাশটির মাধ্যমে ইনপুটটির প্রতিটি বাইট এক্সওআর করুন।

  3. ফল চারটি বিট শিফট করুন।

  4. এক্সওআর হ্যাশের প্রথম চারটি বিট দিয়ে বাম দিকে প্যাড করুন।

  5. এক্সওআর হ্যাশের শেষ চারটি বিট দিয়ে ডানদিকে প্যাড করুন।

উদাহরণ

  • প্রদত্ত ইনপুট: "G0lf"( 0x47306C66)

  • এক্সওআর হ্যাশ গণনা করুন: 0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D

  • হ্যাশ দ্বারা প্রতি বাইট XOR: 0x3A4D111B

  • প্রত্যাশিত ফলাফল (শিফট এবং প্যাডের পরে): "s¤Ñ\x11½"( 0x73A4D111BD)

বিধি

  • আপনার প্রোগ্রাম / ফাংশনটি ইনপুট / আউটপুট প্রকৃত বাইট হিসাবে যতক্ষণ না আপনার পছন্দ মতো গল্ফিং ভাষা (স্ট্রিং, বাইট অ্যারে, ইত্যাদি) বোঝায় ততক্ষণ যা কিছু আউটপুট / আউটপুট পেতে পারে। উদাহরণস্বরূপ, আপনি একটি হেক্সিডেসিমাল স্ট্রিং আউটপুট নাও করতে পারেন।

  • এনক্রিপশন এবং ডিক্রিপশন পৃথক প্রোগ্রামে পৃথক করা যেতে পারে (স্কোর তাদের সম্মিলিত আকার হবে) বা একটি একক। একক পদ্ধতিগুলি এটি এনক্রিপ্ট করা বা ডিক্রিপ্ট করা উচিত কিনা এর জন্য একটি যুক্তি নিতে পারে।

  • এনক্রিপশনের জন্য ইনপুটটি কমপক্ষে 1 বাইট আকারের হতে পারে বলে আশা করা যায়।

  • ডিক্রিপশন জন্য ইনপুট কমপক্ষে 2 বাইট আশা করা যেতে পারে

  • মুদ্রণযোগ্য বাইটগুলি আউটপুট এড়িয়ে যাওয়ার দরকার নেই।


1
একটি দশমিক অ্যারে আউটপুট ফর্ম হিসাবে ব্যবহার করা যেতে পারে?
5uʎs

@ .uʎs বাইট উপস্থাপনের জন্য ইনপুট এবং আউটপুটটিকে পূর্ণসংখ্যার অ্যারে হিসাবে গ্রহণযোগ্য হবে।
nderscore

সর্বাধিক ইনপুট দৈর্ঘ্য (উদাহরণস্বরূপ, 14 বাইট (56 বিট), যাতে চূড়ান্ত ফলাফলটি 64-বিট পূর্ণসংখ্যায় ফিট করে)?
ডুরকনব

1
কেবলমাত্র একটি দ্রষ্টব্য: ক্রিপ্টোগ্রাফি দৃষ্টিকোণ থেকে এটি কোনও এনক্রিপশন নয়, কারণ এর কোনও কী (বা 0-বিট কী) নেই।
পাওলো ইবারম্যান

1
আমি কারও জন্য অপেক্ষা করছি যে আপনার নিজের এনক্রিপশনটি কখনই রোল না করা সম্পর্কে কিছু পোস্ট করার জন্য, এটি চালু থাকা সাইটটিকে উপেক্ষা করে ...
ব্যবহারকারী 253751

উত্তর:


9

সিজেএম, 28 + 27 = 55 বাইট

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

জোড়া লাগানো

q~_:^_GbYUe[\@f^Gfbe_*2/Gfbp
q:i_:^_GbYUe[\@f^Gfbe_*2/Gfb:c

ডিক্রিপশন

q~{_G/\G%}%)\(G*@+\2/Gfbf^p
q:i{_G/\G%}%)\(G*@+\2/Gfbf^:c

এখানে একটি পরীক্ষার স্ক্রিপ্ট যা পুরো রাউন্ড ট্রিপ করে এবং আবার ডিক্রিপশন করার আগে এনক্রিপ্ট করা কোডটি মুদ্রণ করে।

ব্যাখ্যা

q:i_:^_GbYUe[\@f^Gfbe_*2/Gfb:c
q:i                            e# Read the input and convert characters to byte values.
   _:^                         e# Duplicate and fold XOR onto the characters to get 
                               e# the hash.
      _Gb                      e# Duplicate and convert to base 16 to get nibbles.
         YUe[                  e# Pad to width 2 with zeroes.
             \@                e# Pull up other copy and integer array.
               f^              e# XOR each integer with the hash.
                 Gfbe_         e# Convert each result to base 16 and flatten that.
                      *        e# Join the hash nibbles with this array.
                       2/      e# Split into pairs.
                         Gfb   e# Interpret each pair as base 16.
                            :c e# Convert each integer to a character.

q:i{_G/\G%}%)\(G*@+\2/Gfbf^:c
q:i                            e# Read the input and convert characters to byte values.
   {      }%                   e# Map this block onto each byte.
    _G/\G%                     e# Get the two base 16 digits individually.
            )\(                e# Slice off the last and first nibble.
               G*@+\           e# Combine into byte (the hash) and swap with array.
                    2/Gfb      e# Split array into pairs and interpret each as base 16.
                         f^    e# XOR each with the hash.
                           :c  e# Convert each integer to a character.

6

সিজেএম, 36 + 34 = 70 বাইট

বাইনারি ফর্মগুলি ব্যবহার করে কিছুটা ভিন্ন পদ্ধতি

এনক্রিপ্টর :

q_:^:Hf^H+{i2b8Ue[}%)4/~@\]e_8/2fb:c

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

q_:^                                  e# Read input as string, copy and XOR all the chars
    :Hf^                              e# Store the XOR in H and XOR each char with H
        H+                            e# Append H to the char array
          {       }%                  e# On each of the elements in the array
           i2b                        e# Convert the ASCII value to binary
              8Ue[                    e# Pad with 0 so that the length is 8
                    )                 e# Pop out the last array element, which is H
                     4/~@\            e# Put first 4 bits of H before the input array
                                      e# And rest 4 after it
                          ]e_8/       e# Flatten everything into a single array and group
                                      e# into pieces of 8 bits
                               2fb:c  e# Convert each 8 bit part to integer and then to
                                      e# its character form

ডিক্রিপিটার :

q{i2b8Ue[4/~}%)\(@+2b\:+8/2fb\f^:c

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

q{          }%                      e# For each character of the input string
  i2b                               e# Convert to ASCII code and then to its binary form
     8Ue[                           e# Pad with enough 0 so that length is 8 bit
         4/~                        e# Split into parts of 4 and unwrap
              )\(@+                 e# Take out the first and last 4 bit group and join
                                    e# them together to get the XOR Hash H
                   2b\              e# Convert H to decimal form and swap to put the
                                    e# remaining converted input array on top
                      :+8/          e# Join all bits together and split into groups of 8
                          2fb       e# Convert each 8 but group to decimal form
                             \f^    e# Swap to put H on top and XOR each number with H
                                :c  e# Get character from each of the ASCII value

অনলাইনে এনক্রিপ্টর এবং ডিক্রিপ্টার চেষ্টা করুন


6

পাইথ, 69 বাইট

Ksm>+0jCd16_2zJ?,hKeKQmxFdCcK2=KsmmxFkC,dJc?tPKQK2smCid16c?KQ++hJKeJ2

এটি এনক্রিপশন এবং ডিক্রিপশনকে একত্রিত করে, কেবল 0এনক্রিপশনের জন্য যুক্তি হিসাবে বা 1ডিক্রিপশনের জন্য একটি যুক্ত করে । এটার কারন খুবিই সাধারন. বিটগুলিতে স্ট্রিংগুলি রূপান্তর করা (বা 4 বিট পূর্ণসংখ্যা) বা বিপরীতটি পাইথের সত্যই দীর্ঘ long উভয় ফাংশনকে একটি প্রোগ্রামের সাথে সংযুক্ত করে আমি প্রচুর বাইট সংরক্ষণ করতে পারি।

অনলাইন বিক্ষোভ: এনক্রিপশন এবং ডিক্রিপশন

ব্যাখ্যা:

প্রথম অংশ ইনপুটটিকে 4-বিট পূর্ণসংখ্যার (প্রতিটি চর 2 2-বিট পূর্ণসংখ্যায় রূপান্তরিত হয়) তালিকায় রূপান্তর করে এবং এতে সঞ্চয় করে K

  m          z   map each character d of input (=z) to:
       Cd            the ascii-value of d
      j  16          convert the result into base 16
   >+0     _2        insert a zero to the front and take the last 2 values
                     (so that each char gets mapped to exactly 2 numbers)
Ks               chain all these tuples and assign them to K

দ্বিতীয় অংশটি হ্যাশ মানগুলি নির্ধারণ করে এবং এগুলিতে সংরক্ষণ করে J। যদি Q==0এটি জোর দিয়ে তাদের গণনা করে, অন্যথায় এটির প্রথম এবং শেষ মান লাগে K

 ?     Q           ... if Q (=second input) else ...
  ,hKeK            [K[0], K[-1]]
        m   CcK2   map each d of zipped(K chopped into pairs) to:
                   [zipped(...) gives me 2 lists, one with the values of the even indices, and one with the odd indices]
         xFd           fold the list d by xor
J                  store the result in J (this is the hash value)

পরের অংশটি হ্যাশ মানগুলি ব্যবহার করে জোর করে। যখন Q == 0এটি সম্পূর্ণ তালিকায় সম্পাদিত হয় K, অন্যথায় কেবল Kপ্রথম এবং শেষ মান ব্যতীত তালিকায় ।

=KsmmxFkC,dJc?tPKQK2
             ?tPKQK    K[1:-1] if Q else K 
   m        c      2   map each d of [... chopped into pairs] to:
    m   C,dJ              map each pair k of zip(d,J) to:
     xFk                     apply xor to the 2 values in k
=Ks                    chain all these tuples and assign them to K

এবং শেষ অংশটি চরগুলিতে Kফিরে আসে:

smCid16c?KQ++hJKeJ2
        ?KQ++hJKeJ    K if Q else J[0] + K + J[1]
 m     c          2   map each pair of [... chopped into pairs] to:
   id16                  convert d into a single integer
  C                      convert to char
s                     join all chars and print

0

জাভাস্ক্রিপ্ট ( ES6 ) 83 + 73 = 156

উভয় ফাংশন ইনপুট হিসাবে গ্রহণ করে এবং বাইটগুলি উপস্থাপন করতে সংখ্যার একটি অ্যারের আউটপুট করে।

এনক্রিপ্ট 85 84 83

E=s=>s.concat((h=s.reduce((x,y)=>x^y))<<4&240^h).map(x=>a<<4&240|(a=x^h)>>4,a=h>>4)

ডিক্রিপ্ট 75 73

D=s=>s.map(x=>(a<<4&240|(a=x)>>4)^h,h=(a=s.shift())&240|s[~-s.length]&15)

বিক্ষোভ (শুধুমাত্র ফায়ারফক্স)

E=s=>s.concat((h=s.reduce((x,y)=>x^y))<<4&240^h).map(x=>a<<4&240|(a=x^h)>>4,a=h>>4)
D=s=>s.map(x=>(a<<4&240|(a=x)>>4)^h,h=(a=s.shift())&240|s[~-s.length]&15)

toHexString = x=>'0x'+x.map(y=>y.toString(16)).join('')

input = [...'G0lf'].map(x=>x.charCodeAt());
document.write('Input: ' + toHexString(input) + '<br />');

encrypted = E(input);
document.write('Encrypted: ' + toHexString(encrypted) + '<br />');

decrypted = D(encrypted);
document.write('Decrypted: ' + toHexString(decrypted) + '<br />');


স্ট্রিং 131 + 129 = 260 ব্যবহার করে

এবং কেবল মজাদার জন্য ... এখানে কিছু সংস্করণ রয়েছে যা পরিবর্তে ইনপুট / আউটপুট জন্য স্ট্রিং ব্যবহার করে।

E=(s,h=0)=>[for(x of s)(h^=y=x.charCodeAt(),y)].concat(h<<4&240^h).map(x=>String.fromCharCode(a<<4&240|(a=x^h)>>4),a=h>>4).join('')

D=s=>(s=[s.charCodeAt(j=i)for(i in s)]).map(x=>String.fromCharCode((a<<4&240|(a=x)>>4)^h),h=(a=s.shift())&240|s[~-j]&15).join('')

E('G0lf') // 's¤Ñ\x11½'
D('s¤Ñ\x11½') // 'G0lf'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.