CTF ওয়াকথ্রু: ক্লাসিক্যাল সাইফার ক্র্যাকিং
এই পাঠে যা শিখবেন
- একজন CTF সলভারের চিন্তাপ্রক্রিয়া কীভাবে কাজ করে — প্যাটার্ন চেনা থেকে শুরু করে সমাধান পর্যন্ত
- Caesar cipher (shift cipher) কীভাবে কাজ করে, এবং একটি real, working ইমপ্লিমেন্টেশন লেখা
- ব্রুট-ফোর্স বনাম ফ্রিকোয়েন্সি অ্যানালাইসিস — দুটি ভিন্ন cipher-ক্র্যাকিং কৌশল
- কেন একটি ছোট keyspace (L30/L39-এর keyspace-গণিতের একটি ক্ষুদ্র সংস্করণ) নিরাপত্তার জন্য যথেষ্ট নয়
১ · চ্যালেঞ্জ ব্রিফ
কল্পনা করুন একটি অনুমোদিত CTF প্ল্যাটফর্মে (L01-এর সুরক্ষা মডেল অনুযায়ী — নিজের অ্যাকাউন্টে, বৈধ চ্যালেঞ্জ পরিবেশে) আমরা একটি "Crypto — Easy" ক্যাটাগরির চ্যালেঞ্জ পেয়েছি। বর্ণনায় শুধু লেখা: "একজন পুরনো রোমান জেনারেল তার বার্তা লুকাতে পছন্দ করতেন। নিচের বার্তাটি উদ্ধার করুন।" এবং একটি ciphertext দেওয়া আছে —
TLLA HA TPKUPNOA
"রোমান জেনারেল" ইঙ্গিতটি ক্লাসিক — এটি সরাসরি Caesar cipherCaesar Cipherএকটি সাধারণ শিফট-ভিত্তিক এনক্রিপশন কৌশল, যেখানে প্রতিটি অক্ষরকে বর্ণমালায় একটি নির্দিষ্ট সংখ্যক অবস্থান শিফট করা হয়। জুলিয়াস সিজার তার সামরিক যোগাযোগে এটি ব্যবহার করতেন বলে জানা যায়।-এর দিকে ইঙ্গিত করে — একটি প্রতিটি অক্ষরকে বর্ণমালায় নির্দিষ্ট সংখ্যক ধাপ শিফট করার কৌশল।
২ · সলভারের চিন্তাপ্রক্রিয়া
- প্যাটার্ন লক্ষ্য করুন — ciphertext-এ স্পেস অক্ষত আছে (শব্দ-সীমানা এখনো দৃশ্যমান), এবং প্রতিটি অক্ষর একটি একক আরেকটি অক্ষরে ম্যাপ হয়েছে বলে মনে হচ্ছে — এটি একটি simple substitution/shift cipher-এর সাধারণ লক্ষণ, কোনো জটিল ব্লক সাইফার নয়।
- Keyspace-এর আকার হিসাব করুন — Caesar cipher-এ শিফট মান হতে পারে মাত্র ১ থেকে ২৫ (শিফট ০ মানে কোনো পরিবর্তনই হয়নি) — মোট ২৬টি সম্ভাবনা। এটি এতটাই ছোট যে "কোনটা সঠিক" তা বের করার জন্য কোনো জটিল অ্যালগরিদম দরকার নেই — শুধু সবগুলো ট্রাই করে দেখাই যথেষ্ট।
- একটি কৌশল বেছে নিন — দুটি স্ট্যান্ডার্ড পদ্ধতি: ব্রুট ফোর্স (সবগুলো ২৬টি শিফট ট্রাই করে, কোনটা পঠনযোগ্য ইংরেজি টেক্সট দেয় তা চোখে দেখে বাছাই করা) অথবা ফ্রিকোয়েন্সি অ্যানালাইসিস (ইংরেজিতে সবচেয়ে বেশি ব্যবহৃত অক্ষর 'E' — ciphertext-এ সবচেয়ে ঘন ঘন আসা অক্ষরটি সম্ভবত shifted 'E', সেখান থেকে শিফট মান অনুমান করা)। এত ছোট 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 প্রিন্ট করে —
এটিই ঠিক সেই ব্রুট-ফোর্স কৌশল যা উপরে বর্ণনা করা হয়েছে।
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)
৪ · প্রতিরক্ষা দিক — কেন Caesar cipher বাস্তব সিকিউরিটির জন্য কখনো ব্যবহার করা উচিত নয়
এই লেসন ঐতিহাসিক ও শিক্ষামূলক কারণে Caesar cipher ব্যবহার করেছে — এটি cipher-ক্র্যাকিং যুক্তির সবচেয়ে সহজ উদাহরণ। বাস্তব সিস্টেমে কখনোই ক্লাসিক্যাল substitution cipher দিয়ে প্রকৃত সংবেদনশীল ডেটা সুরক্ষিত করবেন না — সবসময় L35-L39-এ কভার করা আধুনিক, বড়-keyspace অ্যালগরিদম (AES, RSA) ব্যবহার করুন, যাদের keyspace ব্রুট ফোর্সের জন্য বাস্তবসম্মতভাবে অসম্ভব বড়।
একটি 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 শুধুই একটি শিক্ষামূলক টয়, প্রকৃত সিকিউরিটি টুল নয়।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
secret_shift-এর মান ৭ থেকে বদলে অন্য কোনো মান (যেমন ৩ বা ১৯) করুন এবং Run চাপুন।brute_force_caesar()-এর আউটপুটে কোন লাইনটি এখন পঠনযোগ্য হবে তা আগে অনুমান করুন।যে শিফট মান দিয়ে এনক্রিপ্ট করা হয়েছে, ব্রুট-ফোর্স লুপে ঠিক সেই একই শিফট মানের লাইনটি পঠনযোগ্য "MEET AT MIDNIGHT" দেখাবে — কারণ
caesar_decrypt(ciphertext, secret_shift)ঠিকcaesar_encrypt-এর বিপরীত অপারেশন সম্পাদন করে। বাকি ২৫টি লাইন আগের মতোই এলোমেলো থাকবে, শুধু সঠিক লাইনের অবস্থান বদলে যাবে। -
পরীক্ষা করুন:
plaintext-কে একটি ভিন্ন বাক্যে বদলান (যেমন"THE FLAG IS HIDDEN") এবং একইsecret_shift = 7দিয়ে পুরো কোডটি আবার চালান।নতুন ciphertext ভিন্ন হবে (যেহেতু plaintext ভিন্ন), কিন্তু ব্রুট-ফোর্স লজিক ঠিক একই থাকবে — শিফট ৭-এই এবার "THE FLAG IS HIDDEN" পঠনযোগ্যভাবে দেখা যাবে। এটি নিশ্চিত করে যে সমাধান পদ্ধতিটি নির্দিষ্ট কোনো বার্তার উপর নির্ভরশীল নয় — এটি Caesar cipher-এর যেকোনো ইনস্ট্যান্সে কাজ করে, যতক্ষণ শিফট ২৬টির মধ্যে একটি হয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৬০টি পাঠ পরবর্তী পাঠ — CTF ওয়াকথ্রু: স্যান্ডবক্সড SQL ইনজেকশন — এই মডিউলের পরবর্তী চ্যালেঞ্জ।
- Discrete Mathematics কোর্স সহায়ক কোর্স মডুলার এরিথমেটিক ও কম্বিনেটরিক্স — keyspace-গণনার গাণিতিক ভিত্তি।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স বাস্তব সিস্টেমে এনক্রিপশন কীভাবে সঠিকভাবে প্রয়োগ করা হয় তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design ও Cybersecurity — সব এক জায়গায়।