সরল সাইফার

সরল সাইফার

সহজ

নির্দেশনা

ভিজেনেয়ার সাইফার-এর একটি ইমপ্লিমেন্টেশন তৈরি করুন। ভিজেনেয়ার সাইফার একটি সরল সাবস্টিটিউশন সাইফার।

সাইফারের পরিভাষা

সাইফার হলো একটি অ্যালগরিদম, যা একটি স্ট্রিং এনক্রিপ্ট বা এনকোড করতে ব্যবহৃত হয়। এনক্রিপ্ট না করা স্ট্রিংটিকে বলা হয় প্লেইনটেক্সট এবং এনক্রিপ্ট করা স্ট্রিংটিকে বলা হয় সাইফারটেক্সট। প্লেইনটেক্সটকে সাইফারটেক্সটে রূপান্তর করাকে বলা হয় এনকোডিং, আর এর উল্টো কাজটিকে বলা হয় ডিকোডিং।

একটি সাবস্টিটিউশন সাইফারে প্লেইনটেক্সটের প্রতিটি অক্ষরকে একটি সাইফারটেক্সট অক্ষর দিয়ে প্রতিস্থাপন করা হয়, যা একটি কী-এর সাহায্যে হিসাব করা হয়। (লক্ষ করুন, প্রতিস্থাপিত অক্ষরটি মূল অক্ষরের মতোই হতে পারে।)

এনকোডিংয়ের বিস্তারিত

এই সাইফারে কী হলো ছোট হাতের অক্ষরের একটি ক্রম, যেমন "abcd"। প্লেইনটেক্সটের প্রতিটি অক্ষরকে কী-এর সংশ্লিষ্ট একটি অক্ষরের ভিত্তিতে নির্দিষ্ট দূরত্বে শিফট বা রোটেট করা হয়। কী-তে একটি "a" মানে ০ শিফট (অর্থাৎ কোনো শিফট নেই)। কী-তে একটি "b" মানে ১ শিফট। কী-তে একটি "c" মানে ২ শিফট, এবং এভাবে চলতে থাকে।

প্লেইনটেক্সটের প্রথম অক্ষরটি কী-এর প্রথম অক্ষর ব্যবহার করে, প্লেইনটেক্সটের দ্বিতীয় অক্ষরটি কী-এর দ্বিতীয় অক্ষর ব্যবহার করে, এভাবে চলতে থাকে। প্লেইনটেক্সটের অক্ষর শেষ হওয়ার আগেই যদি কী-এর অক্ষর শেষ হয়ে যায়, তাহলে কী-এর শুরু থেকে আবার শুরু করুন।

কী-তে যদি একটিমাত্র অক্ষর থাকে, যেমন "dddddd", তাহলে প্লেইনটেক্সটের সব অক্ষর একই পরিমাণে (এই উদাহরণে তিন) শিফট হয়, যা এটিকে রোটেশনাল সাইফার বা শিফট সাইফারের (যাকে মাঝে মাঝে সিজার সাইফারও বলা হয়) সমান করে তোলে। উদাহরণস্বরূপ, প্লেইনটেক্সট "iamapandabear" হয়ে যাবে "ldpdsdqgdehdu"।

কী-তে যদি শুধু "a" অক্ষরটি থাকে (একবার বা একাধিকবার), তাহলে শিফটের দূরত্ব শূন্য এবং সাইফারটেক্সট প্লেইনটেক্সটের মতোই থাকে।

তবে সাধারণত কী এর চেয়ে অনেক বেশি জটিল হয়! কী যদি "abcd" হয়, তাহলে প্লেইনটেক্সটের অক্ষরগুলো ০, ১, ২ আর ৩ দূরত্বে শিফট হবে। প্লেইনটেক্সট যদি "hello" হয়, তাহলে আমাদের ৫টি শিফট দরকার, তাই কী আবার ঘুরে শুরুতে ফিরে যাবে এবং শিফটের দূরত্ব হবে ০, ১, ২, ৩ আর ০। "hello"-এর অক্ষরগুলোতে ওই শিফটগুলো প্রয়োগ করলে আমরা পাই "hfnoo"।

র্যান্ডম কী

কোনো কী দেওয়া না থাকলে, লাতিন বর্ণমালার অন্তত ১০০টি র্যান্ডম ছোট হাতের অক্ষর নিয়ে একটি কী তৈরি করুন।

এখানে random নাকি secrets ব্যবহার করা উচিত?

Python 3.6 থেকে শুরু করে "র‍্যান্ডম" সংখ্যা তৈরির জন্য দুটি ভিন্ন মডিউল রয়েছে:

random নামের মডিউলটি সিউডো-র‍্যান্ডম, অর্থাৎ এটি সত্যিকারের র‍্যান্ডমনেস তৈরি করে না, বরং এমন একটি অ্যালগরিদম অনুসরণ করে যা র‍্যান্ডমনেস সিমুলেট করে। যেহেতু এই "র‍্যান্ডম সংখ্যাগুলো" একটি জানা অ্যালগরিদমের মাধ্যমে তৈরি হয়, তাই এগুলো সত্যিকার অর্থে র‍্যান্ডম নয়। ফলে random মডিউলটি ক্রিপ্টোগ্রাফির জন্য সঠিকভাবে উপযুক্ত নয় এবং এটি ব্যবহার করা উচিত নয়, কারণ এটি সিউডো-র‍্যান্ডম।

secrets নামের মডিউলটি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী "র‍্যান্ডম" সংখ্যা তৈরি করে, যা ক্রিপ্টোগ্রাফির জন্য প্রয়োজনীয় বেশি নিরাপত্তা দেয়। কঠোর অর্থে এগুলো এখনও সিউডো-র‍্যান্ডম, তবে এদের একটি নিশ্চয়তা আছে যে এরা যে সংখ্যাগুলো তৈরি করে সেগুলো একেবারেই অনুমানযোগ্য নয়।

যেহেতু এটি কেবল একটি অনুশীলনী, তাই random মডিউল ব্যবহার করাই ঠিক আছে, তবে মনে রাখবেন যে এটি সত্যিই ক্রিপ্টোগ্রাফিতে ব্যবহার করা হলে বেশ অনিরাপদ হবে।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Python Exercism

সরল সাইফার শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।