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 यादृच्छिक छोटे अक्षर हों।
Python 3.6 से, "रैंडम" संख्याएँ बनाने के लिए दो अलग-अलग मॉड्यूल हैं:
random नाम का मॉड्यूल स्यूडो-रैंडम है, यानी यह असली रैंडमनेस नहीं बनाता, बल्कि एक ऐसे एल्गोरिदम पर चलता है जो रैंडमनेस की नकल करता है। चूँकि ये "रैंडम संख्याएँ" एक जाने-पहचाने एल्गोरिदम से बनती हैं, इसलिए ये वास्तव में रैंडम नहीं होतीं। नतीजा यह है कि random मॉड्यूल क्रिप्टोग्राफी के लिए ठीक से उपयुक्त नहीं है और इसका इस्तेमाल नहीं करना चाहिए, ठीक इसी वजह से कि यह स्यूडो-रैंडम है।
secrets नाम का मॉड्यूल क्रिप्टोग्राफिक रूप से मज़बूत "रैंडम" संख्याएँ बनाता है, जो क्रिप्टोग्राफी के लिए आवश्यक अधिक सुरक्षा देती हैं। सबसे सख्त मायने में ये संख्याएँ भी स्यूडो-रैंडम ही हैं, लेकिन secrets मॉड्यूल इसकी गारंटी देता है कि वह जो संख्याएँ बनाता है, वे पूरी तरह अप्रत्याशित होती हैं।
चूँकि यह केवल एक अभ्यास है, random मॉड्यूल इस्तेमाल करना ठीक है, लेकिन ध्यान रखिए कि अगर इसे वास्तव में क्रिप्टोग्राफी में इस्तेमाल किया जाए तो यह बहुत असुरक्षित होगा।
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।