Shifty XORyption


15

Aşağıdaki spesifikasyona göre verileri şifrelemek ve şifresini çözmek için bir program veya işlev (veya program / işlev kümesi) yazın:

Şifreleme

  1. Her baytı birbiri ile XOR yaparak girişin XOR karmasını hesaplayın.

  2. Bu karma tarafından girdinin her baytı XOR.

  3. Sonucu dört bit sola kaydır.

  4. Sol tarafı, XOR karmasının ilk dört bitiyle doldurun.

  5. Sağ tarafı XOR hashının son dört bitiyle doldurun.

Misal

  • Verilen girdi: "G0lf"( 0x47306C66)

  • XOR karmasını hesapla: 0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D

  • XOR her bayt karma tarafından: 0x3A4D111B

  • Beklenen sonuç (vardiya ve pedden sonra): "s¤Ñ\x11½"( 0x73A4D111BD)

kurallar

  • Programınız / fonksiyonunuz, giriş / çıkış gerçek bayt olduğu sürece , seçtiğiniz golf dilinde (String, Byte Array, vb.) Ne tür olursa olsun giriş / çıkış yapabilir . Örneğin, onaltılık bir dize çıktısı veremeyebilirsiniz.

  • Şifreleme ve şifre çözme ayrı programlara ayrılabilir (puan birleşik büyüklükte olacaktır) veya tek bir programda. Tek yöntemler, şifrelemesi veya şifresinin çözülmesi gerekip gerekmediğine ilişkin bir argüman alabilir.

  • Şifreleme girişinin en az 1 bayt boyutunda olması beklenebilir.

  • Şifre çözme girişinin en az 2 bayt olması beklenebilir.

  • Yazdırılamayan baytların çıkıştan kaçmasına gerek yoktur.


1
Ondalık bir dizi çıktı formu olarak kullanılabilir mi?
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇɥʇuʎs Girdileri temsil etmek için bir tamsayı dizisi olarak girdi ve çıktı almak kabul edilebilir.
nderscore

Maksimum giriş uzunluğu var mı (örneğin, 14 bayt (56 bit), böylece nihai sonuç 64 bit tam sayıya sığacak şekilde)?
Kapı Tokmağı

1
Sadece bir not: Şifreleme açısından bu, bir anahtarı (veya 0-bit anahtarı) olmadığı için bir şifreleme değildir.
Paŭlo Ebermann

1
Ben sadece birisinin kendi şifreleme haddeleme hakkında bir şey göndermek için bekliyorum, bu sitede göz ardı ...
user253751

Yanıtlar:


9

CJam, 28 + 27 = 55 bayt

Her bölüm için girdi / çıktının bir tamsayı dizisi biçiminde olmasını ve bir dize kullanan bir program sunacağım. Yukarıdaki bayt sayısı tamsayı dizi sürümü içindir, ancak bağlantılı komut dosyası ve açıklama dize tabanlı sürüm içindir (soruda verilen örneği test etmek için kullanılabilir).

Şifreleme

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

Şifre çözme

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

İşte tam bir yolculuk yapan ve şifre çözme işlemini tekrarlamadan önce şifrelenmiş kodu yazdıran bir test komut dosyası .

açıklama

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

CJam, 36 + 34 = 70 bayt

İkili formlar kullanarak biraz farklı bir yaklaşım

Şifreleme :

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

Nasıl çalışır:

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

Decrypter :

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

Nasıl çalışır:

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

Çevrimiçi şifreleyici ve şifre çözücüyü deneyin


6

Pyth, 69 bayt

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

Bu, şifreleme ve şifre çözmeyi birleştirir; 0 şifreleme için argüman veya 1şifre çözme için argüman . Bunun nedeni basit. Dizeleri bitlere (veya 4 bit tamsayı) veya tersine dönüştürmek Pyth'te gerçekten çok uzun. Her iki işlevi tek bir programda birleştirerek çok fazla bayt kaydedebilirim.

Çevrimiçi tanıtımlar: Şifreleme ve Şifre Çözme .

Açıklama:

İlk bölüm girdiyi 4 bit tam sayı listesine dönüştürür (her karakter 2 4 bit tam sayıya dönüştürülür) ve kaydeder 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

İkinci bölüm hash değerlerini belirler ve bunları saklar J. Eğer Q==0o xor onları hesaplar, aksi takdirde ilk ve son değerini alır 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)

Sonraki bölüm karma değerlerini kullanarak xor yapar. Ne zaman Q == 0o tam listesi yapılır Kaksi Sadece listede, Kilk ve son değeri olmayan.

=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

Ve son bölüm Ktekrar karakterlere dönüşüyor :

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

Javascript ( ES6 ) 83 + 73 = 156

Her iki işlev de girişi alır ve baytları temsil etmek için bir sayı dizisini çıkarır.

Şifrele 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)

Şifre Çözme 75 73

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

Gösteri (yalnızca Firefox)

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 />');


Dizeleri Kullanma 131 + 129 = 260

Ve sadece eğlence için ... giriş / çıkış için dizeleri kullanan bazı sürümler.

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.