GolfScript, 60 अक्षर
{[[0 1{.283{1$2*.255>@*^}:r~^}255*].@?~)={257r}4*99]{^}*}:S;
यह कोड एक फ़ंक्शन को परिभाषित करता है जिसका नाम S
एक बाइट में होता है और उस पर रिजेंडेल एस-बॉक्स लागू होता है। (यह r
कुछ वर्णों को बचाने के लिए नामित आंतरिक सहायक फ़ंक्शन का भी उपयोग करता है ।)
यह कार्यान्वयन GF (2 8 ) के व्युत्क्रमों के लिए एक लघुगणक तालिका का उपयोग करता है , जैसा कि थॉमस पोर्निन द्वारा सुझाया गया है । कुछ वर्णों को बचाने के लिए, पूरे लघुगणक तालिका को प्रत्येक इनपुट बाइट के लिए पुनर्गणना किया जाता है; फिर भी, और गोल्फस्क्रिप्ट सामान्य रूप से बहुत धीमी भाषा में होने के बावजूद, यह कोड मेरे पुराने लैपटॉप पर एक बाइट को संसाधित करने में केवल 10 एमएस लेता है। लघुगणक तालिका (as L
) को बढ़ाकर इसे तीन बाइट्स की मामूली लागत पर लगभग 0.5 ms प्रति बाइट तक गति प्रदान करता है:
[0 1{.283{1$2*.255>@*^}:r~^}255*]:L;{[L?~)L={257r}4*99]{^}*}:S;
सुविधा के लिए, यहां एक साधारण परीक्षण हार्नेस है जो फ़ंक्शन को कॉल करता है S
, जैसा कि ऊपर परिभाषित किया गया है, हेक्स में पूरे एस-बॉक्स की गणना और प्रिंट करने के लिए जैसे विकिपीडिया पर :
"0123456789abcdef"1/:h; 256, {S .16/h= \16%h= " "++ }% 16/ n*
इस कोड को ऑनलाइन आज़माएं।
(ऑनलाइन डेमो बहुत अधिक समय लेने से बचने के लिए लघुगणक सारणी का पूर्वाभ्यास करता है। फिर भी, ऑनलाइन गोल्फस्क्रिप्ट साइट कभी-कभी बेतरतीब ढंग से समय निकाल सकती है; यह साइट के साथ एक ज्ञात समस्या है, और एक पुनः लोड आमतौर पर इसे ठीक करता है।)
स्पष्टीकरण:
चलो लघुगणक तालिका गणना के साथ शुरू करते हैं, और विशेष रूप से सहायक समारोह के साथ r
:
{1$2*.255>@*^}:r
यह फ़ंक्शन स्टैक पर दो इनपुट लेता है: एक बाइट और एक कमी बिटमास्क (256 और 511 के बीच एक स्थिर)। यह इनपुट बाइट को डुप्लिकेट करता है, कॉपी को 2 से गुणा करता है, और यदि परिणाम 255 से अधिक हो जाता है, तो इसे 256 के नीचे लाने के लिए इसे बिटकोस्क के साथ XORs करता है।
लॉग-टेबल जनरेटिंग कोड के भीतर, फंक्शन r
को बिटमस्क 283 = 0x11b (जो कि रिजेन्डेल GF (2 8 ) रिडक्शन पॉलीनोमियल x 8 + x 4 + x 3 + x + 1) के साथ कहा जाता है, और परिणाम XORed है) मूल बाइट के साथ, रिझंडेल परिमित क्षेत्र में प्रभावी रूप से इसे 3 (= x + 1, एक बहुपद के रूप में) से गुणा करें । यह गुणन 255 बार दोहराया जाता है, बाइट 1 से शुरू होता है, और परिणाम (एक प्रारंभिक शून्य बाइट) 257-तत्व सरणी में एकत्र किए जाते हैं L
जो इस तरह दिखता है (मध्य भाग छोड़ा गया):
[0 1 3 5 15 17 51 85 255 26 46 ... 180 199 82 246 1]
257 तत्व होने का कारण यह है कि, पहले से 0 के साथ और 1 दो बार होने के साथ, हम किसी भी बाइट के मॉड्यूलर व्युत्क्रम को केवल इस सरणी में इसके (शून्य-आधारित) सूचकांक को देखकर, इसे नकारते हुए, और देख सकते हैं। उसी एरे में नेगेटिव इंडेक्स पर बाइट अप करें। (गोल्फस्क्रिप्ट में, कई अन्य प्रोग्रामिंग भाषाओं में, नकारात्मक सरणी अनुक्रम सरणी के अंत से पीछे की ओर गिनते हैं।) वास्तव में, यह वही है जो L?~)L=
फ़ंक्शन की शुरुआत में कोड S
करता है।
कोड के बाकी हेल्पर फ़ंक्शन को बिट r
बिटस्क 257 = 2 8 + 1 के साथ उल्टे इनपुट बाइट की चार बिट-रोटेटेड प्रतियां बनाने के लिए कहते हैं। ये सभी एक सरणी में एकत्र किए जाते हैं, लगातार 99 = 0x63 के साथ, और XORed मिलकर अंतिम आउटपुट का उत्पादन करते हैं।