जैसा कि नीचे वर्णित है, एक सिफरसेबर एन्क्रिप्शन प्रोग्राम लागू करें। दिशानिर्देश:
- बाइट्स में सबसे छोटी प्रविष्टि, जीतती है।
- हालांकि, कोड-गोल्फ मानदंडों से प्रस्थान में , आपको दिलचस्प प्रविष्टियों को पोस्ट करने का स्वागत है, भले ही वे गंभीर गोल्फ प्रविष्टियां न हों।
- एक प्रविष्टि आम तौर पर एक प्रोग्राम होता है जो मानक इनपुट से प्लेटेक्स्ट लेता है, और मानक आउटपुट के लिए सिफरटेक्स्ट लिखता है, जिसमें कुंजी (उपयोगकर्ता द्वारा) निर्दिष्ट की जाती है।
- हालाँकि, यदि आप इसे एक प्रक्रिया के रूप में लागू करना चाहते हैं, तो यह ठीक है।
- IV को एक क्रिप्टोग्राफिक रूप से सुरक्षित छद्म आयामी संख्या जनरेटर से आना चाहिए। यदि आपकी भाषा का समर्थन नहीं करता है, तो एक अलग चुनें। ;-)
- कृपया किसी भी क्रिप्टो-विशिष्ट लाइब्रेरी, सिस्टम कॉल या निर्देश (PRNG के अलावा अन्य, जैसा कि ऊपर लिखा गया है) का उपयोग न करें। बेशक, सामान्य निम्न-स्तरीय बिटवाइज़ ऑपरेशन ठीक हैं।
CipherSaber RC4 / Arcfour का एक प्रकार है, इसलिए मैं बाद का वर्णन करके शुरू करूँगा, फिर CipherSaber परिवर्तन करता है।
0. RC4 / Arcfour
Arcfour पूरी तरह से कहीं और निर्दिष्ट है , लेकिन पूर्णता के लिए, मैं यहां इसका वर्णन करूंगा। (इंटरनेट-ड्राफ्ट और इस विवरण के बीच किसी भी विसंगतियों के मामले में, पूर्व मानक है।)
कुंजी सेटअप
दो सरणियों को सेट करें, S
और S2
, दोनों की लंबाई 256, जहां k_1
कुंजी की पहली बाइट है, और k_n
अंतिम है।
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
कुंजी के बाइट्स के साथ बार-बार भरा जाता है, जब तक कि सभी 256 बाइट्स भर न जाएं।)
फिर, j
0 से आरंभ करें, और 256 बार फेरबदल करें:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
यह कुंजी सेटअप पूरा करता है। S2
सरणी नहीं रह गया है यहां इस्तेमाल किया जाता है, और झाड़ी जा सकता है।
सिफर स्ट्रीम जनरेशन
प्रारंभिक i
और j
0 के लिए, फिर निम्न के रूप में कुंजी स्ट्रीम उत्पन्न करें:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
डेटा एन्क्रिप्ट / डिक्रिप्ट करना
- एन्क्रिप्ट करने के लिए, सादे के साथ कीस्ट्रीम आउटपुट को XOR करें
- डिक्रिप्ट करने के लिए, सिफर के साथ कीरस्ट्रीम आउटपुट को XOR करें
1. सिफरसाबेर
CipherSaber (जो हम इस प्रश्न में लागू कर रहे हैं) RC4 / Arcfour के दो तरीकों से भिन्नता है:
10-बाइट IV / गैर
किसी संदेश को एन्क्रिप्ट करते समय, 10 यादृच्छिक बाइट्स प्राप्त किए जाने चाहिए, जैसे कि के माध्यम से /dev/urandom
, और एन्क्रिप्टेड आउटपुट के पहले 10 बाइट्स में लिखा जाना चाहिए। किसी संदेश को डिक्रिप्ट करते समय, इनपुट के पहले 10 बाइट्स IV होते हैं जो इसे एन्क्रिप्ट करने के लिए उपयोग किए जाते हैं।
RC4 / Arcfour कुंजी सेटअप चरण कुंजी के साथ चलाया passphrase || IV
जाता है, जहां passphrase
उपयोगकर्ता द्वारा निर्दिष्ट पासफ़्रेज़ है, IV
जैसा कि ऊपर वर्णित है, और ||
समवर्ती है। तो, "नमस्ते, दुनिया!" का पासफ़्रेज़ और "सुपरक्लिफ़" का एक IV (हालांकि इसकी संभावना नहीं है :-P) "हैलो, दुनिया! सुपरफ़ेल्ट" की कुंजी का परिणाम होगा।
कुंजी सेटअप के एकाधिक पुनरावृत्तियों
WEP एन्क्रिप्शन को पूरी तरह से तोड़ने वाले भेद्यता को रोकने में मदद करने के लिए, RC4 के प्रमुख सेटअप चरण के फेरबदल लूप को उपयोगकर्ता द्वारा निर्दिष्ट संख्या में चलाया जाता है। j
पुनरावृत्तियों के बीच का मान रखा जाना चाहिए।
2. परीक्षण वैक्टर
यहाँ कुछ परीक्षण वैक्टर हैं जिनका उपयोग आप अपने कार्यक्रमों का परीक्षण करने के लिए कर सकते हैं। इसके अलावा, स्क्विश ओस्सिफ्रेज ने एक सिफरबेस एन्क्रिप्शन और डिक्रिप्शन उपकरण बनाया है जिसका उपयोग आप अपने परिणामों को मान्य करने के लिए कर सकते हैं।
आपको केवल एन्क्रिप्शन प्रोग्राम को लागू करने की आवश्यकता है। आपको डिक्रिप्शन प्रोग्राम को आपूर्ति करने की आवश्यकता नहीं है, लेकिन सही तरीके से लागू डिक्रिप्शन प्रोग्राम के साथ सही कुंजी का उपयोग करने पर संसाधित होने पर आपके एन्क्रिप्शन प्रोग्राम के आउटपुट को मूल इनपुट तक सही ढंग से राउंडट्रिप करना होगा।
urandom
(यदि आप चाहें तो एक अलग प्रविष्टि हो सकती है) यदि आप "जीतने" की परवाह करते हैं। :-)