एफाइन सिफर का कार्यान्वयन बनाइए। यह मध्य पूर्व में बनी एक प्राचीन एन्क्रिप्शन प्रणाली है।
एफाइन सिफर एक तरह का मोनोअल्फाबेटिक सब्स्टिट्यूशन सिफर है। इसमें हर अक्षर को उसके संख्यात्मक रूप में बदला जाता है, फिर एक गणितीय फंक्शन की मदद से एन्क्रिप्ट किया जाता है, और अंत में उसे उसकी नई संख्या से जुड़े अक्षर में बदल दिया जाता है। हालाँकि सभी मोनोअल्फाबेटिक सिफर कमज़ोर होते हैं, एफाइन सिफर एटबैश सिफर से कहीं ज़्यादा मज़बूत है, क्योंकि इसमें कुंजियों की संख्या बहुत ज़्यादा होती है।
एन्क्रिप्शन फंक्शन यह है:
E(x) = (ai + b) mod m
जहाँ:
i अक्षर का इंडेक्स है, जो 0 से लेकर वर्णमाला की लंबाई से 1 कम तक होता है।m वर्णमाला की लंबाई है।
लैटिन वर्णमाला के लिए m का मान 26 होता है।a और b पूर्णांक हैं, जो मिलकर एन्क्रिप्शन कुंजी बनाते हैं।स्वचालित डिक्रिप्शन के सफल होने के लिए वैल्यू a और m का सहअभाज्य (या परस्पर अभाज्य) होना ज़रूरी है, यानी उनका एकमात्र सामान्य गुणनखंड संख्या 1 हो (अधिक जानकारी सहअभाज्य पूर्णांकों वाले विकिपीडिया लेख में मिल सकती है)।
अगर a, m के साथ सहअभाज्य नहीं है, तो आपके प्रोग्राम को बताना चाहिए कि यह एक एरर है।
वरना उसे दी गई कुंजी से एन्क्रिप्ट या डिक्रिप्ट करना चाहिए।
इस अभ्यास के उद्देश्य से, अंक मान्य इनपुट हैं, लेकिन उन्हें एन्क्रिप्ट नहीं किया जाता।
स्पेस और विराम चिह्न को छोड़ दिया जाता है।
सिफरटेक्स्ट को एक निश्चित लंबाई के समूहों में लिखा जाता है, जिन्हें स्पेस से अलग किया जाता है। पारंपरिक समूह आकार 5 अक्षरों का होता है।
ऐसा इसलिए किया जाता है ताकि शब्दों की सीमाओं के आधार पर एन्क्रिप्ट किए गए टेक्स्ट का अनुमान लगाना मुश्किल हो जाए।
डिक्रिप्शन फंक्शन यह है:
D(y) = (a^-1)(y - b) mod m
जहाँ:
y एन्क्रिप्ट किए गए अक्षर की संख्यात्मक वैल्यू है, यानी y = E(x)
a^-1, a mod m का मॉड्यूलर मल्टीप्लिकेटिव इनवर्स (MMI) हैa और m सहअभाज्य हों।a का MMI वह x होता है जिसके लिए ax को m से भाग देने पर शेषफल 1 आता है:
ax mod m = 1
मॉड्यूलर मल्टीप्लिकेटिव इनवर्स कैसे निकाला जाए और उसका मतलब क्या है, इस बारे में अधिक जानकारी संबंधित विकिपीडिया लेख में मिल सकती है।
a = 5, b = 7 के साथ "test" को एन्क्रिप्ट करने पर "ybty" मिलता हैa = 5, b = 7 के साथ "ybty" को डिक्रिप्ट करने पर "test" मिलता हैa = 11, b = 7 के साथ "ybty" को डिक्रिप्ट करने पर "lqul" मिलता हैa = 19, b = 13 के साथ "kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" को डिक्रिप्ट करने पर "thequickbrownfoxjumpsoverthelazydog" मिलता हैa = 18, b = 13 के साथ "test" को एन्क्रिप्ट करना एक एरर है, क्योंकि 18 और 26 सहअभाज्य नहीं हैंa = 15 के लिए MMI निकालना:
(15 * x) mod 26 = 1(15 * 7) mod 26 = 1, यानी 105 mod 26 = 1
7, 15 mod 26 का MMI हैकभी-कभी एक्सेप्शन उठाना ज़रूरी हो जाता है। ऐसा करते समय आपको हमेशा एक अर्थपूर्ण एरर संदेश शामिल करना चाहिए, जिससे पता चले कि एरर का स्रोत क्या है। इससे आपका कोड पढ़ने में आसान हो जाता है और डीबग करने में काफी मदद मिलती है। जिन स्थितियों में आपको पता हो कि एरर का स्रोत एक खास तरह का होगा, वहाँ आप अंतर्निहित एरर टाइप में से कोई एक उठाना चुन सकते हैं, लेकिन फिर भी एक अर्थपूर्ण संदेश शामिल करना चाहिए।
इस अभ्यास में आपको raise स्टेटमेंट का उपयोग करके एक ValueError "फेंकना" होता है। टेस्ट तभी पास होंगे जब आप exception को raise भी करें और उसके साथ एक संदेश भी दें।
किसी संदेश के साथ ValueError उठाने के लिए, उस संदेश को exception टाइप के आर्गुमेंट के रूप में लिखिए:
raise ValueError("a and m must be coprime.")
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।