গিমলি, আরও খাটো করে দাও?


25

আমি গিমলির অন্যতম লেখক। আমাদের কাছে ইতিমধ্যে সি-তে একটি ২-টুইট (২৮০ টি অক্ষর) সংস্করণ রয়েছে তবে আমি এটি দেখতে চাই যে এটি কতটা ছোট হতে পারে।

গিমলি ( কাগজ , ওয়েবসাইট ) উচ্চ সুরক্ষা স্তরের ক্রিপ্টোগ্রাফিক ক্রমুশন নকশা সহ একটি উচ্চ গতি যা ক্রিপ্টোগ্রাফিক হার্ডওয়্যার এবং এমবেডেড সিস্টেমস (সিএইচইএস) 2017 (25-28 সেপ্টেম্বর ) সম্মেলনে উপস্থাপন করা হবে ।

কাজটি

যথারীতি: আপনার পছন্দের ভাষায় গিমলির ক্ষুদ্রতর ব্যবহারযোগ্য প্রয়োগকরণ।

এটি ইনপুট 384 বিট (বা 48 বাইট, বা 12 স্বাক্ষরবিহীন অন্তর্নিহিত ...) হিসাবে গ্রহণ করতে সক্ষম হবে এবং ফিরে আসতে হবে (আপনি পয়েন্টার ব্যবহার করলে স্থান পরিবর্তন করতে পারে) এই 384 বিটগুলিতে গিমলির ফলাফল প্রয়োগ হয়েছিল।

দশমিক, হেক্সাডেসিমাল, অক্টাল বা বাইনারি থেকে ইনপুট রূপান্তর অনুমোদিত।

সম্ভাব্য কোণার কেস

পূর্ণসংখ্যার এনকোডিংটি ছোট-এন্ডিয়ান হিসাবে ধরা হয় (যেমন আপনার সম্ভবত ইতিমধ্যে যা রয়েছে)।

আপনি নামান্তর করতে পারে Gimliমধ্যে Gকিন্তু এটি এখনও একটি ফাংশন কল হতে হবে।

কে জিতলো?

এটি কোড-গল্ফ তাই বাইটের সংক্ষিপ্ত উত্তরটি জিতেছে! স্ট্যান্ডার্ড নিয়ম অবশ্যই প্রয়োগ করা হয়।

নীচে একটি রেফারেন্স বাস্তবায়ন সরবরাহ করা হয়েছে।

বিঃদ্রঃ

কিছু উদ্বেগ উত্থাপিত হয়েছে:

"আরে গ্যাং, দয়া করে আমার প্রোগ্রামটি অন্য ভাষায় বিনামূল্যে বাস্তবায়ন করুন যাতে আমাকে আর করতে হবে না" (থেক্স থেকে @ জেএসটিএইচএমএস)

আমার উত্তর অনুসরণ হিসাবে:

আমি এটি জাভা, সি #, জেএস, ওক্যামল এ খুব সহজেই করতে পারি ... এটি মজাদার জন্য আরও বেশি। বর্তমানে আমরা (জিমলি দল) এটিআরআর, কর্টেক্স-এম0, কর্টেক্স-এম 3 / এম 4, নিয়ন, এসএসই, এসএসই-অনিবন্ধিত, এভিএক্স, এভিএক্স 2, ভিএইচডিএল এবং পাইথন 3 এ প্রয়োগ করেছি (এবং অনুকূলিত)। :)


জিমলি সম্পর্কে

রাষ্ট্র

গিমলি একটি 384-বিট অবস্থায় রাউন্ডগুলির ক্রম প্রয়োগ করে। রাষ্ট্রটি 3 × 4 × 32 মাত্রার সমান্তরাল হিসাবে বা সমতুল্য, 32-বিট শব্দের 3 × 4 ম্যাট্রিক্স হিসাবে উপস্থাপিত হয়।

অবস্থা

প্রতিটি রাউন্ডটি তিনটি ক্রিয়াকলাপের ক্রম:

  • একটি অ-লিনিয়ার স্তর, বিশেষত প্রতিটি কলামে একটি 96-বিট এসপি-বক্স প্রয়োগ করা হয়;
  • প্রতি দ্বিতীয় রাউন্ডে, একটি রৈখিক মিশ্রণ স্তর;
  • প্রতি চতুর্থ রাউন্ডে, একটি ধ্রুবক সংযোজন।

অ-লিনিয়ার স্তর।

এসপি-বাক্সে তিনটি উপ-অপারেশন থাকে: প্রথম এবং দ্বিতীয় শব্দের ঘূর্ণন; একটি 3 ইনপুট ননলাইনার টি-ফাংশন; প্রথম এবং তৃতীয় শব্দের একটি অদলবদল।

এসপি

রৈখিক স্তর

রৈখিক স্তরটিতে দুটি স্ব্যাপ অপারেশন থাকে, যিনি ছোট-স্ব্যাপ এবং বিগ-অদলবদ। 1 ম রাউন্ড থেকে শুরু করে প্রতি 4 রাউন্ডে স্মল-অদলবদল ঘটে। বিগ-অদলবৃত 3 য় রাউন্ড থেকে শুরু করে প্রতি 4 রাউন্ডে ঘটে।

রৈখিক

বৃত্তাকার ধ্রুবক।

গিমলিতে 24 টি রাউন্ড রয়েছে, 24,23, ..., 1 নাম্বার রয়েছে। যখন রাউন্ড নম্বর আর 24,20,16,12,8,4 হয় আমরা প্রথম রাষ্ট্রের শব্দের সাথে রাউন্ড ধ্রুবক (0x9e377900 XOR r) এর এক্সআর করি।

এখানে চিত্র বর্ণনা লিখুন

সি মধ্যে রেফারেন্স উত্স

#include <stdint.h>

uint32_t rotate(uint32_t x, int bits)
{
  if (bits == 0) return x;
  return (x << bits) | (x >> (32 - bits));
}

extern void gimli(uint32_t *state)
{
  int round;
  int column;
  uint32_t x;
  uint32_t y;
  uint32_t z;

  for (round = 24; round > 0; --round)
  {
    for (column = 0; column < 4; ++column)
    {
      x = rotate(state[    column], 24);
      y = rotate(state[4 + column],  9);
      z =        state[8 + column];

      state[8 + column] = x ^ (z << 1) ^ ((y&z) << 2);
      state[4 + column] = y ^ x        ^ ((x|z) << 1);
      state[column]     = z ^ y        ^ ((x&y) << 3);
    }

    if ((round & 3) == 0) { // small swap: pattern s...s...s... etc.
      x = state[0];
      state[0] = state[1];
      state[1] = x;
      x = state[2];
      state[2] = state[3];
      state[3] = x;
    }
    if ((round & 3) == 2) { // big swap: pattern ..S...S...S. etc.
      x = state[0];
      state[0] = state[2];
      state[2] = x;
      x = state[1];
      state[1] = state[3];
      state[3] = x;
    }

    if ((round & 3) == 0) { // add constant: pattern c...c...c... etc.
      state[0] ^= (0x9e377900 | round);
    }
  }
}

সি তে টুইটযোগ্য সংস্করণ

এটি সর্বনিম্ন ব্যবহারযোগ্য প্রয়োগযোগ্যতা নাও হতে পারে তবে আমরা সি স্ট্যান্ডার্ড সংস্করণ (সুতরাং কোনও ইউবি, এবং একটি লাইব্রেরিতে "ব্যবহারযোগ্য") রাখতে চাইতাম।

#include<stdint.h>
#define P(V,W)x=V,V=W,W=x
void gimli(uint32_t*S){for(long r=24,c,x,y,z;r;--r%2?P(*S,S[1+y/2]),P(S[3],S[2-y/2]):0,*S^=y?0:0x9e377901+r)for(c=4;c--;y=r%4)x=S[c]<<24|S[c]>>8,y=S[c+4]<<9|S[c+4]>>23,z=S[c+8],S[c]=z^y^8*(x&y),S[c+4]=y^x^2*(x|z),S[c+8]=x^2*z^4*(y&z);}

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

নিম্নলিখিত ইনপুট দ্বারা উত্পাদিত

for (i = 0;i < 12;++i) x[i] = i * i * i + i * 0x9e3779b9;

এবং দ্বারা "মুদ্রিত" মানগুলি

for (i = 0;i < 12;++i) {
  printf("%08x ",x[i])
  if (i % 4 == 3) printf("\n");
}

এইভাবে:

00000000 9e3779ba 3c6ef37a daa66d46 
78dde724 1715611a b54cdb2e 53845566 
f1bbcfc8 8ff34a5a 2e2ac522 cc624026 

ফিরে আসা উচিত:

ba11c85a 91bad119 380ce880 d24c2c68 
3eceffea 277a921c 4f73a0bd da5a9cd8 
84b673f0 34e52ff7 9e2bef49 f41bb8d6 

3
একটি টুইটটি 140 অক্ষর নয় 280
স্টান স্ট্রাম

1
আমি জানি, যে কারণে এটি 2% এর সাথে ফিট করে) twitter.com/TweetGimli
বিভ

10
"আরে গ্যাং, দয়া করে আমার প্রোগ্রামটি অন্য ভাষায় বিনামূল্যে প্রয়োগ করুন যাতে আমাকে আর করতে হবে না"
jstnthms

হা হা হা নাহ আমি ইতিমধ্যে পাইথনে এটি পেয়েছি এবং আমি খুব সহজেই এটি জাভা, সি #, জেএসে করতে পারি। মজা করার জন্য এটি আরও বেশি। :)
বিভ

5
রেফারেন্স কোড ওয়েবসাইটে একটি অত্যন্ত গুরুত্বপূর্ণ ত্রুটি আছে, -roundপরিবর্তে --roundমানে এটি কখনোই বন্ধ। --কোনও এন ড্যাশে রূপান্তর করা সম্ভবত কোডে প্রস্তাবিত নয় :)
orlp

উত্তর:


3

সিজেএম (১১৪ টি চর)

{24{[4/z{[8ZT].{8\#*G8#:Mmd+}__)2*\+.^W%\[_~;&8*\~@1$|2*@@&4*].^Mf%}%z([7TGT]R=4e!=\f=(2654435608R-_4%!*^\@]e_}fR}

এটি একটি নামহীন ব্লক (ফাংশন): আপনি যদি এটির নাম রাখতে চান Gতবে যুক্ত করুন :G। সিজেমে নির্ধারিত নামগুলি কেবল একক আপার-অক্ষরের অক্ষর হতে পারে। একটি মন্তব্য যুক্ত করার e# Gimli in CJamএবং একটি একক টুইটের মধ্যে অক্ষর রেখে যাওয়ার স্থান রয়েছে ।

অনলাইন পরীক্ষা

ব্যবচ্ছেদ

{                                e# Define a block
  24{                            e# For R=0 to 23...
    [                            e#   Collect values in an array
      4/z                        e#     Transpose to columns
      {                          e#     Map over each column
        [8ZT].{8\#*G8#:Mmd+}     e#       Rotations, giving [x y z]
        __)2*\+.^W%\             e#       => [y^z x^y x^z*2] [x y z]
        [_~;&8*\~@1$|2*@@&4*].^  e#       => [x' y' z']
        Mf%                      e#       Map out any bits which overflowed
      }%
      z                          e#    Transpose to rows
      ([7TGT]R=4e!=\f=           e#    Permute first row
      (2654435608R-_4%!*^        e#    Apply round constant to first element
      \@                         e#    Put the parts in the right order
    ]e_                          e#  Finish collecting in array and flatten
  }fR
}

এক মুহুর্তের জন্য আমি এড়িয়ে গেলাম যে আউটপুট হেক্সে ছিল না (অনলাইন পরীক্ষায়)। :)
বিভ

15

সি (জিসিসি), 237 বাইট

#define P(a,l)x=a;a=S[c=l>>r%4*2&3];S[c]=x;
r,c,x,y,z;G(unsigned*S){
for(r=24;r;*S^=r--%4?0:0x9e377901+r){
for(c=4;c--;*S++=z^y^8*(x&y))
x=*S<<24|*S>>8,y=S[4]<<9|S[4]>>23,z=S[8],S[8]=x^2*z^4*(y&z),S[4]=y^x^2*(x|z);
S-=4;P(*S,33)P(S[3],222)}}

আমি আমার অদলবদল পদ্ধতিটি সম্ভবত বাইটস অর্জন করেছি, তবে এটি ব্যবহার করা খুব সুন্দর।


হারিয়েছেন বা লাভ করেছেন?
হাইপারনিউট্রিনো

@ হাইপার নিউট্রিনো অর্জন করেছেন, আমাকে হেরে
গেছেন

আহ ঠিক আছে: পি বোঝায়: পি: পি
হাইপার নিউট্রিনো

এটি অবশ্যই একটি উন্নতি, তবে এটি ব্যবহার করার unsignedপরিবর্তে কিছুটা প্রতারণা করছে uint32_t(এবং ওপি কোডটি কিছুটা ব্যবহার করতে প্রতারণা করেছিল long) কারণ সিফারের পিছনে ধারণাটি এটি অত্যন্ত বহনযোগ্য। (প্রকৃতপক্ষে, মূলত এটি মাত্র 8 বাইট সংরক্ষণ করে)
পিটার টেলর

1
@ পিটারটেলর যদিও আমার কোডটি একই রকম, আমি আসলে ওপির কোডের বিরুদ্ধে প্রতিযোগিতা করছি না। আমি পিপিসিজির নিয়মের অধীনে কাজ করছি, যেখানে এটি অবশ্যই একটি প্ল্যাটফর্মের কমপক্ষে বাস্তবায়নের সাথে কাজ করবে এবং এটি gcc32-বিট বা 64-বিট ইন্টেল সিপিইউতে (এবং সম্ভবত আরও অনেকগুলি) নিয়ে কাজ করবে।
orlp

4

সি, 268 চর (268 বাইট) uint32_t ব্যবহার করে

এনবি যেহেতু মূল কোডটি ব্যবহার করে <stdint.h>এবং প্রকারের Sমতো uint32_t *, আমি মনে করি যে ব্যবহারযোগ্যতা longব্যয় করে ২৮০ টি অক্ষরে প্রবেশ করা প্রতারণা যা uint32_tপ্রথম স্থানে ব্যবহারের কারণ । যদি তুলনামূলক ন্যায্যতার জন্য আমাদের ধারাবাহিকভাবে ব্যবহারের uint32_tএবং সুস্পষ্ট স্বাক্ষরের প্রয়োজন হয় void gimli(uint32_t *)তবে মূল কোডটি সত্যই 284 অক্ষর এবং অরল্পের কোডটি 276 অক্ষর।

#include<stdint.h>
#define R(V)x=S[V],S[V]=S[V^y],S[V^y]=x,
void gimli(uint32_t*S){for(uint32_t r=24,x,y,z,*T;r--;y=72>>r%4*2&3,R(0)R(3)*S^=y&1?0x9e377901+r:0)for(T=S+4;T-->S;*T=z^y^8*(x&y),T[4]=y^x^2*(x|z),T[8]=x^2*z^4*(y&z))x=*T<<24|*T>>8,y=T[4]<<9|T[4]>>23,z=T[8];}

এই ধারাবাহিকতা চিহ্নিতকারী হিসাবে দুটি টুইট মধ্যে বিভক্ত করা যেতে পারে

#include<stdint.h>
#define R(V)x=S[V],S[V]=S[V^y],S[V^y]=x,
void gimli(uint32_t*S){for(uint32_t r=24,x,y,z,*T;r--;y=72>>r%4*2&3,R(0)R(3)// 1

এবং

*S^=y&1?0x9e377901+r:0)for(T=S+4;T-->S;*T=z^y^8*(x&y),T[4]=y^x^2*(x|z),T[8]=x^2*z^4*(y&z))x=*T<<24|*T>>8,y=T[4]<<9|T[4]>>23,z=T[8];}// 2/2

ব্যবহারের longমধ্যে আমার সংস্করণ নিরাপদ (বহনযোগ্যতা থেকে সম্মান সঙ্গে) কারণ একটি দীর্ঘ ন্যূনতম আকার মান দ্বারা 32 বিট (যেমন বিরোধিতা হয় int)। এর ঘুর্ণন xএবং yফেলে দেওয়া আগে সম্পন্ন করা হয় longনিয়োগ হয়ে এদের নিরাপদ উপার্জন (যেমন স্বাক্ষরিত মান ডানে শিফট সিসি নির্ভরশীল)। কাস্ট যখন ফিরে যাবেন uint32_t* S) উপরের বিটগুলি থেকে মুক্তি পান এবং আমাদেরকে সঠিক অবস্থায় রাখবেন :)।
বিভ

2

জাভা (ওপেনজেডিকে 8) , 351 343 339 320 318 247 + 56 বাইট

গল্ফ শুরু করা থেকে রেফারেন্সের মাত্র 1: 1 বন্দর।

void f(int[]x,int y,int z){int q=x[y];x[y]=x[z];x[z]=q;}

s->{for(int r=24,c,x,y,z;r>0;--r){for(c=0;c<4;x=s[c]<<24|s[c]>>>8,y=s[4+c]<<9|s[4+c]>>>23,z=s[8+c],s[8+c]=x^z<<1^(y&z)<<2,s[4+c]=y^x^(x|z)<<1,s[c++]=z^y^(x&y)<<3);if((r&3)==2){f(s,0,2);f(s,1,3);}if((r&3)<1){f(s,0,1);f(s,2,3);s[0]^=0x9e377900|r;}}}

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


1
Integerআদৌ কেন ব্যবহার করবেন ? ও_ও যেহেতু আপনি কোনও Integerপদ্ধতি ব্যবহার করেন না , তাই intএখানে ব্যবহার না করার কোনও কারণ নেই ...
অলিভিয়ার গ্রোগোয়ার

@ অলিভিগ্রগ্রোয়েয়ার আমি মনে করি ইন্টিজার.ডাইভাইডইনিসাইন করে আমার কাছ থেকে কেবলমাত্র একটি অবশিষ্টাংশ, তবে আমি বুঝতে পেরেছিলাম যে আমি থাকতে পারি >>>
রবার্তো গ্রাহাম

s[0]^=(0x9e377900|r);(একেবারে শেষে) - আপনি অতিরিক্ত বন্ধনীগুলি ফেলে দিতে পারবেন না?
ক্লাশসফট

একই সঙ্গে s[4+c]>>>(23)
ক্ল্যাশসফট

1
আপনি এ পর্যন্ত কম পরিবর্তনগুলি করুন এবং 300 পেতে পারেন: void P(int[]S,int a,int b){int x=S[a];S[a]=S[b];S[b]=x;}void gimli(int[]S){for(int r=24,c,x,y,z;r>0;S[0]^=y<1?0x9e377901+r:0){for(c=4;c-->0;){x=S[c]<<24|S[c]>>>8;y=S[c+4]<<9|S[c+4]>>>23;z=S[c+8];S[c]=z^y^8*(x&y);S[c+4]=y^x^2*(x|z);S[c+8]=x^2*z^4*(y&z);}y=r%4;if(--r%2>0){P(S,0,1+y/2);P(S,3,2-y/2);}}}। এটি সংকলিত করার জন্য আমি মূলত সর্বনিম্ন পরিবর্তনগুলি করেছি। জাভার অগ্রাধিকারের নিয়মগুলি সি এর থেকে খুব আলাদা নয়।
পিটার টেলর

2

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

s=>{for(r=25;--r;[a,b,c,d,...e]=s,s=r&1?s:r&2?[c,d,a,b,...e]:[b,a,d,c,...e],s[0]^=r&3?0:0x9e377900|r)for(c=4;c--;x=s[c]<<24|s[c]>>>8,y=s[j=c+4]<<9|s[j]>>>23,z=s[c+8],s[c+8]=x^z*2^(y&z)*4,s[j]=y^x^(x|z)*2,s[c]=z^y^(x&y)*8);return s}

ডেমো


0

32-বিট x86 এসেম্বেলার (112 বাইট)

(__cdecl কলিং সম্মেলন)

            pusha
            mov     ecx, 9E377918h
    loc_6:  mov     esi, [esp+24h]
            push    esi
            push    4
            pop     ebx
    loc_E:  lodsd
            ror     eax, 8
            mov     ebp, [esi+0Ch]
            rol     ebp, 9
            mov     edx, [esi+1Ch]
            push    eax
            push    ebp
            lea     edi, [edx+edx]
            and     ebp, edx
            shl     ebp, 2
            xor     edi, ebp
            xor     eax, edi
            mov     [esi+1Ch], eax
            pop     ebp
            pop     eax
            push    eax
            push    ebp
            xor     ebp, eax
            or      eax, edx
            shl     eax, 1
            xor     ebp, eax
            mov     [esi+0Ch], ebp
            pop     ebp
            pop     eax
            xor     edx, ebp
            and     eax, ebp
            shl     eax, 3
            xor     edx, eax
            push    edx
            dec     ebx
            jnz     short loc_E
            pop     esi
            pop     ebp
            pop     ebx
            pop     eax
            pop     edi
            mov     dl, cl
            and     dl, 3
            jnz     short loc_5B
            xchg    eax, ebx
            xchg    esi, ebp
            xor     eax, ecx
    loc_5B: cmp     dl, 2
            jnz     short loc_63
            xchg    eax, ebp
            xchg    esi, ebx
    loc_63: stosd
            xchg    eax, ebx
            stosd
            xchg    eax, ebp
            stosd
            xchg    eax, esi
            stosd
            dec     cl
            jnz     short loc_6
            popa
            retn

টুইটযোগ্য সংস্করণ (z85- ফর্ম্যাট বেস85 এনকোডিং):

v7vb1h> সি} HbQuA91y51A: oWYw48G) আমি = h /] rGf9Na> sA.DWu06 {6f # TEC ^ সিএম: # IEA-cstx7:!> VfVf # U * Yb & এমপি (tuCl * + + 7eENBP) $ :) এলএইচ ট } টি $ ^ wM51j% LDf $ HMAg2bB ^ MQP
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.