আমি গিমলির অন্যতম লেখক। আমাদের কাছে ইতিমধ্যে সি-তে একটি ২-টুইট (২৮০ টি অক্ষর) সংস্করণ রয়েছে তবে আমি এটি দেখতে চাই যে এটি কতটা ছোট হতে পারে।
গিমলি ( কাগজ , ওয়েবসাইট ) উচ্চ সুরক্ষা স্তরের ক্রিপ্টোগ্রাফিক ক্রমুশন নকশা সহ একটি উচ্চ গতি যা ক্রিপ্টোগ্রাফিক হার্ডওয়্যার এবং এমবেডেড সিস্টেমস (সিএইচইএস) 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
-round
পরিবর্তে --round
মানে এটি কখনোই বন্ধ। --
কোনও এন ড্যাশে রূপান্তর করা সম্ভবত কোডে প্রস্তাবিত নয় :)