ক্রিপ্টোগ্রাফিক অ্যাটাক — ব্রুট ফোর্স ও রেইনবো টেবিল
এই পাঠে যা শিখবেন
- এনক্রিপশন কী-এর বিরুদ্ধে ব্রুট-ফোর্স কেন AES-256-এর মতো অ্যালগরিদমে বাস্তবে অকার্যকর
- রেইনবো টেবিল কী এবং এটি precomputation দিয়ে কীভাবে সময় বাঁচায়
- সল্টিং কীভাবে রেইনবো টেবিলকে সম্পূর্ণ অকার্যকর করে দেয়
- padding oracle ও downgrade আক্রমণের ধারণা (উচ্চ-স্তরে)
১ · এনক্রিপশন কী-এর বিরুদ্ধে ব্রুট ফোর্স
L30-এ আমরা দেখেছি একটি পাসওয়ার্ডের key-space (সম্ভাব্য মানের সংখ্যা) কতটা দ্রুত বেড়ে যায় দৈর্ঘ্য ও ক্যারেক্টার-সেট বাড়ালে। ঠিক একই গাণিতিক নীতি এনক্রিপশন কী-এর ক্ষেত্রেও প্রযোজ্য — একটি ব্রুট ফোর্স অ্যাটাকBrute Forceসম্ভাব্য প্রতিটি কী পদ্ধতিগতভাবে চেষ্টা করে সঠিকটি খুঁজে বের করার আক্রমণ। একটি $n$-বিট কী-এর জন্য গড়ে প্রায় $2^{n-1}$টি সম্ভাব্য মান চেষ্টা করতে হবে।
একটি AES-128 কী-এর জন্য key-space $2^{128}$ (প্রায় $3.4 \times 10^{38}$টি সম্ভাব্য মান), আর AES-256-এর জন্য $2^{256}$ (প্রায় $1.15 \times 10^{77}$টি মান) — একটি এমন সংখ্যা যা পর্যবেক্ষণযোগ্য মহাবিশ্বের আনুমানিক পরমাণুর সংখ্যার চেয়েও অনেক বড়। এমনকি পৃথিবীর সবচেয়ে শক্তিশালী সুপারকম্পিউটার সবগুলো একসাথে লাগিয়ে দিলেও, বর্তমান কম্পিউটিং প্রযুক্তিতে একটি একক AES-256 কী ব্রুট-ফোর্স করতে মহাবিশ্বের বয়সের চেয়ে বহুগুণ বেশি সময় লাগবে। এই কারণেই বাস্তব আক্রমণকারীরা প্রায় কখনোই সরাসরি এনক্রিপশন কী ব্রুট-ফোর্স করার চেষ্টা করে না — তারা বরং দুর্বল পাসওয়ার্ড, ভুল কনফিগারেশন (L23), বা ইমপ্লিমেন্টেশন বাগ (নিচে দেখুন) খোঁজে, যেগুলো অনেক সহজ পথ।
একটি ভালোভাবে তৈরি এনক্রিপশন কী (যেমন AES-256 লাইব্রেরি দিয়ে তৈরি একটি র্যান্ডম কী) পুরো key-space জুড়ে সমানভাবে বিস্তৃত — কোনো প্যাটার্ন নেই আক্রমণকারীর জন্য সুবিধা নেওয়ার মতো। কিন্তু একটি মানুষের বেছে নেওয়া পাসওয়ার্ড সাধারণত সেই একই key-space-এর একটি অতি ক্ষুদ্র, অনুমানযোগ্য অংশে পড়ে (সাধারণ শব্দ, প্যাটার্ন) — এই কারণেই ডিকশনারি অ্যাটাক (L30) পাসওয়ার্ডে কাজ করে অথচ ব্রুট-ফোর্স সঠিক এনক্রিপশন কী-তে কাজ করে না।
২ · রেইনবো টেবিল — প্রি-কম্পিউটেশন দিয়ে সময় কেনা
একজন আক্রমণকারীর প্রতিটি লক্ষ্যের জন্য নতুন করে হ্যাশ গণনা করার দরকার নেই যদি সে আগে থেকেই এটা করে রেখে থাকে। একটি রেইনবো টেবিলRainbow Tableলাখো সাধারণ পাসওয়ার্ডের hash → plaintext ম্যাপিং আগে থেকেই কম্পিউট করে রাখা একটি লুকআপ টেবিল — একবার তৈরি হলে যেকোনো লক্ষ্যের বিরুদ্ধে পুনরায় ব্যবহারযোগ্য। লাখো সাধারণ পাসওয়ার্ডের হ্যাশ আগে থেকেই কম্পিউট করে একটি টেবিলে সংরক্ষণ করে রাখে। পরে, একটি চুরি করা হ্যাশ পেলে, আক্রমণকারী শুধু টেবিলে লুকআপ করে — নতুন করে গণনার দরকার নেই। এটি storage-এর বিনিময়ে সময় কেনার একটি ক্লাসিক trade-off।
কিন্তু এই আক্রমণের একটি স্পষ্ট দুর্বলতা আছে: এটি ধরে নেয় প্রতিটি পাসওয়ার্ড একই ভাবে হ্যাশ করা হয়েছে (কোনো অতিরিক্ত ইনপুট ছাড়া)। যদি প্রতিটি পাসওয়ার্ডে একটি আলাদা, র্যান্ডম মান যোগ করে তারপর হ্যাশ করা হয় — তাহলে আক্রমণকারীর প্রি-কম্পিউটেড টেবিল আর কাজে আসে না।
৩ · সল্টিং — রেইনবো টেবিলের বিরুদ্ধে সরাসরি প্রতিরক্ষা
সল্টSaltপ্রতিটি পাসওয়ার্ডের জন্য আলাদাভাবে তৈরি করা একটি এলোমেলো (random) মান, যা হ্যাশ করার আগে পাসওয়ার্ডের সাথে যোগ করা হয়। একটি এলোমেলো মান — প্রতিটি ব্যবহারকারীর জন্য আলাদা — যা পাসওয়ার্ডের সাথে যোগ করে তারপর হ্যাশ করা হয়। এর ফলে, দুইজন ব্যবহারকারীর একই পাসওয়ার্ড থাকলেও, তাদের সংরক্ষিত হ্যাশ সম্পূর্ণ ভিন্ন দেখাবে। একজন আক্রমণকারীকে এখন প্রতিটি সল্টের জন্য আলাদা করে প্রি-কম্পিউটেশন করতে হবে — যা কার্যত রেইনবো টেবিল আক্রমণকে অকার্যকর করে দেয়, কারণ প্রতিটি সল্ট কার্যত একটি সম্পূর্ণ নতুন হ্যাশ-স্পেস তৈরি করে।
import hashlib
password = "Summer2026!"
def hash_with_salt(password, salt):
return hashlib.sha256((salt + password).encode()).hexdigest()
salt_a = "8f3ac1"
salt_b = "27bd9e"
hash_a = hash_with_salt(password, salt_a)
hash_b = hash_with_salt(password, salt_b)
print("পাসওয়ার্ড: ", password)
print("সল্ট A:", salt_a, " -> হ্যাশ:", hash_a)
print("সল্ট B:", salt_b, " -> হ্যাশ:", hash_b)
print()
print("একই পাসওয়ার্ড হলেও দুটো হ্যাশ কি মিলছে?", hash_a == hash_b)
print("অ্যাটাকারের precomputed (আনসল্টেড) রেইনবো টেবিল এই দুটো হ্যাশের কোনোটির সাথেই মিলবে না —")
print("প্রতিটি সল্ট কার্যত একটি সম্পূর্ণ নতুন, আগে থেকে অজানা হ্যাশ-স্পেস তৈরি করে দেয়।")
hash_a ও hash_b সম্পূর্ণ ভিন্ন, যদিও অন্তর্নিহিত পাসওয়ার্ড
হুবহু একই। L30-এ শেখা PBKDF2/bcrypt/Argon2-এর মতো real-world password-hashing ফাংশনগুলো এই সল্টিং স্বয়ংক্রিয়ভাবে
করে — এবং সেইসাথে ইচ্ছাকৃতভাবে ধীর (work-factor সহ), যাতে প্রতিটি অনুমান-প্রচেষ্টাই ব্যয়বহুল হয়, ব্রুট-ফোর্স ও
ডিকশনারি অ্যাটাক উভয়কেই আরও কঠিন করে তোলে।
৪ · Padding Oracle ও Downgrade আক্রমণ — সংক্ষিপ্ত পরিচিতি
কিছু ক্রিপ্টোগ্রাফিক আক্রমণ কী-কে সরাসরি ব্রুট-ফোর্স করে না — বরং একটি ইমপ্লিমেন্টেশনের আচরণ থেকে তথ্য ফাঁস কাজে লাগায়। একটি padding oracle attack-এ, একটি সার্ভার যদি ভুল padding-এর জন্য একটি ভিন্ন error message বা টাইমিং দেখায় (সঠিক ডিক্রিপশনের বিপরীতে), আক্রমণকারী সেই সূক্ষ্ম পার্থক্য বারবার ব্যবহার করে ধীরে ধীরে প্লেইনটেক্সট পুনর্গঠন করতে পারে — কোনো কী ব্রুট-ফোর্স ছাড়াই। একটি downgrade attack-এ, আক্রমণকারী দুই পক্ষকে একটি পুরনো, দুর্বল প্রোটোকল ভার্সন (যেমন TLS 1.0) ব্যবহারে বাধ্য করার চেষ্টা করে, যেখানে পরিচিত দুর্বলতা কাজে লাগানো সহজ। এই দুটোই কেন প্রমাণ করে যে শক্তিশালী অ্যালগরিদম যথেষ্ট নয় — সঠিক ইমপ্লিমেন্টেশন ও কনফিগারেশন (যেমন পুরনো প্রোটোকল ভার্সন সম্পূর্ণ নিষ্ক্রিয় রাখা) সমানভাবে গুরুত্বপূর্ণ।
আধুনিক ক্রিপ্টোগ্রাফির গাণিতিক ভিত্তি (বড় key-space) এতটাই শক্তিশালী যে সরাসরি ব্রুট-ফোর্স আক্রমণ বাস্তবে অপ্রাসঙ্গিক হয়ে গেছে। বাস্তব দুর্বলতাগুলো প্রায় সবসময় আসে দুর্বল পাসওয়ার্ড, সল্টিং না করা, বা ত্রুটিপূর্ণ ইমপ্লিমেন্টেশন থেকে — গণিত থেকে নয়। এটাই M7-এর কেন্দ্রীয় বার্তা: শক্তিশালী ক্রিপ্টো প্রিমিটিভ নির্বাচন করাই যথেষ্ট নয়, সেগুলোকে সঠিকভাবে প্রয়োগ করাই আসল কাজ।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ দুইজন ব্যবহারকারীর পাসওয়ার্ড একই হলেও সল্টিং-এর পরে তাদের সংরক্ষিত হ্যাশ ভিন্ন কেন — এটি ডেটাবেসে কী সুবিধা দেয়?
সল্ট প্রতিটি ব্যবহারকারীর জন্য আলাদা হওয়ায়, হ্যাশ করার আগে ইনপুট (সল্ট + পাসওয়ার্ড) দুইজনের জন্য ভিন্ন হয়ে যায় — ফলে হ্যাশও ভিন্ন। এর মানে, একটি ডেটাবেস ফাঁস হলেও আক্রমণকারী শুধু হ্যাশ দেখে বলতে পারবে না কোন ব্যবহারকারীরা একই পাসওয়ার্ড শেয়ার করছে (যা patronage হিসেবে ফাঁস হওয়া তথ্যকেই মূল্যবান করে তুলত), এবং প্রতিটি এন্ট্রি আলাদাভাবে আক্রমণ করতে হবে — একটি একক প্রি-কম্পিউটেড টেবিল দিয়ে সবাইকে একসাথে ভাঙা যাবে না।
প্র ০২ AES-256-এর কী-স্পেস ব্রুট-ফোর্স করা প্রায় অসম্ভব হওয়া সত্ত্বেও, বাস্তব-জগতের বেশিরভাগ ডেটা ব্রিচ কীভাবে ঘটে?
বেশিরভাগ বাস্তব ব্রিচ গণিত ভাঙার মাধ্যমে ঘটে না — এগুলো ঘটে দুর্বল/পুনর্ব্যবহৃত পাসওয়ার্ড (L30), ফিশিং (M9), মিসকনফিগারেশন (L23), অথবা অপরিবর্তিত ডিফল্ট ক্রেডেনশিয়াল (L41-এ IoT-এর প্রেক্ষাপটে দেখব)-এর মাধ্যমে। একজন বুদ্ধিমান আক্রমণকারী কখনোই একটি ভালোভাবে ইমপ্লিমেন্ট করা AES-256 সরাসরি ব্রুট-ফোর্স করার চেষ্টা করবে না — তারা সবসময় সবচেয়ে দুর্বল লিংক খুঁজবে, আর সেটা প্রায় সবসময় মানুষ বা কনফিগারেশন, গণিত নয়।
প্র ০৩ একটি padding oracle attack-এ আক্রমণকারী কী গণনা ব্রুট-ফোর্স করছে না, তবুও এটাকে কেন একটি "ক্রিপ্টোগ্রাফিক আক্রমণ" বলা হয়?
কারণ আক্রমণটি ক্রিপ্টোগ্রাফিক সিস্টেমের একটি বাস্তবায়ন-বিস্তারিত (implementation detail — এখানে padding যাচাইয়ের সময় সার্ভারের আচরণ) কাজে লাগায়, নিরাপত্তার গাণিতিক ভিত্তি ভাঙে না। এটি প্রমাণ করে যে একটি সিস্টেম "cryptographically secure" হওয়া মানে শুধু অ্যালগরিদম শক্তিশালী হওয়া নয় — প্রতিটি ইমপ্লিমেন্টেশন বিস্তারিতও (error message, টাইমিং, ইত্যাদি) তথ্য ফাঁস না করাটাও সমানভাবে জরুরি।
অনুশীলন
-
পরীক্ষা করুন: উপরের কোড সেলে
salt_b-এর মানsalt_a-এর সাথে হুবহু মিলিয়ে দিন এবং Run চেপে দেখুনhash_a == hash_bকী হয়।এবার
hash_a == hash_bহবেTrue— কারণ একই সল্ট ও একই পাসওয়ার্ড মানে একই ইনপুট, তাই একই হ্যাশ। এটি দেখায় সল্টের এলোমেলো ও ব্যক্তি-বিশেষে ভিন্ন হওয়াটাই মূল রক্ষাকবচ — যদি একটি অ্যাপ্লিকেশন সব ব্যবহারকারীর জন্য একটি স্থির/অভিন্ন সল্ট ব্যবহার করে (একটি সাধারণ বাস্তব ভুল), তা আসলে কোনো প্রকৃত সুরক্ষা দেয় না — একটি রেইনবো টেবিল সেই একটি সল্টের জন্যই তৈরি করা যেতে পারে। -
চিন্তা করুন: একটি ৪-বিট কী-এর key-space হলো $2^4 = 16$টি সম্ভাব্য মান। একজন আক্রমণকারীর গড়ে
কতগুলো মান চেষ্টা করতে হবে সঠিকটি খুঁজে পেতে, এবং AES-128 ($2^{128}$) কী-এর সাথে তুলনা করলে এই গ্রোথ কেমন লাগে?
গড়ে প্রায় অর্ধেক অর্থাৎ $8$টি মান চেষ্টা করলেই সঠিকটি পাওয়ার সম্ভাবনা থাকে ($2^4/2$) — একটি ৪-বিট কী হাতে-কলমেও কয়েক সেকেন্ডে ভাঙা সম্ভব। কিন্তু প্রতিটি অতিরিক্ত বিট key-space-কে দ্বিগুণ করে দেয় — তাই $128$ বিটে পৌঁছাতে পৌঁছাতে সংখ্যাটি ৪-বিট key-space-এর তুলনায় ট্রিলিয়ন ট্রিলিয়ন গুণ বড় হয়ে যায়। এটাই কেন key-length সামান্য বাড়ানো নিরাপত্তাকে exponentially শক্তিশালী করে তোলে, linearly নয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৬০টি পাঠ পরবর্তী পাঠ: WiFi সিকিউরিটি — WEP, WPA, WPA2, WPA3 দিয়ে শুরু হবে মডিউল ৮ — ওয়্যারলেস ও মোবাইল সিকিউরিটি।
- Discrete Mathematics কোর্স সহায়ক কোর্স এক্সপোনেনশিয়াল গ্রোথ ও কম্বিনেটরিক্সের গণিত আরও গভীরভাবে শিখতে দেখুন।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স এনক্রিপশন, অথেন্টিকেশন ও লগিং কীভাবে বড় সিস্টেমে প্রয়োগ হয় তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design ও Cybersecurity — সব এক জায়গায়।