এই পর্বে যা শিখবেন
- Cryptography কী সমাধান করে, আর কী কখনোই করে না
- চার লক্ষ্যের জন্য সঠিক হাতিয়ার বাছাই করা
- Caesar থেকে Vigenère কেন পড়ে গেল, আর Kerckhoffs ও Shannon কী বদলালেন
- One-time pad-এর নিখুঁত গোপনীয়তা, আর তার দাম
- Entropy মাপা, আর ভালো ও খারাপ random সংখ্যা আলাদা করা
- Key space আর brute force-এর সময় নিজে হিসাব করা
১ · Cryptography কী সমাধান করে, আর কী করে না
ধরুন আপনি ব্যাংকের লকারে গয়না রেখেছেন। লকারের দরজা ইস্পাতের, তালা খুবই মজবুত। এখন কেউ যদি আপনার চাবিটাই চুরি করে, অথবা ম্যানেজার সেজে আপনার কাছ থেকে চাবি চেয়ে নেয়, তাহলে ইস্পাতের দরজা কোনো কাজে আসে না। তালার শক্তি আর চাবির নিরাপত্তা আলাদা দুটি বিষয়।
Cryptography হলো গণিতের সাহায্যে তথ্যকে রক্ষা করার বিদ্যা। এটি আধুনিক নিরাপত্তার সবচেয়ে শক্ত দেয়াল। মোবাইল ব্যাংকিংয়ের অ্যাপ, HTTPS, ফোনের লক করা স্টোরেজ, সবকিছু এর ওপর দাঁড়িয়ে। তবে পর্ব ০২-এ যে confidentiality, integrity আর availability দেখেছেন, cryptography এদের সবটা দেয় না। শুরুতেই সীমাটি পরিষ্কার করে নিই।
যা সমাধান করে
অনিরাপদ পথে তথ্য গোপন রাখা। জমা থাকা ডেটা চুরি হলেও পড়া ঠেকানো। বদল ধরা। বার্তা কার কাছ থেকে এসেছে তা যাচাই করা। সই দিয়ে পরে অস্বীকার ঠেকানো।
পথের ডেটা, জমা ডেটাযা সমাধান করে না
চুরি হওয়া key. আক্রান্ত ফোন বা কম্পিউটার, যেখানে তথ্য খোলা অবস্থায় থাকে। Application-এর logic-এর ভুল। প্রতারিত মানুষ। সার্ভিস বন্ধ হয়ে যাওয়া। কে কার সাথে কখন কথা বলছে, সেই metadata-ও সাধারণত থেকে যায়।
কোর্সের বাকি অনেক পর্বের বিষয়Adi Shamir-এর একটি পরিচিত উক্তি আছে: cryptography সাধারণত ভাঙা হয় না, পাশ কাটিয়ে যাওয়া হয়। অর্থাৎ হামলাকারী গণিত ভাঙে না, সে তালার পাশের জানালা খোঁজে। রক্ষক হিসেবে তাই দুটি প্রশ্ন আলাদা করুন: “এই algorithm কি শক্ত?” আর “এই পুরো ব্যবস্থায় key কোথায় থাকে, কে ছুঁতে পারে?” দ্বিতীয় প্রশ্নেই বেশিরভাগ ভুল থাকে।
“আমরা encryption ব্যবহার করি” কোনো নিরাপত্তা-দাবি নয়। সঠিক দাবি হবে: কোন ডেটা, কোন হুমকির বিরুদ্ধে, কোন algorithm, key কোথায় থাকে, কে খুলতে পারে। পর্ব ০৪-এর threat model ছাড়া cryptography-র সিদ্ধান্ত অন্ধকারে ঢিল ছোড়ার মতো।
এই পর্ব মডিউলের ভিত্তি। AES-এর ভেতরের কাজ পর্ব ০৮-এ, hash আর MAC পর্ব ০৯-এ, public key পর্ব ১০-এ, certificate পর্ব ১১-এ দেখবেন। Network-এর চোখে পুরো ছবিটি দেখতে চাইলে Computer Networks কোর্সের Cryptography-র ভিত্তি পড়ুন। সেখানে যা আছে, এখানে তার পুনরাবৃত্তি করব না।
২ · চার লক্ষ্য — কোন কাজে কোন হাতিয়ার
পোস্ট অফিসের কথা ভাবুন। আপনি একটি চিঠি পাঠাচ্ছেন। চারটি আলাদা দুশ্চিন্তা হতে পারে। কেউ কি চিঠিটি পড়বে? কেউ কি লেখা বদলে দেবে? চিঠিটি কি সত্যিই আপনার বন্ধুর লেখা? আর আপনার বন্ধু কি পরে বলতে পারবেন, “আমি এটা লিখিনি”? প্রতিটি দুশ্চিন্তার সমাধান আলাদা।
| লক্ষ্য | প্রশ্ন | মূল হাতিয়ার | উপমা |
|---|---|---|---|
| Confidentiality | অন্যে পড়তে পারবে? | Encryption | তালা দেওয়া বাক্স |
| Integrity | কেউ বদলেছে? | Hash (আসল ছাপ জানা থাকলে), MAC, AEAD | গালা-সিল করা খাম |
| Authentication | সত্যিই কি সে-ই? | MAC, digital signature | পরিচিত সিলমোহর |
| Non-repudiation | পরে অস্বীকার করতে পারবে? | শুধু digital signature | সাক্ষীর সামনে সই |
Authentication শব্দটি এখানে দুই অর্থে আসে। পর্ব ১৫-তে এটি মানুষের পরিচয় যাচাই বোঝাবে। এখানে এটি বার্তার উৎস যাচাই, যাকে message authentication বলে। আর MAC কেন non-repudiation দেয় না? কারণ দুই পক্ষের হাতেই একই key থাকে, তাই বিচারকের সামনে প্রমাণ করা যায় না কোন পক্ষ বানিয়েছে। Signature-এ private key থাকে একজনের কাছেই।
নিচের ধাপগুলোতে একটি কাল্পনিক অনলাইন বাজার ছয়টি বাস্তব প্রয়োজনের সামনে পড়েছে। প্রতিটিতে আগে নিজে বলার চেষ্টা করুন, তারপর উত্তর দেখুন।
- গোপনencryption
- অক্ষতhash
- উৎসMAC
- প্রমাণsignature
- একসাথেAEAD
- সচলcrypto নয়
Need : stolen backup must stay unreadable Use : encryption with a secret key Gives: confidentiality Not : proof that the file was not altered
Need : did this download change? Use : hash, compared with a trusted value Gives: integrity, if the value is trusted Not : secrecy, or proof of who made it
Need : did our partner send this, unchanged? Use : MAC with a shared key (HMAC) Gives: integrity + message authentication Not : proof to a third party
Need : anyone can verify who approved it Use : digital signature (private key) Gives: integrity, origin, non-repudiation Not : secrecy of the document
Need : secret AND tamper-evident Use : AEAD, e.g. AES-GCM, ChaCha20-Poly1305 Gives: confidentiality + integrity + origin Not : non-repudiation (shared key)
Need : the site must stay up Use : no crypto primitive does this Gives: use redundancy, backup, capacity Note : crypto can even cost availability
- Backup চুরি হলেও পড়া যাবে না। এখানে দরকার গোপনীয়তা, তাই encryption. তবে শুধু encryption বদল ধরে না। আরও খেয়াল রাখুন, key হারালে backup-ও হারাবে।
- Installer বদলেছে কি না। Hash ফাইলের ছাপ দেয়। কিন্তু এতে কোনো গোপন key নেই। হামলাকারী ফাইল আর ছাপ দুটিই বদলাতে পারলে যাচাই অর্থহীন। তাই ছাপটি আলাদা বিশ্বস্ত পথে আসতে হয়।
- অংশীদারের বার্তা। দুই পক্ষের কাছে একই গোপন key. HMAC মিলে গেলে বোঝা যায় বার্তা অক্ষত, আর key-ধারীর কাছ থেকেই এসেছে। কিন্তু তৃতীয় পক্ষকে প্রমাণ করা যায় না, কারণ আপনিও একই key রাখেন।
- পরে অস্বীকার ঠেকানো। Signature শুধু private key দিয়ে বানানো যায়, আর যে কেউ public key দিয়ে যাচাই করতে পারে। তবে সই মানে “গোপন” নয়। নথিটি খোলা থাকতে পারে।
- গোপন আর অক্ষত, একসাথে। AEAD এক ধাক্কায় দুটি কাজ করে। আজকের ডিফল্ট পছন্দ এটি, আর নিজে encryption ও MAC জোড়া লাগানোর ভুল এতে এড়ানো যায়। বিস্তারিত পর্ব ০৮-এ।
- সচল থাকা। Availability কোনো cryptographic হাতিয়ার দেয় না। উল্টো key হারালে নিজের ডেটাই খোলা যায় না। এই ঝুঁকি মাথায় রেখেই key-র backup আর পুনরুদ্ধারের পরিকল্পনা করতে হয়।
তিনটি শব্দ প্রায়ই গুলিয়ে যায়। Encoding (যেমন Base64) শুধু রূপ বদলায়, এতে কোনো key নেই, যে কেউ ফেরাতে পারে। Encryption key ছাড়া ফেরানো যায় না। Hash একমুখী, মূল ডেটা ফিরে পাওয়ার জন্য নকশাই করা হয়নি। Base64 দেখে “encrypted” ভাবা খুব সাধারণ একটি ভুল।
৩ · চারটি মূল শব্দ — plaintext, ciphertext, key আর algorithm
প্রতিটি encryption ব্যবস্থায় চারটি অংশ থাকে। Plaintext হলো মূল পড়ার যোগ্য তথ্য। Ciphertext হলো তালাবন্ধ রূপ। Cipher বা algorithm হলো রূপান্তরের নিয়ম। আর key হলো একটি গোপন মান, যা ঠিক করে নিয়মটি এবার ঠিক কীভাবে চলবে।
বাজারের তালার দোকানে একই মডেলের হাজারটা তালা বিক্রি হয়। তালার নকশা সবার জানা, কেউ চাইলে কিনে খুলে দেখতে পারেন। তবু আপনার বাড়ি নিরাপদ, কারণ আপনার চাবির খাঁজ আলাদা। Algorithm হলো তালার নকশা, key হলো চাবির খাঁজ।
Encryption-এর ছবি: কী প্রকাশ্য, কী গোপন
The enemy sees the channel and knows the algorithm, but not the key
দুই পাশে একই key থাকলে তাকে symmetric ব্যবস্থা বলে। আলাদা দুটি key (public আর private) থাকলে তাকে asymmetric বা public key ব্যবস্থা বলে। প্রথমটি দ্রুত, দ্বিতীয়টি key ভাগ করে নেওয়ার সমস্যা মেটায়। বাস্তবে দুটিই একসাথে চলে, যা পর্ব ১০-এ দেখবেন।
৪ · পুরোনো cipher-এর ইতিহাস, আর কেন তারা পড়ে গেল
এই অংশ শুধু ইতিহাস। আজ কোনো কিছু রক্ষা করতে এই cipher-গুলো ব্যবহার করা যায় না। তবু এদের পতন থেকে যে শিক্ষা আসে, সেটি আধুনিক নকশার ভিত্তি।
| Cipher | নিয়ম | Key-র সংখ্যা | দুর্বলতা |
|---|---|---|---|
| Caesar | প্রতিটি অক্ষর নির্দিষ্ট ঘর সরানো | ২৫টি কার্যকর | হাতে গুনেই শেষ |
| Substitution | প্রতিটি অক্ষরের বদলে আরেকটি নির্দিষ্ট অক্ষর | 26! ≈ 288.4 | অক্ষরের ব্যবহারের হার থেকে যায় |
| Vigenère | একটি শব্দ ঘুরে ঘুরে ঠিক করে কত ঘর সরবে | 26L (L = key-র দৈর্ঘ্য) | Key-র দৈর্ঘ্য বের হলে কয়েকটি Caesar-এ ভেঙে যায় |
দ্বিতীয় সারিটি খেয়াল করুন। 26! সংখ্যাটি প্রায় 4 × 1026, যা 288-এর বেশি। ৫৬-bit DES-এর key-র চেয়ে এটি কয়েকশো কোটি গুণ বড়। তবু হাজার বছরেরও বেশি আগে এই cipher ভাঙা গিয়েছিল। নবম শতকে আরব পণ্ডিত al-Kindi লিখে গেছেন কীভাবে অক্ষর গুনে frequency analysis করা যায়।
কারণটি সরল। যেকোনো ভাষায় কিছু অক্ষর বেশি আসে। ইংরেজিতে E সবচেয়ে বেশি। Substitution অক্ষরের নাম বদলায়, ব্যবহারের অভ্যাস বদলায় না। ঠিক যেমন ছদ্মবেশ পরলেও মানুষের হাঁটার ধরন থেকে যায়। নিচের খেলনা Caesar একটি নির্দিষ্ট ইংরেজি লেখায় এই ঘটনাটি দেখায়।
// Toy cipher: real নয়, শুধু ধারণার জন্য. Never protect anything with it.
const sample = 'THE ENEMY KNOWS THE SYSTEM SO KEEP ONLY THE KEY SECRET. ' +
'WHEN THE KEY LEAKS YOU CHANGE THE KEY AND THE METHOD STAYS THE SAME. ' +
'THESE LETTERS KEEP THEIR HABITS EVEN WHEN THEY WEAR A NEW NAME.';
const A = 65, KEY = 3;
const shift = (s, k) => s.replace(/[A-Z]/g, c =>
String.fromCharCode((c.charCodeAt(0) - A + k) % 26 + A));
function counts(s) {
const m = {};
for (const c of s.replace(/[^A-Z]/g, '')) m[c] = (m[c] || 0) + 1;
return Object.entries(m).sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1));
}
function entropy(rows) {
const n = rows.reduce((t, r) => t + r[1], 0);
return -rows.reduce((t, r) => t + (r[1] / n) * Math.log2(r[1] / n), 0);
}
function chart(title, rows) {
console.log(title);
for (const [c, n] of rows.slice(0, 5)) {
console.log(` ${c} ${'#'.repeat(n)} ${n}`);
}
console.log(` entropy per letter = ${entropy(rows).toFixed(3)} bits`);
}
const cipher = shift(sample, KEY);
console.log('Toy Caesar, shift ' + KEY + ': ' + cipher.slice(0, 24) + '...');
const plainRows = counts(sample), cipherRows = counts(cipher);
chart('Plaintext letters', plainRows);
chart('Ciphertext letters', cipherRows);
const gap = (cipherRows[0][0].charCodeAt(0) - plainRows[0][0].charCodeAt(0) + 26) % 26;
console.log(`Top letter moved ${plainRows[0][0]} -> ${cipherRows[0][0]}, gap = ${gap}`);
console.log('The shape survived: same counts, new labels.');Plaintext-এ E এসেছে ৩৬ বার, আর ciphertext-এ H এসেছে ঠিক ৩৬ বার। পরের সারিগুলোও মিলে যায়: T আর W দুটিই ১৭ বার, H আর K দুটিই ১৫ বার। দুই পাশেই entropy per letter = 3.711 bits. শেষে Top letter moved E -> H, gap = 3 দেখাচ্ছে, লেখা বদলেছে, কিন্তু আকৃতি একই আছে। এটিই পুরোনো cipher-এর মূল ত্রুটি: ciphertext ভেতরের পরিসংখ্যান ফাঁস করে দেয়।
Vigenère এই সমস্যা কমাতে চেয়েছিল। একই অক্ষর একেক জায়গায় একেক অক্ষরে বদলাত, তাই বার গ্রাফ চ্যাপ্টা হয়ে আসত। ১৫৫৩ সালে Giovan Battista Bellaso এটি বর্ণনা করেন, পরে ভুল করে Blaise de Vigenère-এর নাম জুড়ে যায়। প্রায় তিনশো বছর একে “অভেদ্য” বলা হতো। ১৮৬৩ সালে Friedrich Kasiski সাধারণ পদ্ধতি প্রকাশ করেন: পুনরাবৃত্তির দূরত্ব থেকে key-র দৈর্ঘ্য অনুমান করা যায়, তারপর প্রতিটি অবস্থান আলাদা Caesar হয়ে যায়। Charles Babbage-ও আগে এটি বের করেছিলেন বলে জানা যায়, তবে প্রকাশ করেননি।
এক: বড় key space জরুরি, কিন্তু যথেষ্ট নয়। দুই: ciphertext-এ plaintext-এর কোনো ছাপ থাকলে সেটিই ফাটল। তিন: “এটা কেউ ভাঙতে পারবে না” কথাটি তিনশো বছর সত্য মনে হয়েও মিথ্যা হতে পারে।
৫ · Kerckhoffs আর Shannon — গোপন থাকবে শুধু key
পর্ব ০৩-এ open design নীতিতে এই ধারণার সাথে পরিচয় হয়েছে। এবার এটি cryptography-র ভেতরে দেখি। ১৮৮৩ সালে Auguste Kerckhoffs ফরাসি সামরিক সাময়িকীতে La Cryptographie Militaire নামে একটি লেখা প্রকাশ করেন। সেখানে সামরিক cipher-এর ছয়টি শর্ত ছিল। দ্বিতীয় শর্তটিই বিখ্যাত হয়েছে: ব্যবস্থাটিতে গোপনীয়তার দরকার থাকবে না, শত্রুর হাতে পড়লেও সমস্যা হবে না।
তাঁর যুক্তি ছিল বাস্তব। যুদ্ধে যন্ত্র ধরা পড়ে, মানুষ দল বদলায়। পদ্ধতি একবার ফাঁস হলে পুরো ব্যবস্থা নতুন করে বানানো খুব কঠিন। কিন্তু key বদলানো সহজ। তাই যে জিনিসটি সহজে বদলানো যায়, শুধু সেটিই গোপন থাকুক। আজকের ভাষায় Kerckhoffs-এর নীতি এই:
ব্যবস্থাটি নিরাপদ থাকতে হবে।
১৯৪৯ সালে Claude Shannon Communication Theory of Secrecy Systems প্রবন্ধে একই কথা ধরে নিয়ে হিসাব করেন: শত্রু ব্যবস্থাটি জানে। একে Shannon-এর উক্তি বলা হয়, ইংরেজিতে “the enemy knows the system”. রক্ষকের জন্য এর মানে: নকশা করার সময় ধরে নিন, আপনার source code, document, এমনকি কর্মীর ল্যাপটপ শত্রুর হাতে। তখনও কি তথ্য নিরাপদ? উত্তর “হ্যাঁ” হলে তবেই নকশা ঠিক।
| পরিস্থিতি | গোপন algorithm-এ | প্রকাশ্য algorithm, গোপন key-তে |
|---|---|---|
| Source code ফাঁস হলো | পুরো ব্যবস্থা ভেঙে গেল | কোনো সমস্যা নেই, যদি key code-এ না থাকে |
| একজন কর্মী চাকরি ছাড়লেন | নকশা বদলানো প্রায় অসম্ভব | Key বদলালেই হলো |
| দুর্বলতা আছে কি না | বাইরের কেউ পরীক্ষা করেননি | বহু গবেষক বছরের পর বছর পরীক্ষা করেছেন |
| ফাঁস ধরা পড়লে | সবার জন্য একসাথে বিপদ | একটি key বাতিল করলেই ক্ষতি সীমিত |
এখান থেকে একটি কাজের ফল আসে: key কখনো code-এ লিখে রাখবেন না। Code অনেকে দেখে, repository-তে চিরকাল থাকে। Key থাকবে আলাদা secret manager বা KMS-এ, যেখানে access-এর log থাকে। Cloud-এ এটি কীভাবে হয়, তা Secrets আর KMS পর্বে দেখুন।
Kerckhoffs নকশা লুকাতে নিষেধ করেননি। তিনি বলেছেন, নিরাপত্তা যেন লুকানোর ওপর নির্ভর না করে। Security through obscurity একমাত্র ভিত্তি হলে সেটি ভুল। বাড়তি একটি বাধা হিসেবে লুকানোতে দোষ নেই, যদি বাকি নকশা তার ওপর না দাঁড়ায়।
৬ · Shannon-এর one-time pad — নিখুঁত গোপনীয়তা আর তার দাম
Shannon-এর আগে “নিরাপদ” কথাটির কোনো গাণিতিক মানে ছিল না। তিনি প্রশ্নটি স্পষ্ট করলেন: ciphertext দেখার পর শত্রু কি plaintext সম্পর্কে নতুন কিছু জানল? যদি একটুও না জানে, তাকে বলে perfect secrecy. গণিতের ভাষায়, সব বার্তা m আর ciphertext c-র জন্য:
P(M = m | C = c) = P(M = m)অর্থাৎ ciphertext দেখার আগে যা জানতেন, দেখার পরেও ঠিক তাই জানেন। এই শর্ত পূরণ করে one-time pad. ১৯১০-এর দশকের শেষে Gilbert Vernam আর Joseph Mauborgne-এর কাজ থেকে এটি এসেছে, আর Shannon এর নিখুঁত হওয়া প্রমাণ করেন। এর হাতিয়ার XOR: দুটি bit আলাদা হলে 1, একই হলে 0. একে ⊕ দিয়ে লেখা হয়। মূল গুণ হলো (P ⊕ K) ⊕ K = P.
দুই বন্ধুর কাছে হুবহু একই একটি খাতা, যার প্রতিটি পাতায় মুদ্রা ছুড়ে লেখা এলোমেলো 0 আর 1. বার্তা পাঠানোর সময় একটি পাতা ব্যবহার করে পাতাটি ছিঁড়ে পুড়িয়ে ফেলা হয়। পাতা কখনো ফেরে না। এই খাতাই pad, আর “one-time” কথাটি এখানেই।
নিচে একটি মাত্র অক্ষর H (0x48) bit ধরে ধরে encrypt হচ্ছে। শেষ দুই ধাপ সবচেয়ে গুরুত্বপূর্ণ।
| P (বার্তা) | |
| K (pad) | |
| C (ciphertext) |
- শুরু। বার্তা H, মানে
01001000. Pad-এর পাতা থেকে নেওয়া এলোমেলো key10110010. Key বার্তার সমান লম্বা, ৮ bit. - প্রথম bit. 0 ⊕ 1 = 1, কারণ bit দুটি আলাদা। C-র প্রথম ঘরে বসল 1.
- দ্বিতীয় bit. 1 ⊕ 0 = 1. দ্বিতীয় ঘরেও 1. Key-র bit 1 হলে বার্তার bit উল্টে যায়, 0 হলে থাকে।
- তৃতীয় bit. 0 ⊕ 1 = 1. C এখন
111দিয়ে শুরু। - বাকি পাঁচ bit. 0⊕1=1, 1⊕0=1, 0⊕0=0, 0⊕1=1, 0⊕0=0. পুরো C =
11111010, মানে0xFA. - খোলা। প্রাপক একই key দিয়ে আবার XOR করেন:
11111010 ⊕ 10110010 = 01001000, মানে H. একই key দুবার XOR করলে সেটি কেটে যায়। - নিখুঁত গোপনীয়তার মূল যুক্তি। শত্রুর হাতে
0xFA. অন্য একটি keyK2 = 10100011ধরলে ফল আসে Y. যেকোনো অক্ষরের জন্য এমন একটি key আছে, আর সব key সমান সম্ভাব্য। তাই ciphertext কোনো অক্ষরকেই বাদ দেয় না। অসীম কম্পিউটারও এখানে অসহায়। - Key আবার ব্যবহার করলে। একই K দিয়ে দ্বিতীয় বার্তা I পাঠানো হলো, C2 =
11111011. এখন C1 ⊕ C2 =00000001, যা ঠিক H ⊕ I. Key পুরোপুরি কেটে গেল, দুই বার্তার সম্পর্ক ফাঁস হলো। তাই নাম one-time.
তাহলে সবাই one-time pad ব্যবহার করে না কেন? Shannon নিজেই দেখান, perfect secrecy-র জন্য key-র অনিশ্চয়তা বার্তার অনিশ্চয়তার চেয়ে কম হলে চলে না। চারটি শর্ত একসাথে পূরণ করতে হয়: key সত্যিকারের random, বার্তার সমান লম্বা, গোপনে দুই পক্ষের কাছে পৌঁছানো, আর একবারই ব্যবহার করা। ১ GB ভিডিও পাঠাতে আগে ১ GB key নিরাপদে পৌঁছাতে হবে। তা ছাড়া এটি অখণ্ডতা দেয় না: ciphertext-এর একটি bit উল্টালে plaintext-এর সেই bit-ও উল্টে যায়, প্রাপক টের পান না।
Confusion আর diffusion — ছোট key-তে কাজ চালানোর পথ
একই প্রবন্ধে Shannon বাস্তব cipher-এর জন্য দুটি নকশা-নীতি দেন। আজকের সব block cipher এর ওপর দাঁড়িয়ে।
Confusion
Key আর ciphertext-এর সম্পর্ক এত জটিল করা, যাতে ciphertext দেখে key সম্পর্কে কিছু বোঝা না যায়। ডালে আর ভাতে মিশে গেলে কোন দানা কোথা থেকে এলো, বলা যায় না।
AES-এ S-boxDiffusion
Plaintext-এর একটি bit-এর প্রভাব অনেক ciphertext bit-এ ছড়িয়ে দেওয়া, যাতে ভাষার পরিসংখ্যান গুঁড়িয়ে যায়। এক ফোঁটা রং পুরো বালতির পানিতে মিশে যাওয়ার মতো।
AES-এ ShiftRows, MixColumnsCaesar-এ এই দুটির কোনোটিই নেই। একটি অক্ষর বদলালে ciphertext-এর একটি অক্ষরই বদলায়, তাই আগের চার্টে আকৃতি থেকে গিয়েছিল। ভালো cipher-এ plaintext-এর একটি bit বদলালে ciphertext-এর প্রায় অর্ধেক bit বদলে যায়।
৭ · Randomness — entropy, CSPRNG আর অনুমানযোগ্য key
আধুনিক cryptography একটি অনুমানের ওপর চলে: key শত্রুর কাছে পুরোপুরি অনিশ্চিত। এই অনিশ্চয়তার মাপ হলো entropy, যার একক bit. একটি ন্যায্য মুদ্রার এক টসে ঠিক ১ bit entropy. সমান সম্ভাব্য N-টি বিকল্প থাকলে entropy = log₂ N. বিকল্পগুলো সমান সম্ভাব্য না হলে সাধারণ সূত্র:
H = −Σ pᵢ log₂ pᵢএকটি হিসাব দেখুন। একটি বাঁকা মুদ্রায় ৯০% head পড়ে। তাহলে H = −(0.9 × log₂ 0.9 + 0.1 × log₂ 0.1) = 0.137 + 0.332 ≈ 0.469 bit. মানে ফল অনেকটাই আগে থেকে আন্দাজ করা যায়, তাই অনিশ্চয়তা অর্ধেকেরও কম। Key-র ক্ষেত্রে মূল প্রশ্ন “কত লম্বা?” নয়, “কতটা অনিশ্চিত?”
| গোপন মান (যদি random হয়) | বিকল্প | Entropy |
|---|---|---|
| ৪ অঙ্কের PIN | 104 | ≈ 13.3 bit |
| ৬ অঙ্কের PIN | 106 | ≈ 19.9 bit |
| ৮টি ছোট হাতের ইংরেজি অক্ষর | 268 | ≈ 37.6 bit |
| ১২টি অক্ষর, ৯৪ রকম চিহ্ন থেকে | 9412 | ≈ 78.7 bit |
| CSPRNG থেকে ১৬ বাইট key | 2128 | ১২৮ bit |
টেবিলের হিসাব ধরে নেয় মানটি সত্যিই random. মানুষ নিজে password বাছলে প্রকৃত অনিশ্চয়তা অনেক কম হয়। তাই password সরাসরি key হিসেবে ব্যবহার করা যায় না, এর জন্য ধীর হিসাব লাগে, যা পর্ব ১৩-তে দেখবেন।
PRNG আর CSPRNG
কম্পিউটার নিয়ম মেনে চলে, তাই নিজে থেকে এলোমেলো হতে পারে না। PRNG (pseudo-random number generator) একটি শুরুর মান থেকে গণিতের সূত্রে লম্বা সংখ্যার সারি বানায়। এই শুরুর মানকে বলে seed. একই seed দিলে একই সারি আসে। Simulation বা খেলায় এটি সুবিধা, কিন্তু key-র জন্য সর্বনাশ।
| সাধারণ PRNG | CSPRNG | |
|---|---|---|
| লক্ষ্য | পরিসংখ্যানে ভালো দেখানো, দ্রুত চলা | আগের output দেখেও পরেরটি অনুমান করা যাবে না |
| Seed | প্রায়ই সময় বা ছোট সংখ্যা | OS-এর জমানো entropy থেকে |
| Output দেখলে | ভেতরের অবস্থা বের করা যেতে পারে | তা করা গণনার দিক থেকে অসম্ভব বলে ধরা হয় |
| উদাহরণ | Python random, JS Math.random() | Python secrets, JS crypto.getRandomValues(), os.urandom |
| ব্যবহার | Simulation, খেলা, নমুনা বাছাই | Key, token, password reset link, session id |
Python-এর নিজের documentation সরাসরি বলে, random নিরাপত্তার কাজে ব্যবহার করা যাবে না। এর Mersenne Twister generator-এর period বিশাল, 219937 − 1, তবু এটি সম্পূর্ণ নির্ধারিত। লম্বা period মানে নিরাপত্তা নয়। নিচের কোড পার্থক্যটি দেখায়।
# Seeded PRNG versus the OS CSPRNG. Demo values only, no real key is used.
import math
import random
import secrets
def weak_key(seed):
"""WRONG for real keys: the output depends only on the seed."""
r = random.Random(seed)
return r.getrandbits(128).to_bytes(16, "big").hex()
print("seed 2026:", weak_key(2026))
print("seed 2026:", weak_key(2026), "<- same seed, same key")
print("seed 2027:", weak_key(2027))
# Every key is 128 bits long, but how many different keys can appear?
seeds = range(1000)
keys = {weak_key(s) for s in seeds}
print("seeds:", len(seeds), " different keys:", len(keys))
print("looks like 128 bits, real choice = %.2f bits" % math.log2(len(keys)))
# Right tool: secrets reads the operating system CSPRNG. There is no seed.
a = secrets.token_hex(16)
b = secrets.token_hex(16)
print("secrets key length in bits:", len(a) * 4)
print("two secrets keys equal?", a == b)প্রথম দুই লাইনে হুবহু একই মান: f38b2ffc80a4df5a51c9bc701e7ea419. আপনি যতবার চালান, যে যন্ত্রেই চালান, seed 2026 থেকে এটিই আসবে। এরপর seeds: 1000 different keys: 1000 লাইনটি মূল শিক্ষা। প্রতিটি key দেখতে ১২৮ bit, কিন্তু বিকল্প আছে মাত্র ১০০০টি, তাই real choice = 9.97 bits. শেষ দুই লাইনে secrets-এর দুটি key মেলেনি (False), আর কোনো seed-ও দিতে হয়নি। ওই মানগুলো ছাপানো হয়নি, কারণ প্রতিবার সেগুলো আলাদা আসে।
Key-র entropy কখনো seed-এর চেয়ে বেশি হয় না
A generator can stretch randomness, not create it
কী ভুল হতে পারে: ১৯৯৫ সালে গবেষকেরা দেখান, Netscape browser-এর SSL সময় আর process id দিয়ে seed বানাত। ২০০৮ সালে Debian জানায়, তাদের OpenSSL package-এর একটি পরিবর্তনে (CVE-2008-0166) random সংখ্যা অনুমানযোগ্য হয়ে গেছে। দুই ক্ষেত্রেই algorithm ঠিক ছিল, ভেঙেছিল entropy.
প্রতিরোধ: key আর token সবসময় OS-এর CSPRNG থেকে নিন। Detection: code review আর SAST-এ Math.random বা random. নিরাপত্তার কাজে আছে কি না খুঁজুন। সাড়া: উৎস দুর্বল প্রমাণিত হলে শুধু patch যথেষ্ট নয়, ওই সময়ে তৈরি সব key বাতিল করে নতুন করতে হয়। Debian-এর পরামর্শও তাই ছিল। এজন্য কোন key কখন তৈরি হয়েছে, তার তালিকা রাখা জরুরি।
নিজের যন্ত্রে key বা token বানাতে এই দুটি কমান্ডই যথেষ্ট। দুটিই OS-এর CSPRNG ব্যবহার করে।
# 32 random bytes as hex (256 bits). Store the result in a secret manager.
openssl rand -hex 32
python3 -c "import secrets; print(secrets.token_hex(32))"৮ · Key space আর brute force — ৫৬, ১২৮ আর ২৫৬ bit-এর হিসাব
n bit লম্বা key-র মোট সম্ভাব্য মান 2nটি। এই সেটের নাম key space. Brute force মানে একে একে সব key চেষ্টা করা। ভালো cipher-এ এর চেয়ে দ্রুত পথ জানা না থাকাই লক্ষ্য। হিসাবটি চার লাইনের। নিচের গতি উদাহরণের জন্য ধরে নেওয়া, কোনো বাস্তব যন্ত্রের মাপ নয়।
1n = key bits2keys = 2 ^ n3rate = 10 ^ 9 per sec4secs = keys / rate5years = secs / 315576006avg = years / 2
| n | |
| keys | |
| rate | |
| secs | |
| years | |
| avg |
- Key-র দৈর্ঘ্য। শুরু করি পুরোনো DES-এর n = 56 দিয়ে।
- মোট key. 256 ≈ 7.21 × 1016টি।
- গতি ধরে নেওয়া। ধরা হলো সেকেন্ডে 109টি, অর্থাৎ ১০০ কোটি চেষ্টা। এটি একটি অনুমান, বাস্তবে cipher আর যন্ত্রভেদে বদলায়।
- মোট সেকেন্ড। 7.21 × 1016 ÷ 109 = 7.21 × 107 সেকেন্ড।
- বছরে রূপান্তর। এক বছরে 31,557,600 সেকেন্ড ধরলে ফল 2.28 বছর. এটি সবচেয়ে খারাপ অবস্থা: শেষ key-টিই সঠিক।
- গড় সময়। গড়ে অর্ধেক key চেষ্টা করলেই মেলে, তাই 1.14 বছর.
- এক bit বাড়ালে। n = 57 করলে key দ্বিগুণ, সময়ও দ্বিগুণ: 4.57 বছর, গড় 2.28 বছর। Key-র প্রতিটি bit কাজ দ্বিগুণ করে।
- ১২৮ bit. Key বেড়েছে 272 ≈ 4.72 × 1021 গুণ। সময় 1.08 × 1022 বছর. মহাবিশ্বের বয়স প্রায় 1.38 × 1010 বছর, অর্থাৎ এটি তার প্রায় ৭৮ হাজার কোটি গুণ।
এবার তিনটি কল্পিত গতিতে পুরো টেবিলটি বানাই। সবচেয়ে দ্রুত গতিটি ইচ্ছে করেই অতিরঞ্জিত, যাতে হিসাব হামলাকারীর পক্ষে থাকে।
// Key-space table. Guess rates are ASSUMED, not measured on any real system.
const YEAR = 365.25 * 24 * 3600;
const rates = [1e9, 1e12, 1e18];
function human(sec) {
if (sec < 1) return 'under 1 sec';
if (sec < 3600) return sec.toFixed(0) + ' sec';
if (sec < 172800) return (sec / 3600).toFixed(1) + ' hours';
if (sec < YEAR) return (sec / 86400).toFixed(1) + ' days';
const y = sec / YEAR;
return (y < 1e4 ? y.toFixed(1) : y.toExponential(1)) + ' years';
}
const row = cols => console.log(
cols[0].padEnd(5) + cols[1].padEnd(9) +
cols.slice(2).map(c => c.padStart(15)).join(''));
row(['bits', 'keys', '1e9 per sec', '1e12 per sec', '1e18 per sec']);
for (const bits of [40, 56, 80, 112, 128, 256]) {
const keys = 2 ** bits;
row([String(bits), keys.toExponential(1),
...rates.map(r => human(keys / r))]);
}
// The table shows the worst case. On average half the keys are enough.
const avg56 = 2 ** 56 / 2 / 1e9;
console.log('56-bit average at 1e9 per sec: ' + human(avg56));
console.log('128-bit keys / 56-bit keys: ' + (2 ** 72).toExponential(2));
// How many bits survive one million years at the fastest assumed rate?
const tries = 1e18 * YEAR * 1e6;
console.log('Bits for 1e6 years at 1e18 per sec: ' +
Math.ceil(Math.log2(tries)));৫৬ bit-এর সারিতে 2.3 years, 20.0 hours আর under 1 sec. অর্থাৎ যন্ত্র বাড়লে ৫৬ bit টেকে না। ১২৮ bit-এর সারিতে সবচেয়ে অতিরঞ্জিত গতিতেও 1.1e+13 years. ২৫৬ bit-এ 3.7e+51 years. শেষ লাইন Bits for 1e6 years at 1e18 per sec: 105 বলছে, এই কল্পিত শক্তির বিরুদ্ধে দশ লাখ বছর টিকতে ১০৫ bit-ই যথেষ্ট। তাই ১২৮ bit-এ যথেষ্ট বাড়তি জায়গা আছে।
এই হিসাব নিজের নকশা যাচাইয়ের জন্য। অন্যের system-এ key বা password অনুমান করার চেষ্টা অনুমতি ছাড়া অপরাধ, উদ্দেশ্য যা-ই হোক। সীমারেখাটি পর্ব ০৬-এ দেখেছেন।
এই হিসাব শুধু তত্ত্ব নয়। ১৯৭৭ সালে DES মান হিসেবে আসে। ১৯৯৮ সালে Electronic Frontier Foundation আড়াই লাখ ডলারের কম খরচে “Deep Crack” যন্ত্র বানায়, যা RSA-র একটি প্রকাশ্য চ্যালেঞ্জের key প্রায় ৫৬ ঘণ্টায় বের করে। ১৯৯৯ সালের জানুয়ারিতে distributed.net-এর সাথে মিলে সময় নামে প্রায় ২২ ঘণ্টায়। এর আগেই NIST নতুন মানের প্রতিযোগিতা শুরু করেছিল, যা থেকে ২০০১ সালে AES আসে (FIPS 197).
Security level — bit-এ নিরাপত্তা মাপা
একটি ব্যবস্থার security level n bit মানে, জানা সেরা পথে ভাঙতে মোটামুটি 2nটি operation লাগে। এই মাপ key-র দৈর্ঘ্য নয়। ভালো symmetric cipher-এ দুটি প্রায় সমান, কিন্তু অন্যখানে নয়। RSA-র ক্ষেত্রে গণিতের শর্টকাট আছে, তাই লম্বা key লাগে। Hash-এ collision খোঁজা ফলাফলের দৈর্ঘ্যের অর্ধেক bit-এর কাজ।
| Security level | Symmetric | RSA | Elliptic curve | Hash (collision) |
|---|---|---|---|---|
| ১১২ bit | — | 2048 | 224 | SHA-224 |
| ১২৮ bit | AES-128 | 3072 | 256 | SHA-256 |
| ১৯২ bit | AES-192 | 7680 | 384 | SHA-384 |
| ২৫৬ bit | AES-256 | 15360 | 512 | SHA-512 |
এই তুলনা NIST SP 800-57 Part 1 অনুসরণ করে, যার নতুন সংশোধনের খসড়া ২০২৫ সালে এসেছে, তাই সিদ্ধান্তের আগে সর্বশেষ সংস্করণ দেখুন। একটি ব্যবস্থার মোট শক্তি তার দুর্বলতম অংশের সমান। AES-256 দিয়ে ডেটা রেখে সেই key RSA-2048 দিয়ে মুড়ে দিলে ব্যবস্থাটি মোটামুটি ১১২ bit-এর। আর key যদি ছয় অঙ্কের PIN থেকে আসে, তাহলে প্রায় ২০ bit.
Computational আর information-theoretic নিরাপত্তা
| Information-theoretic | Computational | |
|---|---|---|
| দাবি | অসীম কম্পিউটার শক্তিতেও ভাঙে না | ভাঙা সম্ভব, কিন্তু বাস্তব সময়ে অসম্ভব |
| ভিত্তি | গাণিতিক প্রমাণ | কঠিন সমস্যার অনুমান আর দীর্ঘ পরীক্ষা |
| উদাহরণ | One-time pad, Shamir secret sharing | AES, RSA, SHA-256 |
| দাম | Key বিশাল, ব্যবহার কঠিন | ছোট key, কিন্তু সময়ের সাথে ক্ষয় হয় |
আধুনিক প্রায় সব cryptography computational. “নিরাপদ” কথাটির মানে এখানে একটি সময়-সীমা। ডেটা কত বছর গোপন রাখতে হবে, সেটি হিসাবে আনতে হয়। আজ রেকর্ড করা ciphertext কুড়ি বছর পরের কম্পিউটারের সামনেও থাকবে, যা পর্ব ১৪-এ post-quantum আলোচনায় আবার আসবে।
আরও গভীরে: আধুনিক cryptography “ভাঙা গেল না” বলে থামে না, আক্রমণের একটি গাণিতিক খেলা সংজ্ঞায়িত করে, যার সূচনা Goldwasser ও Micali-র ১৯৮৪ সালের কাজে। IND-CPA-তে হামলাকারী নিজের পছন্দের বার্তার ciphertext পায়, তারপর দুটি বার্তার একটির ciphertext দেখে বলতে হয় কোনটি; অনুমানের চেয়ে সামান্যও ভালো করতে পারলে cipher হেরে যায়। IND-CCA-তে সে decrypt করার সুযোগও পায়। একই বার্তা একই ciphertext দিলে IND-CPA ভাঙে, তাই নিরাপদ encryption-এ nonce বা random মান লাগে, যা পর্ব ০৮-এ দেখবেন।
পরীক্ষা ও ইন্টারভিউতে:
- Kerckhoffs-এর নীতি কী? Key ছাড়া সবকিছু প্রকাশ হলেও ব্যবস্থা নিরাপদ থাকবে।
- MAC আর signature-এর পার্থক্য? MAC-এ ভাগ করা key, তাই non-repudiation নেই। Signature-এ private key একজনের কাছে।
- One-time pad-এর শর্ত? সত্যিকারের random, বার্তার সমান লম্বা, গোপন, একবার ব্যবহার।
- ৪০ bit থেকে ৫০ bit হলে কাজ কত বাড়ে? 210 = ১০২৪ গুণ।
Math.random()দিয়ে token বানানো যাবে? না, এটি CSPRNG নয়।crypto.getRandomValues()বা সমতুল্য ব্যবহার করতে হয়।
৯ · AI-এর যুগে cryptography
Cryptography-র ভুল চোখে পড়ে না। ভুল কোডও সুন্দর চলে, encrypt করে, decrypt করে, পরীক্ষায় পাশ করে। AI-এর দেওয়া কোডে তাই এই ভুলগুলো সহজে লুকিয়ে থাকে। AI প্রায়ই পুরোনো tutorial থেকে শেখা অভ্যাস ফিরিয়ে দেয়, আর আত্মবিশ্বাসের সাথেই দেয়।
| AI-এর ভুল | কেন বিপজ্জনক | যাচাই |
|---|---|---|
random বা Math.random() দিয়ে token | পরের মান অনুমান করা যেতে পারে | Token-এর উৎস CSPRNG কি না দেখুন |
| Base64-কে “encryption” বলা | কোনো key নেই, যে কেউ খুলতে পারে | Key কোথায়, সেই প্রশ্ন করুন |
| MD5, SHA-1, ECB mode, salt ছাড়া hash | পুরোনো পরামর্শ, পরিচিতভাবে দুর্বল | NIST বা OWASP-এর বর্তমান নির্দেশনা পড়ুন |
| নিজে বানানো “কাস্টম” cipher | Kerckhoffs ভঙ্গ, কেউ পরীক্ষা করেননি | পরীক্ষিত library ব্যবহার করুন |
| Key সরাসরি কোডে লেখা | Repository-তে ফাঁস হয় | Secret manager, আর secret scanning |
verify=False দিয়ে error “ঠিক” করা | Certificate যাচাই বন্ধ হয়, পরিচয়ের নিশ্চয়তা হারায় | মূল কারণ ঠিক করুন, যাচাই বন্ধ নয় |
| বানানো standard বা CVE নম্বর | ভুল ভিত্তিতে সিদ্ধান্ত | মূল উৎসে খুঁজে দেখুন |
AI-কে কোড লিখতে বলার চেয়ে পর্যালোচনা করতে বলা বেশি কাজের। নিচের prompt-এ আপনার কোড বসান, তবে আসল key, token বা গ্রাহকের তথ্য সরিয়ে নিন।
AI-এর crypto কোড হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১DES-এর key মাত্র ৫৬ bit কেন ছিল, আর Deep Crack থেকে রক্ষকদের আসল শিক্ষা কী?
DES এসেছিল IBM-এর কাজ থেকে, আর ১৯৭৭ সালে এটি যুক্তরাষ্ট্রের ফেডারেল মান হয়। প্রকাশের সময়ই key-র দৈর্ঘ্য নিয়ে বিতর্ক ছিল। Whitfield Diffie আর Martin Hellman ১৯৭৭ সালে হিসাব করে দেখান, প্রায় দুই কোটি ডলারের একটি বিশেষ যন্ত্রে একদিনে একটি key খুঁজে পাওয়া যেতে পারে। অর্থাৎ শুরু থেকেই বড় প্রতিষ্ঠানের নাগালে থাকার সন্দেহ ছিল। NSA-র ভূমিকা নিয়ে তখন থেকেই প্রশ্ন ছিল, যদিও পূর্ণ চিত্র জনসমক্ষে স্পষ্ট নয়।
তারপরও মানটি দুই দশক চলেছে। কারণ প্রতিষ্ঠানগুলো “এখনো তো কেউ ভাঙেনি” ভেবে নিশ্চিন্ত ছিল। ১৯৯৮ সালে EFF আড়াই লাখ ডলারের কম খরচে যন্ত্র বানিয়ে প্রায় ৫৬ ঘণ্টায় একটি চ্যালেঞ্জের key বের করে। এর লক্ষ্য ছিল প্রকাশ্যে দেখানো যে ঝুঁকিটি কাল্পনিক নয়। বিশেষ করে এটি কোনো গাণিতিক আবিষ্কার ছিল না। শুধু সরল brute force, যা ২০ বছর আগেই হিসাব করা ছিল।
রক্ষকের জন্য শিক্ষা তিনটি। প্রথমত, নিরাপত্তার সীমা হিসাব করা যায়, আর সেই হিসাব উপেক্ষা করলে একদিন সত্য হয়। দ্বিতীয়ত, হার্ডওয়্যারের খরচ কমতে থাকে, তাই আজকের “যথেষ্ট” দশ বছর পরে যথেষ্ট না-ও হতে পারে। তৃতীয়ত, একটি algorithm সরাতে দীর্ঘ সময় লাগে। DES-এর জায়গায় মাঝখানে Triple DES এসেছিল, আর AES-এ পুরোপুরি সরতে বহু বছর গেছে। ব্যাংকের যন্ত্র, পুরোনো কার্ড, embedded device সহজে বদলায় না।
এখান থেকে এসেছে crypto agility-র ধারণা: নকশাতেই এমন ব্যবস্থা রাখা, যাতে algorithm বদলাতে পুরো system নতুন করে বানাতে না হয়। আজ কোন system-এ কোন algorithm চলছে, তার একটি তালিকা রাখাই প্রথম ধাপ।
মূল উপলব্ধি: ভাঙা প্রমাণিত হওয়ার অপেক্ষা করবেন না। হিসাব যখন বলে ঝুঁকি কাছে আসছে, তখনই সরার পরিকল্পনা শুরু করুন।
প্র ০২One-time pad গণিতে নিখুঁত। তবে “one-time pad-ভিত্তিক অভেদ্য” পণ্য দেখলে সন্দেহ করতে হয় কেন?
Perfect secrecy-র প্রমাণটি খাঁটি, কিন্তু তা শর্তসাপেক্ষ। Key সত্যিকারের random, বার্তার সমান লম্বা, আগেই গোপনে ভাগ করা, আর কখনো পুনরায় ব্যবহার না করা। Shannon দেখিয়েছেন, এই খরচ এড়ানো যায় না। Perfect secrecy চাইলে key-র অনিশ্চয়তা বার্তার অনিশ্চয়তার চেয়ে কম হতে পারে না।
এখন পণ্যটি ভাবুন। এটি একটি ছোট password বা ১২৮ bit key থেকে “pad” বানিয়ে বিশাল ফাইল encrypt করে। তাহলে এটি আসলে একটি stream cipher, যার শক্তি ওই ছোট key-র সমান। One-time pad-এর গণিত এখানে আর খাটে না। “অভেদ্য” কথাটি তখন বিজ্ঞাপন। Cryptography-র জগতে এমন দাবিকে snake oil বলা হয়।
ইতিহাসে আসল one-time pad-ও ব্যবহারের ভুলে পড়েছে। দ্বিতীয় বিশ্বযুদ্ধের সময় সোভিয়েত ইউনিয়নের কিছু pad-এর পাতা একাধিকবার ব্যবহৃত হয়েছিল। যুক্তরাষ্ট্রের Venona প্রকল্প এই ভুল কাজে লাগিয়ে বহু বার্তার অংশ পড়তে পেরেছিল বলে প্রকাশিত নথিতে জানা যায়। আমাদের stepper-এ যে C1 ⊕ C2 = P1 ⊕ P2 দেখেছেন, এর পেছনে সেই ধারণাই। আবার ঠান্ডা যুদ্ধের সময় মস্কো-ওয়াশিংটন হটলাইনে one-time tape ব্যবহারের কথা জানা যায়, কারণ সেখানে মাত্র দুটি পক্ষ, আর কূটনৈতিক পথে key পাঠানো সম্ভব ছিল। অর্থাৎ এটি কাজ করে খুব ছোট, সুশৃঙ্খল ব্যবস্থায়।
আরেকটি সীমা হলো অখণ্ডতা। One-time pad-এ শত্রু key না জেনেও bit উল্টাতে পারে। লেনদেনের বার্তায় plaintext-এর আকার জানা থাকলে অঙ্ক বদলে দেওয়ার ঝুঁকি তৈরি হয়, আর প্রাপক কিছু টের পান না। এজন্য আধুনিক ব্যবস্থায় AEAD লাগে, যা বদল ধরে।
মূল উপলব্ধি: “গণিতে প্রমাণিত” দাবি শুনলে জিজ্ঞেস করুন, প্রমাণটি কোন শর্তে, আর এই পণ্য সেই শর্তগুলো মানছে কি না। শর্ত ভাঙলে প্রমাণ অর্থহীন।
প্র ০৩Debian-এর ২০০৮ সালের ঘটনায় algorithm ঠিক থেকেও চাবি দুর্বল হলো কেন? এমন ঘটনায় রক্ষকেরা কী করবেন?
২০০৬ সালের দিকে Debian-এর OpenSSL package-এ একটি পরিবর্তন আসে। উদ্দেশ্য ছিল একটি memory-পরীক্ষার টুলের সতর্কবার্তা দূর করা। কিন্তু সরানো কোডের মধ্যে ছিল এমন একটি অংশ, যা random generator-এ entropy যোগ করত। প্রকাশিত বিশ্লেষণ অনুযায়ী এরপর seed-এর প্রধান উৎস হয়ে দাঁড়ায় process id, যার মান সর্বোচ্চ ৩২,৭৬৮ পর্যন্ত। ফলে key দেখতে ২০৪৮ bit হলেও একটি নির্দিষ্ট ধরনের key-র সম্ভাব্য সংখ্যা ছিল খুবই কম।
গুরুত্বপূর্ণ ব্যাপার হলো কিছুই “ভেঙে” পড়েনি। Key তৈরি হতো, encryption চলত, পরীক্ষা পাশ করত। প্রায় দুই বছর ধরে ত্রুটিটি ধরা পড়েনি। ২০০৮ সালের মে মাসে Debian নিরাপত্তা-বিজ্ঞপ্তি DSA-1571 প্রকাশ করে, আর CVE-2008-0166 নম্বর দেওয়া হয়। আমাদের Python কোডে যে real choice = 9.97 bits দেখেছেন, বিষয়টি ঠিক সেরকম: চেহারা লম্বা, ভেতরে অল্প।
একই ধরনের শিক্ষা আগেও এসেছিল। ১৯৯৫ সালে গবেষকেরা Netscape-এর SSL-এ দেখান, seed আসছে সময় আর process id থেকে, যা অনুমান করা যায়। এই ধরনের ভুল বারবার ফেরে, কারণ randomness-এর ত্রুটি পরীক্ষায় ধরা পড়ে না। একটি random-দেখতে সংখ্যা পরীক্ষা পাশ করে যায়।
রক্ষকের কাজ কয়েকটি ধাপের। প্রথমে patch. তারপর সবচেয়ে কঠিন অংশ: ওই সময়ে তৈরি সব key খুঁজে বাতিল করা, নতুন করে বানানো, certificate আবার নেওয়া। Advisory-তেও বলা হয়েছিল, প্রভাবিত key পুনরায় তৈরি করতে হবে। এখানেই key-র তালিকা কাজে আসে। কোন key, কোন যন্ত্রে, কবে তৈরি হলো, তা জানা না থাকলে পুরো কাজ অন্ধকারে চলে। আর ধরে নিতে হয়, দুর্বল key হয়তো আগেই কেউ বের করে ফেলেছে, তাই ওই key দিয়ে রেকর্ড করা পুরোনো ট্রাফিকও ঝুঁকিতে থাকতে পারে।
মূল উপলব্ধি: নিরাপত্তা-সংবেদনশীল কোডে “সতর্কবার্তা দূর করা”-র মতো ছোট পরিবর্তনেও বিশেষজ্ঞের review লাগে। আর patch-এর পরেও key থেকে যায়, তাই key বদলানোর ক্ষমতা আগেই তৈরি রাখুন।
প্র ০৪গোপন, মালিকানাধীন cipher-এর ইতিহাস কী বলে? কোথাও কি গোপন রাখা যুক্তিসঙ্গত?
Kerckhoffs-এর পরামর্শ উপেক্ষা করার ফল একাধিকবার দেখা গেছে। DVD-র CSS ব্যবস্থা গোপন ছিল, ১৯৯৯ সালে সেটি বিশ্লেষণ হয়ে প্রকাশ্যে আসে আর দুর্বল প্রমাণিত হয়। মোবাইল ফোনের GSM নেটওয়ার্কের A5 পরিবারের cipher-ও গোপন রাখা হয়েছিল, কিন্তু পরে সেগুলো বিশ্লেষণে দুর্বলতা বের হয়। MIFARE Classic নামের contactless কার্ডের Crypto-1 cipher ২০০৮ সালের দিকে গবেষকেরা বিশ্লেষণ করে দুর্বল দেখান, অথচ ততদিনে পরিবহন আর ভবনের কার্ডে এটি ছড়িয়ে গিয়েছিল।
২০২৩ সালে TETRA রেডিও মানের গোপন cipher-গুলো নিয়ে গবেষকেরা ফলাফল প্রকাশ করেন। জরুরি সেবা আর শিল্প-যোগাযোগে ব্যবহৃত এই ব্যবস্থার TEA1 cipher-এ ৮০ bit key ভেতরে ৩২ bit-এ সংকুচিত হয় (CVE-2022-24402). ৩২ bit মানে মাত্র প্রায় ৪৩০ কোটি বিকল্প, সেকেন্ডে ১০০ কোটি গতিতে কয়েক সেকেন্ডের কাজ। গবেষকেরা একে backdoor বলেছেন। মান-সংস্থার ব্যাখ্যা আলাদা হতে পারে, কারণ রপ্তানি নিয়ন্ত্রণের কথাও এসেছে। তবে মূল বিষয়: গোপনীয়তার কারণে দশকের পর দশক ব্যবহারকারীরা নিজেরা এটি যাচাই করতে পারেননি।
উল্টো উদাহরণ AES. ১৯৯৭ সালে NIST প্রকাশ্য প্রতিযোগিতা ঘোষণা করে। পৃথিবীর নানা দেশের দল প্রস্তাব দেয়, একে অপরেরটি ভাঙার চেষ্টা করে। বিজয়ী এসেছে বেলজিয়াম থেকে, যদিও প্রতিযোগিতা ছিল যুক্তরাষ্ট্রের। এই প্রকাশ্য লড়াই-ই আস্থার উৎস। পর্ব ০৩-এর open design নীতির সেরা উদাহরণ এটি।
তাহলে কি কিছুই গোপন রাখা চলে না? চলে, যদি নির্ভরতা না থাকে। ভেতরের network-এর মানচিত্র, detection rule-এর বিস্তারিত, honeypot-এর অবস্থান প্রকাশ না করা যুক্তিসঙ্গত। এগুলো হামলাকারীর খরচ বাড়ায়। পার্থক্য হলো, ফাঁস হলেও ব্যবস্থা ভেঙে পড়ে না, শুধু একটি বাড়তি বাধা কমে। সামরিক সংস্থাগুলো নিজেদের algorithm গোপন রাখে এমন উদাহরণও আছে, কিন্তু তাদের ভেতরে বিশেষজ্ঞের দল পরীক্ষা করে, যা সাধারণ প্রতিষ্ঠানের নেই।
মূল উপলব্ধি: প্রশ্ন “গোপন কি না” নয়। প্রশ্ন হলো “এটি ফাঁস হলে কী ভাঙে?” উত্তর “সব” হলে নকশা ভুল।
প্র ০৫১২৮ bit যদি এত শক্ত, তাহলে ২৫৬ bit কেন? আর পদার্থবিজ্ঞান কি brute force-এর সীমা টানে?
শক্তির হিসাব দিয়ে শুরু করি। Landauer-এর নীতি অনুযায়ী এক bit তথ্য মুছতে অন্তত kT ln 2 শক্তি লাগে। ৩০০ কেলভিনে এটি প্রায় 2.87 × 10−21 জুল। ধরা যাক প্রতিটি key চেষ্টায় মাত্র এক bit-ই মোছা হয়, যা অসম্ভব রকম উদার অনুমান। তাহলে 2256 বার করতে লাগে প্রায় 3.3 × 1056 জুল। সূর্য এক বছরে দেয় প্রায় 1.2 × 1034 জুল। অর্থাৎ সূর্যের প্রায় 2.8 × 1022 বছরের পুরো শক্তি লাগত। এটি মোটা হিসাব, তাত্ত্বিক reversible computing-এর প্রশ্নও আছে, তবে ছবিটি পরিষ্কার: ২৫৬ bit brute force-এর সমস্যা নয়, পদার্থবিজ্ঞানের সমস্যা। 2128-এর ক্ষেত্রে একই আদর্শ সীমা প্রায় 9.8 × 1017 জুল, তাই শুধু শক্তির সীমা ১২৮ bit-কে প্রমাণ করে না। ১২৮ bit-এর নিরাপত্তা আসে সময়, হার্ডওয়্যার আর খরচের যোগফল থেকে।
তাহলে ২৫৬ bit কেন? কারণগুলো brute force ছাড়া অন্য জায়গায়। প্রথমত, দীর্ঘ মেয়াদ। কয়েক দশক গোপন রাখার ডেটায় বাড়তি জায়গা রাখা হয়। দ্বিতীয়ত, Grover-এর quantum algorithm তাত্ত্বিকভাবে খোঁজার কাজের exponent অর্ধেক করতে পারে, যদিও বাস্তবে তা অনেক কঠিন আর সমান্তরালে কম কার্যকর। তৃতীয়ত, একসাথে অনেক key-র ওপর আক্রমণ। হামলাকারীর লক্ষ্য যদি কোটি কোটি key-র যেকোনো একটি হয়, তাহলে কাজ কিছুটা কমে যায়। চতুর্থত, নিয়ম-কানুনের শর্ত। কিছু ক্ষেত্রে ২৫৬ bit বাধ্যতামূলক থাকতে পারে।
খরচের দিক থেকে AES-256-এ round ১৪টি, AES-128-এ ১০টি, তাই গতি কিছুটা কম, যদিও আধুনিক হার্ডওয়্যারে পার্থক্য সাধারণত সামান্য। একটি বাড়তি তথ্য: AES-256-এর key schedule নিয়ে related-key ধরনের তাত্ত্বিক ফলাফলও প্রকাশিত হয়েছে, যা বাস্তব ব্যবহারে সাধারণত প্রযোজ্য নয়। অর্থাৎ “দৈর্ঘ্য দ্বিগুণ” মানেই সবদিক থেকে দ্বিগুণ ভালো নয়।
রক্ষকের আসল সিদ্ধান্ত অন্য জায়গায়। ১২৮ বনাম ২৫৬ নিয়ে তর্ক করার আগে দেখুন key কোথা থেকে এলো, কোথায় থাকে, কে ছোঁয় আর ঘোরানো হয় কি না। দুর্বলতম অংশই ব্যবস্থার শক্তি।
মূল উপলব্ধি: ১২৮ আর ২৫৬ দুটিই brute force-এর নাগালের বাইরে। বাছাই নির্ভর করে ডেটার আয়ু, নিয়ম আর ভবিষ্যৎ ঝুঁকির ওপর, সংখ্যার মোহের ওপর নয়।
অনুশীলন
কাগজ-কলম নিয়ে বসুন। প্রথমে নিজে করুন, তারপর উত্তর মেলান।
-
হিসাব করুন: একটি পুরোনো ব্যবস্থায় ৬৪ bit key. ধরে নিন হামলাকারীর গতি সেকেন্ডে 1011 চেষ্টা। (ক) সব key চেষ্টা করতে কত বছর? (খ) গড়ে কত বছর? (গ) সময় ১০০০ গুণের বেশি করতে কত bit বাড়াতে হবে?
(ক) 264 ≈ 1.845 × 1019. ভাগ 1011 করলে 1.845 × 108 সেকেন্ড। ভাগ 31,557,600 করলে প্রায় 5.85 বছর.
(খ) গড়ে অর্ধেক, প্রায় 2.92 বছর.
(গ) 210 = 1024, যা ১০০০-এর বেশি। তাই ১০ bit বাড়ালেই হয়, মানে ৭৪ bit.
-
Output অনুমান করুন: না চালিয়ে বলুন নিচের কোড কী ছাপবে, আর এখান থেকে key পুনর্ব্যবহারের কোন বিপদ বোঝা যায়। (
0x4Fমানে O,0x4Bমানে K.)p1, p2, k = 0x4F, 0x4B, 0x9C c1 = p1 ^ k c2 = p2 ^ k print(hex(c1), hex(c2), hex(c1 ^ c2), hex(p1 ^ p2))Output:
0xd3 0xd7 0x4 0x4শেষ দুটি মান সমান। c1 ⊕ c2 হিসাবে k দুবার XOR হয়ে কেটে গেছে, তাই ফল p1 ⊕ p2. অর্থাৎ key না জেনেই শত্রু দুই বার্তার সম্পর্ক পেয়ে যায়। এজন্য key বা stream cipher-এর nonce দ্বিতীয়বার ব্যবহার করা যায় না।
-
নকশা সমালোচনা করুন: একটি কাল্পনিক startup বলছে, “আমাদের নিজস্ব গোপন algorithm আছে, তাই আমরা নিরাপদ।” Password reset link-এর token তারা নিচের মতো বানায়। অন্তত তিনটি সমস্যা ধরুন, আর সমাধান বলুন।
// Unsafe pattern. Do not copy. const token = Date.now().toString(36) + Math.random().toString(36).slice(2);- গোপন algorithm: Kerckhoffs-এর নীতি ভঙ্গ। কেউ পরীক্ষা করেননি, আর ফাঁস হলে পুরো ব্যবস্থা ভাঙে। সমাধান: প্রকাশ্য, পরীক্ষিত algorithm আর library.
Date.now(): সময় অনুমান করা যায়, তাই এতে প্রায় কোনো entropy নেই।Math.random(): CSPRNG নয়, পরের মান অনুমান করা যেতে পারে। সমাধান: server-side Node.js হলেcrypto.randomBytes(32), browser হলেcrypto.getRandomValues().- নকশার ফাঁক: token-এর মেয়াদ, একবার ব্যবহার, server-এ token-এর hash রাখা আর চেষ্টার সীমা, এগুলোও দরকার। Detection-এর জন্য reset চেষ্টার log রাখতে হবে।
-
নিজের কোডে audit করুন: নিজের প্রজেক্টে (অন্যের নয়) নিচের কমান্ড চালান। প্রতিটি ফলাফল দেখে ঠিক করুন, এটি নিরাপত্তার কাজে ব্যবহার হচ্ছে কি না। আর দুটি প্রশ্নের উত্তর দিন: কোন লক্ষ্যের জন্য কোন হাতিয়ার ব্যবহার হয়েছে, আর key কোথায় থাকে?
# Run only inside your own project folder. grep -rnE "Math\.random|random\.(random|randint|choice)" src/সব ফলাফল সমস্যা নয়। Animation-এর রং বা খেলার পাশা এলোমেলো করতে
Math.random()ঠিক আছে। সমস্যা হলো token, session id, password reset, OTP, key, salt বা nonce-এর কাজে এটি থাকলে। এমন জায়গা পেলে CSPRNG-তে বদলান, আর ওই পথে আগে তৈরি হওয়া token বাতিল করুন। এই পরীক্ষাকে CI-তে একটি SAST rule হিসেবে রাখলে নতুন ভুল ঢোকা কমে।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমBrute force-এর সময় হিসাব করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- Key-র দৈর্ঘ্য n bit জানা
- মোট key বের করা: 2n
- ধরে নেওয়া গতি দিয়ে ভাগ করে সেকেন্ড বের করা
- 31,557,600 দিয়ে ভাগ করে বছরে রূপান্তর
- গড়ের জন্য ফলকে ২ দিয়ে ভাগ করা
- ডেটা কত বছর গোপন রাখতে হবে, তার সাথে তুলনা
একটি চুক্তিতে এমন প্রমাণ দরকার, যা তৃতীয় পক্ষ যাচাই করতে পারবে এবং স্বাক্ষরকারী পরে অস্বীকার করতে পারবেন না। কোন হাতিয়ার সঠিক?
- Symmetric encryption
- HMAC
- Digital signature
- SHA-256 hash
Kerckhoffs-এর নীতি অনুযায়ী কোনটি সঠিক?
- Algorithm গোপন রাখাই নিরাপত্তার মূল ভিত্তি
- Key ছাড়া ব্যবস্থার সবকিছু প্রকাশ হলেও নিরাপত্তা থাকবে
- Key আর algorithm দুটিই প্রকাশ্য হওয়া উচিত
- Key সবসময় ২৫৬ bit হতে হবে
Simple substitution cipher-এর key space প্রায় 288, যা DES-এর 256-এর চেয়ে অনেক বড়। তবু এটি সহজে ভাঙা যায় কেন?
- আধুনিক কম্পিউটারে সব key দ্রুত চেষ্টা করা যায়
- এর key অত্যন্ত ছোট
- Key একাধিকবার ব্যবহার করা বাধ্যতামূলক
- Ciphertext-এ plaintext-এর অক্ষরের হারের ছাপ থেকে যায়
একটি one-time pad ব্যবস্থায় একই key দিয়ে দুটি বার্তা encrypt করা হলো। কী হবে?
- দুই ciphertext XOR করলে দুই plaintext-এর XOR ফাঁস হয়
- কোনো ক্ষতি নেই, perfect secrecy অক্ষত থাকে
- Key-র কার্যকর দৈর্ঘ্য দ্বিগুণ হয়
- Encrypt করার সময় error আসে
একটি ব্যবস্থায় key ৬০ bit, আর ধরে নেওয়া গতি সেকেন্ডে 230 চেষ্টা। গড়ে key পেতে আনুমানিক কত সময় লাগবে? (এক বছর ≈ 225 সেকেন্ড)
- প্রায় ৩৪ দিন
- প্রায় ৩২ বছর
- প্রায় ১৬ বছর
- প্রায় ৪ সেকেন্ড
Python-এ password reset token বানানোর সঠিক উপায় কোনটি?
random.seed(time.time())করেrandom.getrandbits(256)secrets.token_urlsafe(32)- ইউজারের নাম আর সময় MD5 করা
- ইউজারের email-এর Base64
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Cryptography তথ্যকে রক্ষা করে, কিন্তু চুরি হওয়া key, আক্রান্ত যন্ত্র আর availability নিয়ে কিছু করে না।
- লক্ষ্য আগে, হাতিয়ার পরে: encryption, hash, MAC, signature, AEAD, প্রতিটির কাজ আলাদা।
- Kerckhoffs: গোপন থাকবে শুধু key, আর key কখনো code-এ নয়।
- One-time pad নিখুঁত, কিন্তু অব্যবহারযোগ্য। বাস্তব নিরাপত্তা computational, confusion আর diffusion-এর ওপর গড়া।
- Key-র শক্তি তার entropy. CSPRNG ব্যবহার করুন, আর হিসাব করুন: প্রতি ১ bit-এ কাজ দ্বিগুণ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০৮ · Symmetric encryption — AES, mode, nonce আর authenticated encryptionপরবর্তী পর্বলম্বা ডেটা নিরাপদে encrypt করার নিয়ম।
- সাইবার নিরাপত্তা · কোর্স হোম৮০টি পর্বপুরো কোর্সের রোডম্যাপ।
- পর্ব ০৬ · আইন আর নৈতিকতাআগের পর্বঅনুমতি, সীমা আর দায়িত্বশীল প্রকাশ।
- Cryptography-র ভিত্তি, network-এর চোখেপাশের ট্র্যাকAES mode, Diffie-Hellman, RSA আর TLS-এর দিকে এক নজরে।
- নিরাপদ Pythonপাশের ট্র্যাকPython কোডে নিরাপত্তার অভ্যাস।
- Secrets আর KMSপাশের ট্র্যাকKey বাস্তবে কোথায়, কীভাবে রাখা হয়।