আপনি কি কখনো কেইসার সিফার-এর কথা শুনেছেন?
জুলিয়াস সিজার এই টেকনিক ব্যবহার করতেন अपने শত্রুদের থেকে গোপন মেসেজ লুকাতে!
কেইসার সিফার হলো সবচেয়ে আদিম এনক্রিপশন টেকনিকগুলির একটি।
এই সিস্টেমের মূল ধারণা হলো বর্ণমালায় অক্ষরগুলোকে x পজিশন রোটেট করা।
উদাহরণস্বরূপ, x = 1 হলে, 'A' হবে 'B', 'C' হবে 'D' — এভাবে করে।

তাহলে কোডে এটি কীভাবে ইমপ্লিমেন্ট করব?
খুশির খবর, এটি देखनेতেও চেয়ে সহজ। আমরা অক্ষরগুলোকে সংখ্যা (ASCII কোড) হিসেবে রিপ্রেজেন্ট করার সুবিধা নেব, যা অক্ষর রোটেট করার কাজকে শুধু দুটি সংখ্যা যোগ করার বিষয় बना দেবে।
নিজস্ব কেইসার সিফার কনভার্টার তৈরি
আমরা একটি ইনপুট স্ট্রিংকে ইন্টিজার অ্যারে-এ কনভার্ট করে শুরু করব:
ascii = "test".chars.map(&:ord)
এটি ভাঙে ফেললে:
chars মেথড স্ট্রিংকে ক্যারেক্টার অ্যারে-এ ভাগ করে এবং একটি এনুমেরেটর রিটার্ন করে। ফলে আমরা অ্যারেতে map কল করতে পারি।
map মেথড খুবই কাজের যখন আমরা একটি অ্যারের সব এলিমেন্টকে কোনোভাবে ট্রান্সফর্ম করতে চাই। Map-এর রিটার্ন ভ্যালু হলো ট্রান্সফর্ম করা এলিমেন্টের আরেকটি অ্যারে।
নোট: এই সিনট্যাক্স রুবি ১.৯+ এর জন্য, এবং এটি সমতুল্য:
ascii = "test".chars.map { |c| c.ord }
যেহেতু আমরা প্রতিটি অক্ষরকে তার সম্পর্কিত ASCII ভ্যালুতে রূপান্তর করতে চাই, তাই অ্যারের প্রতিটি এলিমেন্টে ord মেথড কল করলাম।
আমাদের উদাহরণে আউটপুট হবে:
[116, 101, 115, 116]
রোটেশনের পালা
বাহ! এখন আমরা রোটেশন সংখ্যা যোগ করব। এটিও map দিয়েই করা যাবে:
shifted = ascii.map { |c| c + 5 } => [121, 106, 120, 121]
এখন সংখ্যাগুলো আবার অক্ষরে রূপান্তর করে জয়েন করলে এনক্রিপ্টেড স্ট্রিং পাওয়া যাবে:
shifted.map { |c| c.chr }.join => "yjxy"
মূল স্ট্রিংটি ফিরে পেতে হলে একই প্রসেস আবার করুন, কিন্তু এইবার বামে শিফট করুন।
মূলত একই পরিমাণ পজিশন শিফট করা জরুরি; অন্যথায় মূল ডেটা ফিরে পাওয়া যাবে না।
ফাইনাল কোড ও বিকল্প ভার্সন
সম্পূর্ণ কেইসার সিফার কোডটি এখানে পাবেন।
এটি একটি দেওয়া স্ট্রিংর জন্য ২৬টি সম্ভাব্য ইটেরেশন প্রোডিউস করে এবং র্যাপিং (wrapping) হ্যান্ডেল করে (পোস্টের উদাহরণগুলো হ্যান্ডেল করে না)।
এছাড়া Array#rotate ব্যবহার করে একটি বিকল্প ভার্সনও আছে।
আপনি এটাও পছন্দ করতে পারেন:
রুবি স্ট্রিং ফরম্যাটিং