অ্যাফাইন সাইফারের একটি ইমপ্লিমেন্টেশন তৈরি করুন। এটি মধ্যপ্রাচ্যে তৈরি হওয়া একটি প্রাচীন এনক্রিপশন সিস্টেম।
অ্যাফাইন সাইফার হলো একধরনের মনোঅ্যালফাবেটিক সাবস্টিটিউশন সাইফার। এতে প্রতিটি ক্যারেক্টারকে তার সংখ্যাগত সমতুল্যে ম্যাপ করা হয়, তারপর একটি গাণিতিক ফাংশন দিয়ে সেটি এনক্রিপ্ট করা হয় এবং শেষে তার নতুন সংখ্যাগত মানের সঙ্গে সম্পর্কিত অক্ষরে রূপান্তর করা হয়। সব মনোঅ্যালফাবেটিক সাইফারই দুর্বল, তবে অ্যাফাইন সাইফার Atbash সাইফারের চেয়ে অনেক বেশি শক্তিশালী, কারণ এতে অনেক বেশি কী থাকে।
এনক্রিপশন ফাংশনটি হলো:
E(x) = (ai + b) mod m
যেখানে:
i হলো অক্ষরটির ইনডেক্স, 0 থেকে বর্ণমালার দৈর্ঘ্য - 1 পর্যন্ত।m হলো বর্ণমালার দৈর্ঘ্য।
ল্যাটিন বর্ণমালার জন্য m হলো 26।a ও b হলো ইন্টিজার, যা মিলে এনক্রিপশন কী তৈরি করে।স্বয়ংক্রিয় ডিক্রিপশন সফল হওয়ার জন্য a ও m মানকে সহমৌলিক (ইংরেজিতে coprime; অথবা, আপেক্ষিকভাবে মৌলিক) হতে হবে, অর্থাৎ 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কখনও কখনও একটি এক্সসেপশন রেইজ করা প্রয়োজন হয়। এটি করার সময় এররটির উৎস কী তা বোঝাতে আপনার সর্বদা একটি অর্থবহ এরর মেসেজ যোগ করা উচিত। এতে আপনার কোড আরও পাঠযোগ্য হয় এবং ডিবাগিংয়ে অনেক সাহায্য করে। যেসব ক্ষেত্রে আপনি জানেন যে এররের উৎস একটি নির্দিষ্ট টাইপ হবে, সেখানে আপনি বিল্ট-ইন এরর টাইপগুলোর একটি রেইজ করা বেছে নিতে পারেন, তবে তবুও একটি অর্থবহ মেসেজ যোগ করা উচিত।
এই নির্দিষ্ট অনুশীলনীতে একটি ValueError "থ্রো" করার জন্য আপনাকে raise স্টেটমেন্ট ব্যবহার করতে হবে। টেস্টগুলো তখনই পাস করবে, যখন আপনি exception-টি raise করবেন এবং তার সঙ্গে একটি মেসেজও দেবেন।
একটি মেসেজসহ ValueError রেইজ করতে, মেসেজটি exception টাইপের একটি আর্গুমেন্ট হিসেবে লিখুন:
raise ValueError("a and m must be coprime.")
Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।