𝗖𝗕𝗖 𝗕𝗶𝘁 𝗙𝗹𝗶𝗽𝗽𝗶𝗻𝗴-এর ব্যাখ্যা

এনক্রিপশন মানেই এই নয় যে আপনার ডেটা কারচুপি (tampering) থেকে নিরাপদ।

অনেক ডেভেলপার এই ভুলটি করেন। তারা মনে করেন যে আক্রমণকারী যদি ডেটা পড়তে না পারে, তবে তারা সেটি পরিবর্তনও করতে পারবে না। এটি ভুল। ক্রিপ্টোগ্রাফিতে গোপনীয়তা (secrecy) এবং অখণ্ডতা (integrity)-কে দুটি আলাদা কাজ হিসেবে বিবেচনা করা হয়।

CBC Bit Flipping আক্রমণটি এটিই প্রমাণ করে। একজন আক্রমণকারী আপনার সিক্রেট কী (secret key) না জেনেই আপনার ডেটা পরিবর্তন করতে পারে।

এটি যেভাবে কাজ করে:

AES ডেটাকে একটি বড় অংশে এনক্রিপ্ট করে না। এটি ডেটাকে ১৬-বাইটের ব্লকে বিভক্ত করে। CBC মোডে, এই ব্লকগুলো একে অপরের সাথে চেইন বা শিকলের মতো যুক্ত থাকে। প্রথম ব্লকের এনক্রিপ্টেড আউটপুট দ্বিতীয় ব্লকের প্লেইনটেক্সট (plaintext)-এর সাথে মিশে যায়।

এই চেইনটি ডিক্রিপশনের সময় একটি দুর্বলতা তৈরি করে। ব্লক ২-এর আসল টেক্সট পেতে, সার্ভার এটিকে ডিক্রিপ্ট করে এবং ব্লক ১-এর সাইফারটেক্সট (ciphertext)-এর সাথে যুক্ত করে।

একজন আক্রমণকারী এটিকে কাজে লাগাতে পারে:

আক্রমণকারীর মেসেজটি পড়ার প্রয়োজন নেই। তারা কেবল চূড়ান্ত ফলাফল পরিবর্তন করার জন্য বিটগুলো ফ্লিপ (flip) করে।

সেশনের জন্য এনক্রিপ্টেড কুকি ব্যবহার করা একটি পুরনো ওয়েব অ্যাপের কথা চিন্তা করুন। একটি কুকিতে থাকতে পারে: userid=994;role=user;

একজন আক্রমণকারী এই কুকিটি ইন্টারসেপ্ট করে এবং সাইফারটেক্সটে বিট পরিবর্তন করে। তারা অনেকগুলো রিকোয়েস্ট পাঠায় যতক্ষণ না সার্ভার একটি গ্রহণ করে। যেহেতু সার্ভার কেবল ডেটাটি ডিক্রিপ্ট হচ্ছে কি না তা পরীক্ষা করে, তাই এটি পরিবর্তিত টেক্সটটি প্রসেস করে। হঠাৎ করেই, ডিক্রিপ্ট করা স্ট্রিংটি দেখায়: userid=994;role=admi;

আক্রমণকারী এখন অ্যাডমিন অ্যাক্সেস পেয়ে গেছে। তারা কখনোই কী বা আসল কুকিটি পড়েনি।

ভুলটি হলো এনক্রিপশন যে অখণ্ডতা (integrity) নিশ্চিত করবে বলে ধরে নেওয়া।

এটি ঠিক করতে AES-GCM-এর মতো Authenticated Encryption ব্যবহার করুন। এটি একটি ক্রিপ্টোগ্রাফিক ট্যাগ তৈরি করে। এই ট্যাগটি একটি সিলের মতো কাজ করে। যদি একজন আক্রমণকারী একটি বিটও পরিবর্তন করে, তবে সিলটি ভেঙে যায়। সার্ভার তাৎক্ষণিকভাবে ডেটাটি প্রত্যাখ্যান করে।

যদি আপনাকে অবশ্যই CBC ব্যবহার করতে হয়, তবে Encrypt-then-MAC আর্কিটেকচার ব্যবহার করুন। সাইফারটেক্সটের জন্য একটি অথেন্টিকেশন কোড তৈরি করুন এবং ডিক্রিপশন শুরু করার আগে সেটি যাচাই করুন।

গোপন ডেটা মানেই সবসময় নির্ভরযোগ্য ডেটা নয়। সিদ্ধান্ত নেওয়ার জন্য ডেটা ব্যবহার করার আগে সবসময় নিশ্চিত করুন যে ডেটাটি অপরিবর্তিত আছে।

CBC Bit-Flipping ব্যাখ্যা করা হলো: কেন শুধুমাত্র এনক্রিপশন ইন্টিগ্রিটি (Integrity) নিশ্চিত করে না

আমরা যখন এনক্রিপশনের কথা ভাবি, তখন আমাদের মাথায় সাধারণত গোপনীয়তার (confidentiality) ধারণা আসে। আমরা ভাবি যে, যদি ডেটা এনক্রিপ্ট করা থাকে, তবে তা নিরাপদ। কিন্তু এনক্রিপশন মানেই যে ডেটা সুরক্ষিত বা অপরিবর্তিত থাকবে, তা কিন্তু নয়।

এখানেই আসে ইন্টিগ্রিটি (Integrity) বা অখণ্ডতার প্রশ্ন। ইন্টিগ্রিটি নিশ্চিত করে যে ডেটাটি পাঠানোর সময় বা স্টোরেজে থাকাকালীন কেউ তা পরিবর্তন বা কারচুপি করেনি। CBC (Cipher Block Chaining) মোডে একটি বিশেষ দুর্বলতা রয়েছে যা আক্রমণকারীকে ডেটার একটি নির্দিষ্ট অংশ পরিবর্তন করার সুযোগ দেয়, এমনকি তারা এনক্রিপশন কী (key) না জানলেও। একে বলা হয় Bit-flipping attack

CBC মোড কীভাবে কাজ করে?

CBC মোডে, প্রতিটি প্লেইনটেক্সট ব্লককে এনক্রিপ্ট করার আগে তার আগের সাইফারটেক্সট ব্লকের সাথে XOR করা হয়। প্রথম ব্লকের ক্ষেত্রে, একটি Initialization Vector (IV) ব্যবহার করা হয়।

ডিক্রিপশন প্রক্রিয়ার গাণিতিক সূত্রটি হলো: $P_i = D_k(C_i) \oplus C_{i-1}$

এখানে:

দুর্বলতাটি কোথায়?

উপরের সূত্রটি লক্ষ্য করলে দেখা যায় যে, $P_i$ এর মান সরাসরি $C_{i-1}$ এর ওপর নির্ভর করে। যদি কোনো আক্রমণকারী $C_{i-1}$ ব্লকের একটি নির্দিষ্ট বিট পরিবর্তন করে, তবে ডিক্রিপশন করার পর $P_i$ ব্লকের সংশ্লিষ্ট বিটটিও একইভাবে পরিবর্তিত হয়ে যাবে।

আক্রমণকারী কী (key) জানে না, কিন্তু সে জানে যে $C_{i-1}$ এর একটি বিট পরিবর্তন করলে $P_i$ তে কী পরিবর্তন ঘটবে। এটি একটি predictable change বা পূর্বানুমানযোগ্য পরিবর্তন।

একটি আক্রমণাত্মক উদাহরণ (Attack Scenario)

ধরা যাক, একটি অ্যাপ্লিকেশন একটি কুকি (cookie) ব্যবহার করে ব্যবহারকারীর রোল (role) সংরক্ষণ করে। কুকিটি দেখতে এমন: user_id=123;role=user

এই কুকিটিকে CBC মোডে এনক্রিপ্ট করা হয়েছে। আক্রমণকারী জানে না এনক্রিপশন কী কী, কিন্তু সে জানে যে role=user অংশটি একটি নির্দিষ্ট সাইফারটেক্সট ব্লকের অংশ।

আক্রমণকারী যদি সাইফারটেক্সট ব্লকের এমন একটি বিট পরিবর্তন করে যা user শব্দটিকে root শব্দে রূপান্তরিত করতে পারে, তবে সার্ভার যখন সেই কুকিটি ডিক্রিপ্ট করবে, তখন সে দেখবে: user_id=123;role=root

এখন আক্রমণকারী সিস্টেমের অ্যাডমিনিস্ট্রেটর বা রুট ব্যবহারকারী হিসেবে কাজ করতে পারবে! মজার ব্যাপার হলো, এই পরিবর্তনের ফলে আগের ব্লকটি ($C_{i-1}$) সম্পূর্ণ নষ্ট বা গার্বেজ (garbage) হয়ে যাবে, কিন্তু আক্রমণকারী যদি জানে যে শুধুমাত্র দ্বিতীয় ব্লকের পরিবর্তনটিই তার জন্য গুরুত্বপূর্ণ, তবে সে সফলভাবে আক্রমণটি সম্পন্ন করতে পারবে।

কীভাবে এটি প্রতিরোধ করবেন?

শুধুমাত্র এনক্রিপশন ব্যবহার করা যথেষ্ট নয়। ডেটার ইন্টিগ্রিটি নিশ্চিত করার জন্য আপনাকে Authenticated Encryption ব্যবহার করতে হবে।

১. AEAD (Authenticated Encryption with Associated Data): আধুনিক এনক্রিপশন মোড যেমন AES-GCM বা AES-CCM ব্যবহার করুন। এগুলো এনক্রিপশনের পাশাপাশি একটি অথেন্টিকেশন ট্যাগ (authentication tag) প্রদান করে, যা নিশ্চিত করে যে ডেটা পরিবর্তিত হয়নি।

২. HMAC (Hash-based Message Authentication Code): আপনি যদি CBC ব্যবহার করতেই চান, তবে এনক্রিপ্ট করার পর সাইফারটেক্সটের ওপর একটি HMAC প্রয়োগ করুন (Encrypt-then-MAC পদ্ধতি)। এটি নিশ্চিত করবে যে সাইফারটেক্সটে কোনো পরিবর্তন করা হলে তা ডিক্রিপশনের আগেই ধরা পড়বে।

উপসংহার

মনে রাখবেন, এনক্রিপশন আপনাকে গোপনীয়তা দেয়, কিন্তু এটি আপনাকে নিরাপত্তা বা ইন্টিগ্রিটির নিশ্চয়তা দেয় না। একটি নিরাপদ সিস্টেম তৈরির জন্য সর্বদা এনক্রিপশন এবং অথেন্টিকেশন—উভয়কেই গুরুত্ব দিন।