Vigenère सिफर का एक कार्यान्वयन बनाइए। Vigenère सिफर एक साधारण सबस्टिट्यूशन सिफर है।
सिफर एक एल्गोरिदम है जिसका उपयोग किसी स्ट्रिंग को एन्क्रिप्ट या एनकोड करने के लिए किया जाता है। जो स्ट्रिंग एन्क्रिप्ट नहीं की गई है उसे प्लेनटेक्स्ट कहते हैं और एन्क्रिप्ट की गई स्ट्रिंग को सिफरटेक्स्ट कहते हैं। प्लेनटेक्स्ट को सिफरटेक्स्ट में बदलने को एनकोडिंग कहते हैं और इसका उल्टा करने को डिकोडिंग।
सबस्टिट्यूशन सिफर में प्लेनटेक्स्ट के हर अक्षर की जगह एक सिफरटेक्स्ट अक्षर रखा जाता है, जिसकी गणना एक कुंजी की मदद से की जाती है। (ध्यान दीजिए, हो सकता है कि रखा गया अक्षर मूल अक्षर जैसा ही हो।)
इस सिफर में कुंजी छोटे अक्षरों की एक श्रृंखला होती है, जैसे "abcd".
प्लेनटेक्स्ट के हर अक्षर को कुंजी के संगत अक्षर के आधार पर तय की गई दूरी से खिसकाया या घुमाया जाता है।
कुंजी में "a" का मतलब है 0 का खिसकाव (यानी कोई खिसकाव नहीं)।
कुंजी में "b" का मतलब है 1 का खिसकाव।
कुंजी में "c" का मतलब है 2 का खिसकाव, और इसी तरह आगे भी।
प्लेनटेक्स्ट का पहला अक्षर कुंजी के पहले अक्षर का उपयोग करता है, प्लेनटेक्स्ट का दूसरा अक्षर कुंजी के दूसरे अक्षर का उपयोग करता है, और इसी तरह आगे भी। अगर प्लेनटेक्स्ट के अक्षर खत्म होने से पहले कुंजी के अक्षर खत्म हो जाएँ, तो कुंजी की शुरुआत से दोबारा शुरू कीजिए।
अगर कुंजी में सिर्फ एक ही अक्षर हो, जैसे "dddddd", तो प्लेनटेक्स्ट के सभी अक्षर एक ही मात्रा में खिसकाए जाते हैं (इस उदाहरण में तीन)। इससे यह घुमाव वाले सिफर या खिसकाव वाले सिफर जैसा बन जाता है (जिसे कभी-कभी सीज़र सिफर कहते हैं)।
उदाहरण के लिए, प्लेनटेक्स्ट "iamapandabear" से "ldpdsdqgdehdu" बन जाएगा।
अगर कुंजी में सिर्फ "a" अक्षर हो (एक या अधिक बार), तो खिसकाव की दूरी शून्य होती है और सिफरटेक्स्ट प्लेनटेक्स्ट जैसा ही रहता है।
लेकिन आम तौर पर कुंजी इससे कहीं ज़्यादा जटिल होती है!
अगर कुंजी "abcd" है, तो प्लेनटेक्स्ट के अक्षर 0, 1, 2 और 3 की दूरी से खिसकाए जाएँगे।
अगर प्लेनटेक्स्ट "hello" है, तो हमें 5 बार खिसकाना पड़ेगा, इसलिए कुंजी फिर से शुरू से चलेगी और खिसकाव की दूरियाँ 0, 1, 2, 3 और 0 होंगी।
"hello" के अक्षरों पर ये खिसकाव लगाने से हमें "hfnoo" मिलता है।
अगर कोई कुंजी नहीं दी गई हो, तो एक कुंजी बनाइए जिसमें लैटिन वर्णमाला के कम से कम 100 यादृच्छिक छोटे अक्षर हों।
Cipher इंटरफेस की परिभाषा cipher.go में दी गई है।
आपके इम्प्लीमेंटेशन को Cipher इंटरफेस के अनुरूप होना चाहिए।
type Cipher interface {
Encode(string) string
Decode(string) string
}
यह अपेक्षित है कि Encode स्ट्रिंग में मौजूद उन सभी वैल्यू को अनदेखा करेगा जो A-Za-z नहीं हैं; वे आउटपुट में नहीं दिखेंगी।
आउटपुट को भी छोटे अक्षरों में बदल दिया जाएगा।
सिफर पाने के लिए इस्तेमाल किए जाने वाले फंक्शन ये हैं:
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
NewShift के लिए आर्गुमेंट 1 से 25 या -1 से -25 के बीच होना चाहिए।
शून्य की अनुमति नहीं है।
अमान्य आर्गुमेंट के लिए NewShift nil लौटाता है।
NewVigenere का आर्गुमेंट केवल छोटे अक्षरों a-z से बना होना चाहिए।
'a' अक्षर से पूरी तरह बनी वैल्यू की अनुमति नहीं है।
अमान्य आर्गुमेंट के लिए NewVigenere nil लौटाता है।
Exercism पर साइन अप कीजिए और Go को 35 कॉन्सेप्ट167 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।