পাঠ ৫৫ · ৬০-এর মধ্যে · মডিউল ১২
Home / Courses / Cybersecurity & Ethical Hacking / CTF: ক্লাসিক্যাল সাইফার

CTF ওয়াকথ্রু: ক্লাসিক্যাল সাইফার ক্র্যাকিং

CTF walkthrough: cracking classical ciphers
৯ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • একজন CTF সলভারের চিন্তাপ্রক্রিয়া কীভাবে কাজ করে — প্যাটার্ন চেনা থেকে শুরু করে সমাধান পর্যন্ত
  • Caesar cipher (shift cipher) কীভাবে কাজ করে, এবং একটি real, working ইমপ্লিমেন্টেশন লেখা
  • ব্রুট-ফোর্স বনাম ফ্রিকোয়েন্সি অ্যানালাইসিস — দুটি ভিন্ন cipher-ক্র্যাকিং কৌশল
  • কেন একটি ছোট keyspace (L30/L39-এর keyspace-গণিতের একটি ক্ষুদ্র সংস্করণ) নিরাপত্তার জন্য যথেষ্ট নয়

১ · চ্যালেঞ্জ ব্রিফ

কল্পনা করুন একটি অনুমোদিত CTF প্ল্যাটফর্মে (L01-এর সুরক্ষা মডেল অনুযায়ী — নিজের অ্যাকাউন্টে, বৈধ চ্যালেঞ্জ পরিবেশে) আমরা একটি "Crypto — Easy" ক্যাটাগরির চ্যালেঞ্জ পেয়েছি। বর্ণনায় শুধু লেখা: "একজন পুরনো রোমান জেনারেল তার বার্তা লুকাতে পছন্দ করতেন। নিচের বার্তাটি উদ্ধার করুন।" এবং একটি ciphertext দেওয়া আছে —

চ্যালেঞ্জ ইনপুট

TLLA HA TPKUPNOA

"রোমান জেনারেল" ইঙ্গিতটি ক্লাসিক — এটি সরাসরি Caesar cipherCaesar Cipherএকটি সাধারণ শিফট-ভিত্তিক এনক্রিপশন কৌশল, যেখানে প্রতিটি অক্ষরকে বর্ণমালায় একটি নির্দিষ্ট সংখ্যক অবস্থান শিফট করা হয়। জুলিয়াস সিজার তার সামরিক যোগাযোগে এটি ব্যবহার করতেন বলে জানা যায়।-এর দিকে ইঙ্গিত করে — একটি প্রতিটি অক্ষরকে বর্ণমালায় নির্দিষ্ট সংখ্যক ধাপ শিফট করার কৌশল।

২ · সলভারের চিন্তাপ্রক্রিয়া

  1. প্যাটার্ন লক্ষ্য করুন — ciphertext-এ স্পেস অক্ষত আছে (শব্দ-সীমানা এখনো দৃশ্যমান), এবং প্রতিটি অক্ষর একটি একক আরেকটি অক্ষরে ম্যাপ হয়েছে বলে মনে হচ্ছে — এটি একটি simple substitution/shift cipher-এর সাধারণ লক্ষণ, কোনো জটিল ব্লক সাইফার নয়।
  2. Keyspace-এর আকার হিসাব করুন — Caesar cipher-এ শিফট মান হতে পারে মাত্র ১ থেকে ২৫ (শিফট ০ মানে কোনো পরিবর্তনই হয়নি) — মোট ২৬টি সম্ভাবনা। এটি এতটাই ছোট যে "কোনটা সঠিক" তা বের করার জন্য কোনো জটিল অ্যালগরিদম দরকার নেই — শুধু সবগুলো ট্রাই করে দেখাই যথেষ্ট।
  3. একটি কৌশল বেছে নিন — দুটি স্ট্যান্ডার্ড পদ্ধতি: ব্রুট ফোর্স (সবগুলো ২৬টি শিফট ট্রাই করে, কোনটা পঠনযোগ্য ইংরেজি টেক্সট দেয় তা চোখে দেখে বাছাই করা) অথবা ফ্রিকোয়েন্সি অ্যানালাইসিস (ইংরেজিতে সবচেয়ে বেশি ব্যবহৃত অক্ষর 'E' — ciphertext-এ সবচেয়ে ঘন ঘন আসা অক্ষরটি সম্ভবত shifted 'E', সেখান থেকে শিফট মান অনুমান করা)। এত ছোট keyspace-এর জন্য ব্রুট ফোর্সই দ্রুততম ও সহজতম পথ।
  4. বাস্তবায়ন করুন এবং ফলাফল স্ক্যান করুন — একটি প্রোগ্রামে সবগুলো ২৬টি ডিক্রিপশন প্রিন্ট করে দেখুন কোনটা আসলে ইংরেজির মতো পড়া যায় — বাকি ২৫টি এলোমেলো অক্ষরের সারি হয়ে থাকবে।
কেন এটি L30/L39-এর keyspace-গণিতের একটি ক্ষুদ্র সংস্করণ

L30-তে আমরা দেখেছিলাম পাসওয়ার্ডের keyspace = charset_size^length — দৈর্ঘ্য/জটিলতা বাড়লে এই সংখ্যা exponentially বেড়ে ব্রুট ফোর্সকে অসম্ভব করে তোলে। Caesar cipher-এর keyspace মাত্র ২৬ — কোনো exponent নেই, শুধু একটি ছোট, স্থির সংখ্যা। এই বিশাল পার্থক্যই ব্যাখ্যা করে কেন AES-256 (keyspace 2^256) বাস্তবে অভঙ্গনীয়, অথচ Caesar cipher কম্পিউটার ছাড়াই হাতে কয়েক মিনিটে ভাঙা যায়।

৩ · সমাধান — ব্রুট ফোর্স বাস্তবায়ন

নিচের কোডে প্রথমে একটি real, working caesar_encrypt()/caesar_decrypt() জোড়া আছে (শুধু ইংরেজি অক্ষর শিফট হয়, স্পেস ও অন্য অক্ষর অপরিবর্তিত থাকে, কেস সংরক্ষিত থাকে)। তারপর brute_force_caesar() সবগুলো ২৬টি সম্ভাব্য শিফট দিয়ে ডিক্রিপ্ট করে প্রতিটি candidate প্রিন্ট করে — এটিই ঠিক সেই ব্রুট-ফোর্স কৌশল যা উপরে বর্ণনা করা হয়েছে।

Python
def caesar_encrypt(text, shift):
    result = []
    for ch in text:
        if ch.isalpha():
            base = ord('A') if ch.isupper() else ord('a')
            result.append(chr((ord(ch) - base + shift) % 26 + base))
        else:
            result.append(ch)  # স্পেস ও অন্যান্য অক্ষর অপরিবর্তিত
    return "".join(result)

def caesar_decrypt(text, shift):
    return caesar_encrypt(text, -shift)

# আসল বার্তা এনক্রিপ্ট করে ciphertext তৈরি (শিফট গোপন রাখা হচ্ছে যেন CTF-এর মতো লাগে)
secret_shift = 7
plaintext = "MEET AT MIDNIGHT"
ciphertext = caesar_encrypt(plaintext, secret_shift)

print("মূল বার্তা (plaintext): ", plaintext)
print("এনক্রিপ্টেড (ciphertext):", ciphertext)
print()

def brute_force_caesar(ciphertext):
    print("ব্রুট-ফোর্স — সবগুলো সম্ভাব্য শিফট (০-২৫):")
    for shift in range(26):
        candidate = caesar_decrypt(ciphertext, shift)
        print(f"  শিফট {shift:2d}: {candidate}")

brute_force_caesar(ciphertext)

    
আউটপুটের ২৬টি লাইনের মধ্যে শুধু শিফট ৭-এই পঠনযোগ্য ইংরেজি বার্তা "MEET AT MIDNIGHT" দেখা যাবে — বাকি ২৫টি লাইন অর্থহীন অক্ষরের সারি। এটিই একটি CTF সলভার আসলে যা করেন: প্রোগ্রামটি চালান, তারপর মানুষের চোখ দিয়ে (বা একটি dictionary-word-checker স্ক্রিপ্ট দিয়ে) কোন লাইনটি আসল ইংরেজির মতো দেখাচ্ছে তা বাছাই করেন। কোনো জটিল ক্র্যাকিং টুল লাগেনি — শুধু keyspace-টি ছোট বলেই brute force যথেষ্ট ছিল।

৪ · প্রতিরক্ষা দিক — কেন Caesar cipher বাস্তব সিকিউরিটির জন্য কখনো ব্যবহার করা উচিত নয়

এই লেসন ঐতিহাসিক ও শিক্ষামূলক কারণে Caesar cipher ব্যবহার করেছে — এটি cipher-ক্র্যাকিং যুক্তির সবচেয়ে সহজ উদাহরণ। বাস্তব সিস্টেমে কখনোই ক্লাসিক্যাল substitution cipher দিয়ে প্রকৃত সংবেদনশীল ডেটা সুরক্ষিত করবেন না — সবসময় L35-L39-এ কভার করা আধুনিক, বড়-keyspace অ্যালগরিদম (AES, RSA) ব্যবহার করুন, যাদের keyspace ব্রুট ফোর্সের জন্য বাস্তবসম্মতভাবে অসম্ভব বড়।

মূল কথা · Key takeaway

একটি CTF চ্যালেঞ্জ সমাধানের প্রথম ধাপ প্রায়ই একটি জটিল টুল ব্যবহার নয় — এটি keyspace-এর আকার চিনতে পারা। ছোট keyspace মানে brute force যথেষ্ট; বড় keyspace মানে আপনাকে অন্য দুর্বলতা (implementation বাগ, পাশ-চ্যানেল, বা সম্পূর্ণ ভিন্ন আক্রমণ ভেক্টর) খুঁজতে হবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ ফ্রিকোয়েন্সি অ্যানালাইসিস ব্যবহার করে কীভাবে ব্রুট ফোর্স ছাড়াই সরাসরি শিফট মান অনুমান করা যেত?

ciphertext-এ সবচেয়ে ঘন ঘন আসা অক্ষরটি গুনে বের করা যায় (Python-এ collections.Counter দিয়ে সহজে)। যেহেতু ইংরেজিতে 'E' সবচেয়ে বেশি ব্যবহৃত অক্ষর, ধরে নেওয়া যায় সেই সবচেয়ে ঘন অক্ষরটি আসলে shifted 'E'। তাহলে শিফট = (ciphertext-এর সবচেয়ে ঘন অক্ষর - 'E')। এই পদ্ধতি দীর্ঘ ciphertext-এ ভালো কাজ করে (পরিসংখ্যানগত প্যাটার্ন স্পষ্ট হয়) কিন্তু খুব ছোট বার্তায় (যেমন এই চ্যালেঞ্জে) কম নির্ভরযোগ্য — তাই এখানে ব্রুট ফোর্সই বেশি ব্যবহারিক ছিল।

প্র ০২ একটি Caesar cipher-এর ঠিক বিপরীতে, কেন AES-256-এর মতো একটি আধুনিক সাইফার ব্রুট ফোর্সে ভাঙা বাস্তবে অসম্ভব?

Caesar cipher-এর keyspace মাত্র ২৬ — একটি ছোট, স্থির সংখ্যা। AES-256-এর keyspace 2^256, যা একটি বিশাল সংখ্যা (মহাবিশ্বের অনুমিত পরমাণুর সংখ্যার চেয়েও বেশি)। এমনকি বিশ্বের দ্রুততম সুপারকম্পিউটার দিয়েও প্রতিটি সম্ভাব্য কী ট্রাই করতে মহাবিশ্বের বয়সের চেয়েও বেশি সময় লাগবে — এটিই কেন keyspace-এর আকার একটি cipher-এর ব্রুট-ফোর্স-প্রতিরোধ ক্ষমতার সবচেয়ে গুরুত্বপূর্ণ একক নির্ধারক (L39-এর সরাসরি সম্প্রসারণ)।

প্র ০৩ এই চ্যালেঞ্জে স্পেস ("MEET AT MIDNIGHT"-এর মধ্যেকার ফাঁকা স্থান) এনক্রিপ্ট না হওয়া কীভাবে ব্রুট-ফোর্স সলভারকে সাহায্য করেছিল?

স্পেস অক্ষত থাকায় ciphertext-এ শব্দের দৈর্ঘ্য ও সীমানা দৃশ্যমান থেকে যায় ("TLLA HA TPKUPNOA" স্পষ্টভাবে ৩টি শব্দ দেখায়, যেমন মূল বার্তাতেও ৩টি শব্দ ছিল)। এটি সলভারের চোখকে সাহায্য করে দ্রুত বুঝতে কোন ডিক্রিপশন candidate-টি বাস্তব শব্দের মতো দেখাচ্ছে। একটি বাস্তব-বিশ্বের নিরাপদ cipher কখনো এভাবে গঠনগত তথ্য (word boundaries) ফাঁস করবে না — এটি আরেকটি কারণ কেন Caesar cipher শুধুই একটি শিক্ষামূলক টয়, প্রকৃত সিকিউরিটি টুল নয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে secret_shift-এর মান ৭ থেকে বদলে অন্য কোনো মান (যেমন ৩ বা ১৯) করুন এবং Run চাপুন। brute_force_caesar()-এর আউটপুটে কোন লাইনটি এখন পঠনযোগ্য হবে তা আগে অনুমান করুন।

    যে শিফট মান দিয়ে এনক্রিপ্ট করা হয়েছে, ব্রুট-ফোর্স লুপে ঠিক সেই একই শিফট মানের লাইনটি পঠনযোগ্য "MEET AT MIDNIGHT" দেখাবে — কারণ caesar_decrypt(ciphertext, secret_shift) ঠিক caesar_encrypt-এর বিপরীত অপারেশন সম্পাদন করে। বাকি ২৫টি লাইন আগের মতোই এলোমেলো থাকবে, শুধু সঠিক লাইনের অবস্থান বদলে যাবে।

  2. পরীক্ষা করুন: plaintext-কে একটি ভিন্ন বাক্যে বদলান (যেমন "THE FLAG IS HIDDEN") এবং একই secret_shift = 7 দিয়ে পুরো কোডটি আবার চালান।

    নতুন ciphertext ভিন্ন হবে (যেহেতু plaintext ভিন্ন), কিন্তু ব্রুট-ফোর্স লজিক ঠিক একই থাকবে — শিফট ৭-এই এবার "THE FLAG IS HIDDEN" পঠনযোগ্যভাবে দেখা যাবে। এটি নিশ্চিত করে যে সমাধান পদ্ধতিটি নির্দিষ্ট কোনো বার্তার উপর নির্ভরশীল নয় — এটি Caesar cipher-এর যেকোনো ইনস্ট্যান্সে কাজ করে, যতক্ষণ শিফট ২৬টির মধ্যে একটি হয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
DevSecOps ও সিকিউর CI/CD পাইপলাইন