সরাসরি পর্বে যান
পর্ব ১০ · ৮০-এর মধ্যে · মডিউল ২

Public key cryptography — RSA, elliptic curve আর key exchange

Public Key Cryptography — RSA, Elliptic Curves and Key Exchange

Taught in Bangla, this lesson starts from the key distribution problem and trapdoor functions, works Diffie-Hellman and RSA by hand with small numbers, shows why textbook RSA is unsafe and what OAEP and PSS change, compares elliptic curve key sizes, then covers hybrid encryption, forward secrecy, man-in-the-middle protection, and generating and storing SSH keys safely on your own computer.

এই পর্বে যা শিখবেন

  • Key distribution সমস্যা, আর trapdoor function কীভাবে তার সমাধান দেয়
  • ছোট সংখ্যায় হাতে Diffie-Hellman আর RSA হিসাব করা
  • Textbook RSA কেন অনিরাপদ, আর OAEP ও PSS কী বদলায়
  • Key size-এর সমতুল্য নিরাপত্তা বোঝা, আর নিজের key-তালিকা যাচাই করা
  • Hybrid encryption, forward secrecy আর man-in-the-middle ঝুঁকি থেকে রক্ষা
  • নিজের কম্পিউটারে নিরাপদে SSH key বানানো আর private key সুরক্ষিত রাখা

১ · চাবি পৌঁছাবে কীভাবে — key distribution সমস্যা

পর্ব ০৮-এ দেখা AES খুব দ্রুত আর শক্তিশালী। কিন্তু তার একটি শর্ত আছে। পাঠানো আর পড়া, দুই কাজেই একই key লাগে। এবার একটি সাধারণ দৃশ্য ভাবুন। রিমা রাজশাহী থেকে প্রথমবার একটি কাল্পনিক অনলাইন বাজারের site খুলেছেন। তাঁদের আগে কখনো যোগাযোগ হয়নি। মাঝের network-এ কে কী দেখছে, রিমা জানেন না। এই খোলা পথে AES-এর key পাঠালে যে শুনছে, সে-ও key পেয়ে যাবে। আবার key পাঠাতে হলে তো আগে একটি গোপন পথ লাগে। এই গোলকধাঁধার নাম key distribution সমস্যা।

সমস্যাটি সংখ্যায়ও বড়। যদি n জন মানুষের প্রত্যেক জোড়ার জন্য আলাদা গোপন key লাগে, তাহলে মোট key দরকার n(n−1)/2টি।

n = ১০০ হলে ৪,৯৫০টি key
n = ১,০০০ হলে ৪,৯৯,৫০০টি key
Public key পদ্ধতিতে ১,০০০ জনের জন্য ১,০০০টি key-জোড়া

পাড়ার পোস্ট অফিসের লাল ডাকবাক্সের কথা ভাবুন। যে কেউ ফাঁক দিয়ে চিঠি ফেলতে পারেন। কিন্তু বাক্স খোলার চাবি আছে শুধু পোস্টমাস্টারের কাছে। ডাকবাক্সের ঠিকানা সবার জানা, তাতে কোনো ক্ষতি নেই। এই ফাঁকটিই public key, আর পোস্টমাস্টারের চাবিটি private key. উল্টো দিকের কাজের জন্য ভাবুন পোস্ট অফিসের সিলমোহর। সিল দিতে পারে শুধু অফিস, কিন্তু ছাপ দেখে যাচাই করতে পারেন সবাই। এটি digital signature-এর ধারণা।

একই key-জোড়ার দুই ব্যবহার

Encryption and signature use the key pair in opposite directions

Public key আর private key-এর দুই দিক Encryption: গোপনীয়তা যে কেউ প্রাপকের public key দিয়ে বন্ধ করেন শুধু প্রাপক নিজের private key দিয়ে খোলেন Signature: পরিচয় আর অখণ্ডতা শুধু মালিক নিজের private key দিয়ে সই করেন যে কেউ মালিকের public key দিয়ে যাচাই করেন
ছবি ১০.১ — Public key বিলি করা যায়। Private key মালিকের হাত ছাড়ে না।

Public key cryptography আসলে তিনটি আলাদা কাজের একটি পরিবার। এগুলো গুলিয়ে ফেলা থেকেই বহু ভুল নকশা জন্মায়।

কাজকী দেয়কী দেয় নাউদাহরণ
Key exchangeখোলা পথে দুই পক্ষের একই গোপন মানঅন্য পক্ষ আসলে কে, সেই প্রমাণDiffie-Hellman, X25519
Public key encryptionKey-এর মালিক ছাড়া কেউ পড়তে পারে নাকে পাঠিয়েছেন, সেই প্রমাণRSA-OAEP
Digital signatureকে সই করেছেন, আর লেখা বদলেছে কি নাগোপনীয়তাRSA-PSS, Ed25519

১৯৭৬ সালে Whitfield Diffie আর Martin Hellman “New Directions in Cryptography” প্রবন্ধে দেখান, আগে থেকে কোনো গোপন কিছু ভাগ না করেও দুজন একই গোপন মানে পৌঁছাতে পারেন। Ralph Merkle-এর স্বাধীন কাজও এই চিন্তার অংশ ছিল। এরপর Rivest, Shamir আর Adleman-এর RSA প্রবন্ধ Communications of the ACM-এ প্রকাশিত হয় ১৯৭৮ সালে।

২ · Trapdoor function — এক দিকে সহজ, উল্টো দিকে কঠিন

চায়ে চিনি মেশাতে এক সেকেন্ড লাগে। সেই চা থেকে চিনি আলাদা করা প্রায় অসম্ভব। যে কাজ এক দিকে সহজ আর উল্টো দিকে কঠিন, তাকে বলে one-way function. আর trapdoor function হলো এমন one-way function, যার উল্টো দিকটি একটি গোপন তথ্য জানলে আবার সহজ হয়ে যায়। ডাকবাক্সে চিঠি ফেলা সহজ, ফিরিয়ে আনা কঠিন, কিন্তু চাবি থাকলে সহজ।

দুটি পরিবারের কঠিন সমস্যা আজকের বেশিরভাগ ব্যবস্থার ভিত্তি।

Integer factorization

দুটি বড় prime গুণ করা সহজ। কেবল গুণফল দেখে prime দুটি বের করা কঠিন। RSA এখানে দাঁড়িয়ে আছে। RSA-2048-এর modulus প্রায় ৬১৭ দশমিক অঙ্কের একটি সংখ্যা।

RSA

Discrete logarithm

g^x mod p হিসাব করা সহজ। ফল দেখে x বের করা কঠিন। Diffie-Hellman এখানে দাঁড়িয়ে আছে। Elliptic curve-এ এই সমস্যার আরও কঠিন একটি রূপ ব্যবহার হয়।

DH, X25519, Ed25519

এগুলো বুঝতে modular arithmetic লাগে। ঘড়ি দিয়ে এটি আপনি আগে থেকেই জানেন। ১০টার পাঁচ ঘণ্টা পরে ৩টা বাজে, ১৫টা নয়। অর্থাৎ (10 + 5) mod 12 = 3. ভাগশেষটুকুই ফল। সাধারণ সংখ্যায় ঘাত বাড়লে ফল বড় হতে থাকে, তাই উল্টো হিসাব সহজ। কিন্তু mod নিলে ফল চক্রের ভেতরে এলোমেলোভাবে লাফায়। Python-এর pow(a, b, m) দিয়ে সেটি দেখুন।

# Modular arithmetic with Python's built-in pow(a, b, m).
# Toy numbers first, for the idea only.
print("powers of 2 mod 29:", [pow(2, k, 29) for k in range(1, 12)])

# The two calculations that a small Diffie-Hellman uses
print("2^5 mod 29 =", pow(2, 5, 29))
print("18^5 mod 29 =", pow(18, 5, 29))

# Modular inverse: find d so that 17 * d leaves remainder 1 mod 2668
d = pow(17, -1, 2668)
print("inverse of 17 mod 2668 =", d, "| check:", 17 * d % 2668)

# Forward direction stays cheap, even at 2048 bits
m = 2**2048 - 1942289
e = 2**2047 + 12345
r = pow(3, e, m)
steps = e.bit_length() - 1 + bin(e).count("1") - 1
print("modulus bits:", m.bit_length())
print("result bits:", r.bit_length())
print("exponent digits:", len(str(e)))
print("multiplications needed:", steps)

প্রথম সারিতে দেখুন: [2, 4, 8, 16, 3, 6, 12, 24, 19, 9, 18]. ঘাত বাড়লেও ফল সোজা পথে বাড়ে না, 16-এর পরেই 3-এ নেমে আসে। এই এলোমেলো চলনই উল্টো হিসাবকে কঠিন করে। 2^5 mod 29 = 3 আর 18^5 mod 29 = 15 লাইন দুটি পরের অংশে কাজে লাগবে। pow(17, -1, 2668) দিয়েছে 157, আর check: 1 প্রমাণ করে 17 × 157-এর ভাগশেষ 1.

শেষ চারটি লাইন আসল বার্তা। exponent digits: 617 মানে ঘাতটি ৬১৭ অঙ্কের সংখ্যা, তবু multiplications needed: 2053. বারবার বর্গ করার কৌশলে মাত্র ২,০৫৩টি গুণেই কাজ শেষ হয়। সামনের দিক এত সস্তা বলেই public key cryptography ব্যবহারযোগ্য।

Factorization বা discrete logarithm যে সত্যিই কঠিন, তার গাণিতিক প্রমাণ নেই। আমরা শুধু জানি, দীর্ঘদিনের প্রকাশ্য গবেষণায় সাধারণ কম্পিউটারের জন্য দ্রুত পদ্ধতি পাওয়া যায়নি। তাই key size সময়ের সাথে বাড়ে। ১৯৯৪ সালে Peter Shor দেখান, যথেষ্ট বড় quantum computer এই দুই সমস্যাই দ্রুত সমাধান করতে পারবে। সেই পরিবর্তন নিয়ে আলোচনা পর্ব ১৪-তে।

৩ · Diffie-Hellman — খোলা রাস্তায় একই গোপন মান

রং মেশানোর কথা ভাবুন। রিমা আর সজীব প্রকাশ্যে একটি হলুদ রং বেছে নিলেন। রিমা তাতে নিজের গোপন নীল মেশালেন, সজীব মেশালেন গোপন লাল। মিশ্রণ দুটি তাঁরা খোলাখুলি বদল করলেন। এবার প্রত্যেকে অন্যের মিশ্রণে নিজের গোপন রং মেশালেন। দুজনের পাত্রেই এখন হলুদ, নীল আর লাল আছে, তাই রং এক। যিনি শুধু রাস্তার মিশ্রণ দুটি দেখেছেন, তিনি মিশ্রণ থেকে রং আলাদা করতে পারেন না।

এবার রঙের জায়গায় সংখ্যা বসাই। Diffie-Hellman-এ প্রকাশ্য মান দুটি হলো prime p আর base g. গোপন মান দুটি হলো a আর b. নিচের সংখ্যাগুলো এত ছোট যে হাতে মেলানো যায়। বাস্তবে এই আকার কোনো নিরাপত্তা দেয় না।

1public: p = 29, g = 22Rima secret: a = 53Sajib secret: b = 114A = g^a mod p5B = g^b mod p6send A and B in the open7Rima:  s = B^a mod p8Sajib: s = A^b mod p
কার হাতে কী
রিমার a
সজীবের b
A
B
রিমার s
সজীবের s
পথের দর্শক দেখেন
  1. প্রকাশ্য মান। দুজনে p = 29 আর g = 2 ব্যবহারে একমত হলেন। এগুলো গোপন নয়, পথের দর্শকও জানেন।
  2. গোপন মান। রিমা a = 5 আর সজীব b = 11 বেছে নিলেন। এই দুটি কখনো পাঠানো হবে না।
  3. রিমার মিশ্রণ। A = 25 mod 29 = 32 mod 29 = 3.
  4. সজীবের মিশ্রণ। B = 211 mod 29 = 2048 mod 29 = 18, কারণ 29 × 70 = 2030 আর 2048 − 2030 = 18.
  5. খোলা পথে বদল। A = 3 আর B = 18 network দিয়ে গেল। দর্শক এখন p, g, A, B চারটিই জানেন, কিন্তু a বা b জানেন না।
  6. রিমার হিসাব। s = 185 mod 29. ধাপে ধাপে 182 mod 29 = 5, তাই 184 mod 29 = 25, আর 25 × 18 = 450, যার mod 29 হলো 15.
  7. সজীবের হিসাব। s = 311 mod 29 = 15. দুজনে একই মান পেলেন, কারণ দুই দিকেই ফল gab mod p. মানটি কখনো পথে যায়নি।

কেন মেলে? (g^b)^a = g^(ab) = (g^a)^b. গুণের ক্রম বদলালেও ফল একই থাকে। এই একটি লাইনই পুরো পদ্ধতির ভিত্তি। পথের দর্শকের হাতে ga আর gb আছে, কিন্তু সেখান থেকে gab বানাতে হলে কার্যত একটি discrete logarithm সমাধান করতে হয়।

নিচের কোডে প্রথমে একই ছোট উদাহরণ, তারপর একটু বড় prime-এ তিনটি আলাদা session চলছে। প্রতিটি session-এ নতুন গোপন মান। এই অভ্যাসটি পরে forward secrecy-তে কাজে লাগবে।

// Toy Diffie-Hellman with BigInt. Only for the idea, never for real use.
function modpow(base, exp, mod) {
  let result = 1n;
  base %= mod;
  while (exp > 0n) {
    if (exp & 1n) result = result * base % mod;
    base = base * base % mod;
    exp >>= 1n;
  }
  return result;
}
// Seeded PRNG keeps the output fixed. Real keys need a CSPRNG.
function mulberry32(a) {
  return function () {
    a = (a + 0x6D2B79F5) | 0;
    let t = Math.imul(a ^ (a >>> 15), 1 | a);
    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}
console.log("real নয়, শুধু ধারণার জন্য");
const A = modpow(2n, 5n, 29n), B = modpow(2n, 11n, 29n);
console.log(`small: A = ${A}, B = ${B}, s = ${modpow(B, 5n, 29n)} and ${modpow(A, 11n, 29n)}`);

const rand = mulberry32(2026);
const p = 2n ** 61n - 1n, g = 3n;
const secret = () => BigInt(Math.floor(rand() * 2 ** 40)) + 2n;
for (let session = 1; session <= 3; session++) {
  const a = secret(), b = secret();
  const pubA = modpow(g, a, p), pubB = modpow(g, b, p);
  const s1 = modpow(pubB, a, p), s2 = modpow(pubA, b, p);
  console.log(`session ${session}: shared ${s1}, same: ${s1 === s2}`);
}

প্রথম সংখ্যার লাইন small: A = 3, B = 18, s = 15 and 15 ঠিক stepper-এর মানগুলোই দেখাচ্ছে। এরপর তিন session-এ shared মান যথাক্রমে 157294480668179364, 1521861429034020534 আর 1800055686470013190, আর প্রতিটিতে same: true. অর্থাৎ দুই পক্ষ প্রতিবার একই মান পেয়েছেন, অথচ এক session-এর মান অন্য session-এর সাথে মেলে না।

৬১ bit-এর এই p বাস্তবে একেবারেই যথেষ্ট নয়। আর seeded PRNG এখানে শুধু আউটপুট স্থির রাখার জন্য। আসল key-তে এটি ব্যবহার করলে key অনুমানযোগ্য হয়ে যাবে।

বাস্তবের নিয়ম কয়েকটি। Group যথেষ্ট বড় হতে হয়। Library যেন অন্য পক্ষের পাঠানো মান যাচাই করে। আর গোপন মান আসতে হয় ভালো random উৎস থেকে। আজকের নতুন নকশায় সাধারণত classic DH-এর বদলে elliptic curve-ভিত্তিক X25519 ব্যবহার হয়, যা অংশ ৬-এ দেখবেন। Network course-এর Cryptography-র ভিত্তি পর্বে আরেকটি সংখ্যা-উদাহরণ পাবেন।

৪ · RSA — ছোট সংখ্যায় পুরো পথ

Diffie-Hellman দুই পক্ষকে একই মানে পৌঁছে দেয়, কিন্তু এতে trapdoor নেই। RSA একটি সত্যিকারের trapdoor পদ্ধতি। গোপন prime দুটি জানলে উল্টো হিসাবের সূত্র পাওয়া যায়, না জানলে পাওয়া যায় না। নিচের উদাহরণের p = 47, q = 59, e = 17, d = 157 মূল ১৯৭৮ সালের RSA প্রবন্ধের ছোট উদাহরণ থেকেই নেওয়া। এটি খেলনা উদাহরণ, real নয়, শুধু ধারণার জন্য।

1p = 47, q = 592n = p * q3phi = (p-1) * (q-1)4e = 175d = inverse of e mod phi6public: (n, e)  private: d7c = m^e mod n8m = c^d mod n9sig = m^d mod n10check: sig^e mod n == m
মান
n
phi
e
d (গোপন)
m
c
sig
  1. দুটি prime. p = 47 আর q = 59 গোপনে বেছে নেওয়া হলো। বাস্তবে প্রতিটি ১,০০০ bit-এর বেশি লম্বা, আর আসে ভালো random উৎস থেকে।
  2. Modulus. n = 47 × 59 = 2773. এটি public key-এর অংশ।
  3. গোপন হিসাবের মান। phi = 46 × 58 = 2668. p আর q না জেনে এই মান পাওয়া যায় না, এখানেই trapdoor.
  4. Public exponent. e = 17, কারণ 2668-এর সাথে 17-এর কোনো সাধারণ উৎপাদক নেই। বাস্তবে প্রায় সব সময় e = 65537.
  5. Private exponent. d = 157, কারণ 17 × 157 = 2669 = 2668 + 1. অর্থাৎ e × d-এর mod phi ভাগশেষ 1.
  6. Key ভাগ করা। (n, e) = (2773, 17) সবাইকে দেওয়া হলো। d থাকল গোপনে। p, q আর phi-এর আর দরকার নেই, তাই সহজ মডেলে এগুলো মুছে ফেলা হয়।
  7. Encrypt. বার্তা m = 920. যে কেউ public key দিয়ে হিসাব করেন c = 92017 mod 2773 = 948.
  8. Decrypt. শুধু d-এর মালিক হিসাব করতে পারেন 948157 mod 2773 = 920. বার্তা ফিরে এলো।
  9. সই। এবার উল্টো দিক। মালিক d দিয়ে হিসাব করেন sig = 920157 mod 2773 = 192. ধারণাটি এমনই, যদিও এই কাঁচা রূপ বাস্তবে নিরাপদ নয়।
  10. যাচাই। যে কেউ public key দিয়ে হিসাব করেন 19217 mod 2773 = 920. বার্তার সাথে মিলল, তাই সই গ্রহণযোগ্য।
কেন ফিরে আসে

e × d-এর phi ভাগশেষ 1 হওয়ায়, Euler-এর উপপাদ্য অনুযায়ী (m^e)^d mod n = m হয়। n-এর উৎপাদক p আর q জানলে phi সহজেই পাওয়া যায়, তাই d-ও পাওয়া যায়। এজন্যই RSA-এর নিরাপত্তা বড় n-এর factorization কঠিন হওয়ার ওপর নির্ভর করে। বিপরীত দিকটি অবশ্য প্রমাণিত নয়। RSA ভাঙতে factorization-ই একমাত্র পথ কি না, তা খোলা প্রশ্ন।

এবার পুরো পথটি চালিয়ে দেখুন। শেষ অংশটি পরের অংশের প্রস্তুতি, সেখানে একই বার্তা দুইবার encrypt করা হচ্ছে।

// Toy RSA round trip with the small numbers from the 1978 paper.
function modpow(base, exp, mod) {
  let result = 1n;
  base %= mod;
  while (exp > 0n) {
    if (exp & 1n) result = result * base % mod;
    base = base * base % mod;
    exp >>= 1n;
  }
  return result;
}
console.log("real নয়, শুধু ধারণার জন্য");
const n = 2773n, e = 17n, d = 157n;
const m = 920n;

const c = modpow(m, e, n);
console.log(`encrypt 920 -> ${c}, decrypt -> ${modpow(c, d, n)}`);

const sig = modpow(m, d, n);
console.log(`sign 920 -> ${sig}, verify -> ${modpow(sig, e, n)}`);
console.log("signature fits 920:", modpow(sig, e, n) === 920n);
console.log("signature fits 921:", modpow(sig, e, n) === 921n);

// Textbook RSA has no randomness: same input, same output.
console.log(`same message twice: ${modpow(12n, e, n)} ${modpow(12n, e, n)}`);

// Toy padding: add two random-looking digits before encrypting.
// This only shows the idea. Real OAEP is a very different design.
for (const r of [37n, 81n]) {
  const padded = 12n * 100n + r;
  const ct = modpow(padded, e, n);
  const back = modpow(ct, d, n) / 100n;
  console.log(`r = ${r}: cipher -> ${ct}, message back -> ${back}`);
}

encrypt 920 -> 948, decrypt -> 920 লাইনে পুরো পথটি মিলেছে। sign 920 -> 192, verify -> 920 লাইনে একই গণিত উল্টো দিকে চলছে। signature fits 920: true আর signature fits 921: false দেখায়, একটি সংখ্যা বদলালেই সই আর মেলে না।

এবার সমস্যাটি দেখুন: same message twice: 336 336. একই বার্তা, একই ciphertext. পথের দর্শক অন্তত বুঝে ফেলেন যে বার্তা দুটি এক। খেলনা padding-এ r = 37 দিলে ciphertext 734, আর r = 81 দিলে 994, অথচ দুই ক্ষেত্রেই message back -> 12. এলোমেলো মান মিশিয়ে একই বার্তা আলাদা দেখানো গেল। আসল OAEP অনেক বেশি যত্নে নকশা করা, এই কোড শুধু মূল ধারণাটি দেখায়।

৫ · Textbook RSA কেন অনিরাপদ — OAEP আর PSS

বইয়ের সূত্রটি সরাসরি বার্তায় বসানোকে বলে textbook RSA. এটি শেখার জন্য ভালো, ব্যবহারের জন্য নয়। কারণগুলো ধারণার স্তরে জেনে রাখুন।

দুর্বলতাফল কীরক্ষা
Deterministic: একই বার্তার একই ciphertext“হ্যাঁ/না”-এর মতো ছোট বার্তা public key দিয়েই মিলিয়ে দেখা যায়, আর পুনরাবৃত্তি চোখে পড়েRandom padding
Malleable: গণিতের ধর্ম রয়ে যায়Key ছাড়াই ciphertext এমনভাবে বদলানো যায় যে plaintext-ও অনুমানযোগ্যভাবে বদলায়Padding-এর গঠন যাচাই, আর AEAD-এর সাথে hybrid ব্যবহার
ছোট বার্তায় গঠনহীনতাছোট m আর ছোট e একসাথে হলে হিসাব দুর্বল হয়ে পড়তে পারেPadding পুরো n-এর আকার ভরে দেয়
কাঁচা signatureকিছু বার্তা-সইয়ের জোড়া গণিত দিয়েই জাল করা যায়আগে hash (পর্ব ০৯), তারপর PSS-এর মতো signature scheme

সমাধান দুটি নাম মনে রাখলেই যথেষ্ট। OAEP (Bellare আর Rogaway, ১৯৯৪) encryption-এর আগে বার্তার সাথে random মান মিশিয়ে একটি গঠন তৈরি করে। ফলে একই বার্তা প্রতিবার আলাদা ciphertext দেয়, আর বদলানো ciphertext decrypt করলে গঠন ভেঙে যায়। PSS (একই লেখকদের, ১৯৯৬) signature-এ একই ধরনের random গঠন আনে। দুটিই RFC 8017 (PKCS #1 v2.2, ২০১৬)-এ আছে।

পুরোনো PKCS #1 v1.5 encryption padding এখনো অনেক পুরোনো ব্যবস্থায় টিকে আছে। ১৯৯৮ সালে Daniel Bleichenbacher দেখান, server padding-এর ভুল আলাদাভাবে জানালে সেই ছোট্ট তথ্যই ciphertext ভাঙায় কাজে লাগে। শিক্ষাটি রক্ষকের জন্য বড়। Error message-ও একটি তথ্য-প্রবাহ। পর্ব ০৭-এর Kerckhoffs-এর নীতি মনে করুন, algorithm গোপন নয়, তাই নিরাপত্তা নির্ভর করে key আর সঠিক ব্যবহারের ওপর।

Library ব্যবহারে কেমন দেখায়, তার একটি ছোট ছবি নিচে। এখানে padding স্পষ্টভাবে বলে দেওয়া হচ্ছে।

# Example only. Uses the third-party "cryptography" package.
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

key = rsa.generate_private_key(public_exponent=65537, key_size=3072)
oaep = padding.OAEP(
    mgf=padding.MGF1(hashes.SHA256()),
    algorithm=hashes.SHA256(),
    label=None,
)
wrapped = key.public_key().encrypt(b"example-session-key", oaep)
print(key.decrypt(wrapped, oaep))

RSA নিজে হাতে লিখবেন না। উপরের খেলনা কোড শুধু গণিত বোঝায়। আসল বাস্তবায়নে constant-time হিসাব, সঠিক padding, prime তৈরি আর error সামলানো লাগে। এই কাজ পরীক্ষিত library-র। Code review-তে pow(m, e, n) ধরনের সরাসরি RSA, বা NoPadding-এর মতো নাম দেখলে থামুন।

৬ · Elliptic curve আর key size — ছোট key, একই নিরাপত্তা

Elliptic curve হলো y² = x³ + ax + b ধরনের সমীকরণের বিন্দুগুলোর একটি সেট, যেগুলো একটি সসীম ক্ষেত্রের ওপর ধরা হয়। এই বিন্দুগুলোর জন্য একটি “যোগ” নিয়ম আছে। একটি বিন্দু P-কে k বার নিজের সাথে যোগ করলে আরেকটি বিন্দু পাওয়া যায়, যাকে লেখা হয় k·P.

ক্যারম বোর্ডে একটি গুটি ধরুন, যা নির্দিষ্ট নিয়মে একের পর এক ধাক্কা খেয়ে বোর্ডে ঘুরছে। আপনি জানেন কতবার ধাক্কা দিতে হবে, তাই শেষ অবস্থান দ্রুত বের করতে পারেন। কিন্তু যিনি শুধু শুরু আর শেষ অবস্থান দেখছেন, তিনি বলতে পারেন না কতবার ধাক্কা লেগেছে। k·P থেকে k বের করার কঠিন সমস্যাটি এমনই। একে বলে elliptic curve discrete logarithm.

এই সমস্যার বিরুদ্ধে জানা সেরা সাধারণ পদ্ধতি factorization-এর পদ্ধতির চেয়ে অনেক দুর্বল। তাই অনেক ছোট key-তেই একই নিরাপত্তা মেলে। ১৯৮৫ সালে Neal Koblitz আর Victor Miller স্বাধীনভাবে cryptography-তে elliptic curve ব্যবহারের প্রস্তাব দেন। আজকের পরিচিত দুটি উদাহরণ এই।

X25519

Curve25519-এর ওপর key exchange. RFC 7748 (২০১৬)-তে বর্ণিত। Public key মাত্র ৩২ byte, নিরাপত্তা প্রায় ১২৮ bit স্তরের।

Key exchange

Ed25519

একই পরিবারের signature. RFC 8032 (২০১৭)-তে বর্ণিত। Public key ৩২ byte, signature ৬৪ byte. প্রতিটি সইয়ের জন্য random nonce-এর ওপর নির্ভর করে না।

Signature

Key size আর সমতুল্য নিরাপত্তা

“২০৪৮ bit” আর “১২৮ bit” সরাসরি তুলনা করা যায় না, কারণ দুটির ওপর সেরা জানা পদ্ধতি আলাদা। তাই বলা হয় security strength. ১২৮ bit strength মানে মোটামুটি 2128 ধাপের কাজ। নিচের সারণি NIST SP 800-57 Part 1 Rev. 5 (২০২০)-এর সমতুল্য তালিকার সহজ রূপ। এগুলো সেরা জানা পদ্ধতির ওপর ভিত্তি করে করা অনুমান, গাণিতিক সমতা নয়। অন্য সংস্থার হিসাবে সংখ্যা কিছুটা আলাদা হতে পারে, আর সময়ের সাথে নির্দেশনা বদলায়।

Security strengthSymmetricRSA / classic DHElliptic curveঅবস্থা
≤ ৮০ bit2TDEA1024160–223নতুন কাজে নয়
১১২ bit3TDEA2048224–255ন্যূনতম স্তর, পুরোনো হচ্ছে
১২৮ bitAES-1283072256–383নতুন নকশার সাধারণ লক্ষ্য
১৯২ bitAES-1927680384–511উচ্চ চাহিদা
২৫৬ bitAES-25615360512+দীর্ঘমেয়াদি উচ্চ চাহিদা

রক্ষকের আসল কাজ হলো নিজের key-গুলোর তালিকা রাখা আর নীতির সাথে মেলানো। নিচের ছোট যন্ত্রে একটি কাল্পনিক প্রতিষ্ঠানের তালিকা দেওয়া আছে, আর ধরে নেওয়া নীতি হলো নতুন key-তে কমপক্ষে ১২৮ bit.

// Key inventory check on fictional in-memory data.
// Rows follow NIST SP 800-57 Part 1 Rev. 5, simplified.
const RSA_ROWS = [[15360, 256], [7680, 192], [3072, 128], [2048, 112], [1024, 80]];
const ECC_ROWS = [[512, 256], [384, 192], [256, 128], [224, 112], [160, 80]];
const NAMED = { ed25519: 128, x25519: 128 };   // about 128 per RFC 7748 and 8032
const POLICY = 128;                            // assumed policy for this example

function strength(alg, bits) {
  if (alg in NAMED) return NAMED[alg];
  const rows = alg === "rsa" ? RSA_ROWS : ECC_ROWS;
  for (const [size, s] of rows) if (bits >= size) return s;
  return 0;
}
const inventory = [
  ["old-vpn-gateway", "rsa", 1024],
  ["mail-signing", "rsa", 2048],
  ["web-tls", "rsa", 3072],
  ["api-tls", "ecdsa", 256],
  ["admin-ssh", "ed25519", 255],
  ["backup-signing", "rsa", 4096],
];
let flagged = 0;
for (const [name, alg, bits] of inventory) {
  const s = strength(alg, bits);
  const ok = s >= POLICY;
  if (!ok) flagged++;
  const verdict = ok ? "ok" : (s < 112 ? "REPLACE NOW" : "plan rotation");
  console.log(`${name.padEnd(17)} ${(alg + "-" + bits).padEnd(13)} ~${String(s).padEnd(3)} bit  ${verdict}`);
}
console.log("flagged:", flagged, "of", inventory.length);

ছয়টি key-এর মধ্যে আউটপুটের শেষ লাইন বলছে flagged: 2 of 6. old-vpn-gateway মাত্র প্রায় ৮০ bit, তাই REPLACE NOW. mail-signing-এর RSA-2048 প্রায় ১১২ bit, যা ধরে নেওয়া নীতির নিচে, তাই ফল plan rotation. RSA-2048 আজও অনেক জায়গায় গ্রহণযোগ্য, তাই “এখনই বদলান” নয়, পরিকল্পনা করে বদলানোর কথা। সিদ্ধান্ত নির্ভর করে আপনার নীতি আর ডেটা কতদিন গোপন রাখতে হবে তার ওপর।

দুটি সূক্ষ্ম বিষয় খেয়াল করুন। admin-ssh-এর curve ২৫৫ bit, সারণি যান্ত্রিকভাবে পড়লে ১১২ bit-এর ঘরে পড়ত। কিন্তু RFC 7748 আর RFC 8032 একে প্রায় ১২৮ bit স্তর ধরে, তাই কোডে এটি নাম ধরে আলাদা রাখা হয়েছে। আর rsa-4096 দেখাচ্ছে ~128, কারণ কোড সারণির সবচেয়ে কাছের নিচের ঘরটি নেয়। এটি নিরাপদ দিকের একটি সরল হিসাব।

Key বড় করলেই সব ঠিক হয় না। নিরাপত্তা নির্ধারণ করে দুর্বলতম অংশ। ১২৮ bit-এর AES-কে RSA-1024 দিয়ে মুড়লে পুরো ব্যবস্থা প্রায় ৮০ bit-এর স্তরে নেমে আসে। RSA-4096 হিসাবেও ভারী, অথচ X25519 ছোট আর দ্রুত। আবার quantum-এর ঝুঁকিতে RSA আর elliptic curve দুটিই পড়ে, key বড় করা এর সমাধান নয়। NIST IR 8547 (চূড়ান্ত, অক্টোবর ২০২৬) এই পুরোনো algorithm-গুলো ধাপে ধাপে সরানোর সময়সূচি দেয়, ২০৩০ আর ২০৩৫ সালকে সীমা ধরে। বিস্তারিত NIST-এর সাইটে দেখে নেবেন। FIPS 203–205 (২০২৪) আর রূপান্তর নিয়ে কথা হবে পর্ব ১৪-তে।

৭ · Hybrid encryption আর forward secrecy

Public key হিসাব symmetric হিসাবের চেয়ে অনেক ধীর, আর RSA একবারে key-এর আকারের চেয়ে বড় বার্তা নিতে পারে না। তাই বাস্তবে কেউ বড় ফাইল সরাসরি RSA দিয়ে encrypt করে না। এর বদলে ব্যবহার হয় hybrid encryption. একটি নতুন session key দিয়ে ডেটা encrypt হয়, আর public key শুধু সেই ছোট key-কে রক্ষা করে।

ব্যাংকের লকারে অনেক কাগজ রাখা আছে, আর লকারের চাবি একটি ছোট খামে সিল করা। ভারী বাক্সটি সাধারণ কুরিয়ারে যায়, আর শুধু খামটিতে প্রাপকের বিশেষ তালা লাগানো থাকে। ছোট খাম রক্ষা করাই যথেষ্ট।

1file = 1048576 bytes2k = new random 256-bit key3nonce = new random 96 bits4box = AES-256-GCM(k, nonce, file)5wrapped = RSA-OAEP(pub, k)6send wrapped + nonce + box7k = RSA-OAEP-open(priv, wrapped)8file = AES-256-GCM-open(k, nonce, box)
Byte-এর হিসাব
file
k
nonce
box
wrapped
মোট পাঠানো
  1. ফাইল। পাঠাতে হবে ১ MiB, অর্থাৎ 1048576 byte. প্রাপকের RSA-2048 public key আগে থেকে হাতে আছে।
  2. নতুন key. Sender ভালো random উৎস থেকে ৩২ byte-এর k আর ১২ byte-এর nonce বানালেন। এই k শুধু এই একবারের জন্য।
  3. ডেটা encrypt. AEAD mode-এ ফাইল encrypt হলো। ১৬ byte tag যুক্ত হয়ে box হলো 1048592 byte. কাজটি খুব দ্রুত।
  4. Key মোড়ানো। শুধু k-কে প্রাপকের public key দিয়ে RSA-OAEP-এ encrypt করা হলো। RSA-2048-এর ফল সব সময় ২৫৬ byte.
  5. পাঠানো। মোট 256 + 12 + 1048592 = 1048860 byte গেল। ফাইলের ওপর বাড়তি মাত্র ২৮৪ byte. Nonce গোপন নয়, তবে k গোপন থাকল মোড়কের ভেতরে।
  6. Key খোলা। প্রাপক private key দিয়ে wrapped থেকে k পেলেন। যাঁর কাছে private key নেই, তিনি এই ধাপ পার হতে পারেন না।
  7. ডেটা খোলা। Tag যাচাই হলে তবেই ফাইল ফেরত আসে। ডেটা বদলে গেলে tag মিলবে না, আর কিছুই ফেরত দেওয়া হবে না। কাজ শেষে k মুছে ফেলা হলো।

Forward secrecy — আজকের চুরি যেন পুরোনো কথা না খোলে

কল্পনা করুন, কেউ এক বছর ধরে আপনার encrypted traffic রেকর্ড করে রাখছে। পরে কোনো ঘটনায় server-এর দীর্ঘমেয়াদি private key ফাঁস হলো। উপরের নকশায় RSA দিয়ে k মোড়ানো থাকলে সেই একটি key দিয়ে সব রেকর্ডের সব k খুলে যাবে। Forward secrecy-র লক্ষ্য হলো এই ক্ষতি আটকানো। দীর্ঘমেয়াদি key ফাঁস হলেও পুরোনো session যেন না খোলে।

কৌশলটি হলো ephemeral key. প্রতিটি session-এ নতুন DH বা X25519 key-জোড়া বানানো হয়, কাজ শেষে মুছে ফেলা হয়। দীর্ঘমেয়াদি key তখন শুধু সই করে পরিচয় প্রমাণ করে, session key রক্ষার কাজ করে না।

কোন নকশায় কী অবস্থা
ঘটনা
নকশা ক: static RSA
নকশা খ: ephemeral X25519
  1. শুরু। নকশা ক-তে session key দীর্ঘমেয়াদি RSA key দিয়ে মোড়ানো। নকশা খ-তে দুই পক্ষ নতুন ephemeral key-জোড়া বানায়, আর server শুধু সই করে পরিচয় দেয়।
  2. রেকর্ড। পথের দর্শক দুটি নকশাতেই সব রেকর্ড করছেন। নকশা ক-তে রেকর্ডে মোড়ানো k রয়ে গেছে। নকশা খ-তে আছে শুধু public মান।
  3. শেষ। দুই নকশাতেই session key মুছে যায়। নকশা খ-তে ephemeral private key-ও মুছে যায়, তাই হিসাবের একটি উপাদান পৃথিবীতে আর নেই।
  4. ফাঁস। ৩০তম দিনে server-এর দীর্ঘমেয়াদি private key ফাঁস হলো। দুই নকশাতেই এটি একটি গুরুতর incident.
  5. ফল। নকশা ক-তে ফাঁস হওয়া key দিয়ে রেকর্ডের k খুলে যায়। নকশা খ-তে পুরোনো session খোলে না। তবে ফাঁস হওয়া key দিয়ে ভবিষ্যতে server সাজা সম্ভব, তাই key বাতিল আর বদল তখনও জরুরি।

TLS 1.3 (প্রথম RFC 8446, ২০১৮; এখন RFC 9846) static RSA key exchange পুরোপুরি বাদ দিয়েছে। তার handshake-এর সাধারণ পথে ephemeral key exchange থাকে। বিস্তারিত দেখবেন পর্ব ১২-তে। Forward secrecy-র সীমাও আছে। Session চলাকালীন device দখল হলে এটি সাহায্য করে না। ডেটা যদি লগে সাধারণ লেখায় থাকে, তাও এটি রক্ষা করে না। আবার session ticket-এর key দীর্ঘদিন রাখলে সুবিধাটি কমে যেতে পারে।

৮ · Man-in-the-middle — key exchange-এর সবচেয়ে বড় ফাঁক

Diffie-Hellman গোপনীয়তা দেয় শুধু পথের নিষ্ক্রিয় দর্শকের বিরুদ্ধে। কিন্তু রিমা কীভাবে জানবেন, A আর B আসলে কার সাথে বদল হচ্ছে? যিনি পথের ওপর সক্রিয়ভাবে বসে আছেন, তিনি দুই দিকের সাথে আলাদা আলাদা key exchange করতে পারেন। একে বলে man-in-the-middle বা MITM. গণিত এখানে ভাঙে না, ভাঙে পরিচয়ের ধারণা।

Authentication ছাড়া আর authentication-সহ

Unauthenticated key exchange compared with a signed key exchange

MITM আর authenticated key exchange পরিচয় যাচাই নেই রিমা মাঝের লোক সজীব key K1 key K2 দুজনেই ভাবছেন সরাসরি কথা বলছেন Key exchange-এর মানে সই আছে রিমা সই যাচাই সজীব সই করেন B + sign(B) মাঝের লোক B বদলালে সই মেলে না রিমা সংযোগ বন্ধ করেন সজীবের public key চেনা যায় certificate দিয়ে
ছবি ১০.২ — Key exchange একা গোপনীয়তা দেয়, পরিচয় দেয় না। সই দুটিকে জোড়া দেয়।
দৃষ্টিকোণকী ঘটে বা কী করবেন
হামলাকারীর সুযোগপথের নিয়ন্ত্রণ থাকলে, আর পরিচয় যাচাই না থাকলে দুই দিকের ট্রাফিক পড়া বা বদলানো সম্ভব
প্রতিরোধSignature আর certificate-সহ key exchange, SSH-এর host key যাচাই, আগে থেকে জানা fingerprint মিলিয়ে নেওয়া
শনাক্তCertificate error, “host key changed” সতর্কতা, অচেনা CA-র certificate, Certificate Transparency নজরদারি
সাড়াসংযোগ বন্ধ, সতর্কতা উপেক্ষা না করা, অন্য পথে fingerprint যাচাই, প্রয়োজনে key বদল আর incident রিপোর্ট

নিজের অনুমতি ছাড়া অন্যের যোগাযোগে হস্তক্ষেপ করা অপরাধ। যেকোনো পরীক্ষা শুধু নিজের lab-এ বা লিখিত অনুমতি নিয়ে করবেন। আইনি সীমা জানতে পর্ব ০৬ দেখুন।

রিমা কীভাবে জানবেন যে public key-টি সত্যিই সজীবের? সমস্যাটি ঘুরে আবার এক জায়গায় এসেছে। এবার গোপন key পৌঁছানোর সমস্যা নয়, বরং সঠিক public key চেনার সমস্যা। এর উত্তরই digital signature, certificate আর CA, যা পর্ব ১১-এর মূল বিষয়।

৯ · Key নিরাপদে বানানো আর রাখা — SSH দিয়ে হাতে-কলমে

সবচেয়ে শক্ত algorithm-ও দুর্বল হয়ে পড়ে দুটি জায়গায়। এক, key বানানোর সময় random মান খারাপ হলে। দুই, private key হাতছাড়া হলে। বাস্তবের বেশিরভাগ ব্যর্থতা গণিতে নয়, এই দুই জায়গায় ঘটে।

নিজের কম্পিউটারে একটি SSH key

SSH key public key cryptography-র সবচেয়ে হাতের কাছের উদাহরণ। Server-এ থাকে আপনার public key. Login-এর সময় আপনার কম্পিউটার private key দিয়ে একটি চ্যালেঞ্জে সই করে, private key পথে যায় না। নিচের কমান্ডগুলো নিজের কম্পিউটারে, নিজের key-এর জন্য।

# On your own computer. It asks where to save and for a passphrase.
ssh-keygen -t ed25519 -a 100 -C "rima-laptop-2026"

# Show the fingerprint of the PUBLIC key
ssh-keygen -lf ~/.ssh/id_ed25519.pub

# Private key: owner only (Linux and macOS)
chmod 600 ~/.ssh/id_ed25519

আমরা OpenSSH 10.2 দিয়ে একটি ফেলে দেওয়ার মতো demo key বানিয়ে দ্বিতীয় কমান্ডটি চালিয়েছি। এটি তার আসল আউটপুট, তবে version-ভেদে আকার আলাদা হতে পারে। আপনার মান অবশ্যই আলাদা হবে।

256 SHA256:6mxJ2SD0Kn46p8qSgqSQjCaS0iYoGC0XzKRcFJuqeLk demo-key-example (ED25519)

এখানে 256 হলো key-এর আকার, মাঝের অংশ fingerprint আর শেষে key-এর ধরন। -a 100 passphrase থেকে key বানানোর ধাপ বাড়ায়, তাই private key ফাইল চুরি হলেও passphrase অনুমান করা ধীর হয়। ফাইল দুটির নাম মনে রাখুন। id_ed25519 private, id_ed25519.pub public. শুধু .pub ফাইলটিই অন্য কোথাও যায়।

নিজের server-এ key-login ঠিকমতো কাজ করছে দেখার পর password login বন্ধ করা যায়।

# /etc/ssh/sshd_config on a server you administer
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no

# Check the file before reloading the service
# sudo sshd -t

এই পরিবর্তনের আগে একটি চালু SSH session খোলা রাখুন, আর দ্বিতীয় session-এ login পরীক্ষা করুন। না হলে নিজেই server-এর বাইরে আটকে যেতে পারেন। প্রথমবার সংযোগের সময় server-এর fingerprint অন্য পথে মিলিয়ে নিন। StrictHostKeyChecking no দিয়ে সতর্কতা চাপা দেবেন না। আরও বিস্তারিত Cloud & DevOps কোর্সের SSH পর্বে পাবেন, যেখানে ssh-agent আর known_hosts-ও আছে।

SSH নিজেও এই পর্বের সব ধারণা একসাথে ব্যবহার করে। Key exchange দিয়ে session key, host key-এর সই দিয়ে server-এর পরিচয়, ব্যবহারকারীর সই দিয়ে আপনার পরিচয়, আর symmetric cipher দিয়ে ডেটা। OpenSSH 10.0 (২০২৫) থেকে default key agreement হিসেবে mlkem768x25519-sha256 আসে, যা X25519-এর সাথে post-quantum ML-KEM জুড়ে দেয়।

আরও গভীরে: নতুন নকশায় “RSA দিয়ে key মোড়ানো”-র বদলে key encapsulation mechanism (KEM) ধারণা বেশি ব্যবহার হয়। RFC 9180 (HPKE, ২০২২) একটি মানসম্মত hybrid কাঠামো দেয়, আর ML-KEM (FIPS 203, ২০২৪) নিজেও একটি KEM. বাস্তব RSA private operation-এ সাধারণত Chinese Remainder Theorem ব্যবহার হয়, আর d হিসাবে phi-এর বদলে λ(n) নেওয়া হয়। RFC 7748-এর X25519-এ কিছু অন্য পক্ষের মান সব-শূন্য ফল দিতে পারে, তাই প্রোটোকলগুলো সেই ফল পরীক্ষা করে।

পরীক্ষা ও ইন্টারভিউতে:

  • Symmetric আর asymmetric-এর পার্থক্য? প্রথমটিতে এক key আর দ্রুত, দ্বিতীয়টিতে key-জোড়া আর ধীর। বাস্তবে দুটি একসাথে hybrid আকারে চলে।
  • RSA-তে encrypt আর sign কোন key দিয়ে? Encrypt প্রাপকের public key, sign নিজের private key. এখানে padding দুটির জন্য আলাদা।
  • DH কেন MITM-এ দুর্বল? এতে পরিচয় যাচাই নেই। Signature বা certificate লাগে।
  • Forward secrecy কীভাবে আসে? Session-প্রতি ephemeral key exchange থেকে, আর সেই key মুছে ফেলা থেকে।
  • AES-128-এর সমতুল্য RSA? NIST SP 800-57 অনুযায়ী প্রায় RSA-3072, আর elliptic curve-এ ২৫৬ bit.

১০ · AI-এর যুগে public key-এর কাজ

AI খুব দ্রুত RSA বা SSH-এর কোড ও কমান্ড লিখে দেয়। কিন্তু cryptography-র কোড “চলছে” দেখে নিরাপদ বলা যায় না। ভুল padding-এর কোডও পুরোপুরি চলে। তাই AI-কে সহকারী হিসেবে রাখুন, আর সিদ্ধান্ত নিন নিজে।

AI-এর সাধারণ ভুলকেন বিপজ্জনকযাচাই
RSA-1024 বা padding ছাড়া RSAদুর্বল key, textbook RSA-এর সব সমস্যাSP 800-57 আর RFC 8017 দেখা
PKCS #1 v1.5 দিয়ে নতুন encryptionপুরোনো padding-এর ঝুঁকিOAEP বা hybrid নকশা চাওয়া
Key বানাতে Math.random()Key অনুমানযোগ্য হতে পারেOS CSPRNG আছে কি না দেখা
সই ছাড়া DHMITM-এর দরজা খোলাকে কাকে প্রমাণ করছে, লিখে ফেলা
Error সারাতে verify=False বা StrictHostKeyChecking noAuthentication চলে যায়আসল কারণ ঠিক করা, যাচাই বন্ধ নয়
বানানো RFC নম্বর বা CVEভুল প্রমাণের ওপর সিদ্ধান্তrfc-editor.org আর NIST-এর মূল পাতা পড়া

নকশা পর্যালোচনায় AI-কে কাজে লাগানোর একটি নিরাপদ প্রশ্ন নিচে। এখানে কোনো আসল key, secret বা ব্যক্তিগত তথ্য নেই।

আমার নিজের অ্যাপের নকশা পর্যালোচনা করো। বাস্তব key বা secret আমি দিচ্ছি না। নকশা: [এখানে নিজের নকশা লিখুন: কে কাকে কী পাঠায়, কোন algorithm, key কোথায় থাকে] ১. প্রতিটি public key কাজের উদ্দেশ্য কী: key exchange, encryption, না signature? ২. Padding, key size আর random উৎস ঠিক আছে কি না বলো। NIST SP 800-57 বা নির্দিষ্ট RFC-র যে অংশে ভিত্তি করছ, তার নাম দাও। নিশ্চিত না হলে লিখো "নিশ্চিত নই"। ৩. Forward secrecy আছে কি না, আর কে কার পরিচয় প্রমাণ করছে তা ব্যাখ্যা করো। ৪. একটি key ফাঁস হলে কী কী প্রভাবিত হবে, আর সাড়া কেমন হবে, সেটি বলো। ৫. নিজে থেকে কোনো cryptographic algorithm বানিও না। পরিচিত library আর পরীক্ষিত প্রোটোকলের নাম বলো।

AI-এর পরামর্শ হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Public key cryptography কি সত্যিই ১৯৭৬ সালে জন্ম নিয়েছিল? গোপন গবেষণা আর প্রকাশ্য গবেষণার ফলে কী পার্থক্য হলো?

প্রকাশ্য ইতিহাসে জন্ম ১৯৭৬ সালেই। কিন্তু ১৯৯৭ সালে ব্রিটেনের গোয়েন্দা সংস্থা GCHQ জানায়, তাদের কর্মীরা আগেই একই ধারণায় পৌঁছেছিলেন। প্রকাশিত বিবরণ অনুযায়ী James Ellis ১৯৭০ সালের দিকে “non-secret encryption”-এর চিন্তা দেন। Clifford Cocks ১৯৭৩ সালে RSA-র প্রায় সমান একটি পদ্ধতি লেখেন। Malcolm Williamson-ও পরে Diffie-Hellman-এর মতো ধারণায় পৌঁছান। সব কাজ গোপন রাখা হয়েছিল।

একই সময়ে আমেরিকায় স্বাধীনভাবে এই পথ তৈরি হচ্ছিল। Ralph Merkle ছাত্র অবস্থায় puzzle-ভিত্তিক একটি key exchange ভেবেছিলেন, যা ধীর হলেও ধারণাটি প্রমাণ করে। Diffie আর Hellman ১৯৭৬ সালে প্রকাশ করেন। Hellman পরে এই পদ্ধতিকে Diffie-Hellman-Merkle বলার পক্ষে কথা বলেন। Martin Gardner ১৯৭৭ সালে Scientific American-এ RSA নিয়ে লেখেন, আর মূল প্রবন্ধ বের হয় ১৯৭৮ সালে।

পার্থক্যটি বিশাল। গোপন আবিষ্কার গণিত হিসেবে সঠিক ছিল, কিন্তু কোনো বাণিজ্যিক ব্যবস্থায় পৌঁছায়নি। প্রকাশ্য প্রবন্ধের ওপর গবেষকেরা আক্রমণ খুঁজেছেন, দুর্বলতা পেয়েছেন, padding নকশা করেছেন, standard লিখেছেন। আজকের নিরাপদ RSA-OAEP এই খোলা সমালোচনার ফল। এই শিক্ষা Kerckhoffs-এর নীতির সাথেই মেলে। পদ্ধতি প্রকাশ্য হলে তা বেশি মানুষের যাচাই পায়, আর শুধু key গোপন থাকে। গোপনীয়তা জাতীয় নিরাপত্তায় কখনো যুক্তিসঙ্গত হতে পারে, কিন্তু সাধারণ মানুষের ব্যাংকিং আর বার্তা রক্ষা করে সেই পদ্ধতিই, যা সবার সামনে পরীক্ষিত।

মূল উপলব্ধি: Cryptography-তে একটি ধারণার মূল্য তখনই পূর্ণ হয়, যখন সেটি খোলা পর্যালোচনা, standard আর ভালো বাস্তবায়নের মধ্য দিয়ে যায়।

প্র ০২TLS 1.3 কেন RSA key exchange পুরোপুরি বাদ দিল, যখন RSA নিজে ভাঙেনি?

TLS-এর পুরোনো সংস্করণে একটি সাধারণ পদ্ধতি ছিল। Client একটি গোপন মান বানিয়ে server-এর দীর্ঘমেয়াদি RSA public key দিয়ে encrypt করে পাঠাত। এতে দুটি বড় সমস্যা ছিল, আর কোনোটিই RSA-র গণিত ভাঙার সমস্যা নয়।

প্রথমটি বাস্তবায়নের। ১৯৯৮ সালে Bleichenbacher দেখান, PKCS #1 v1.5 padding সঠিক কি না, এই একটি উত্তর জানলেই ciphertext-এর তথ্য ক্রমে বেরিয়ে আসে। TLS পরে এই ফাঁক বন্ধের নিয়ম লেখে, কিন্তু সমস্যাটি বারবার ফিরেছে। ২০১৭ সালে ROBOT গবেষণা (Böck, Somorovsky আর Young) জানায়, প্রায় দুই দশক পরেও বহু server আর পণ্যে এই ধরনের আচরণ পাওয়া গেছে। সূক্ষ্ম timing পার্থক্যও এই তথ্য ফাঁস করতে পারে। রক্ষার জন্য কোডে যত সতর্কতা লাগে, তা বাস্তবে বারবার ভুল হয়েছে।

দ্বিতীয়টি নকশার। Static RSA-তে forward secrecy নেই। Server-এর একটি key ফাঁস হলে আগে রেকর্ড করা সব session পড়ার ঝুঁকি থাকে। ২০১৩ সালের পর ব্যাপক নজরদারি নিয়ে প্রকাশিত তথ্য আর ২০১৪ সালের Heartbleed-এর পর এই ঝুঁকি আলোচনার কেন্দ্রে আসে। Heartbleed-এ server-এর memory থেকে private key ফাঁসের সম্ভাবনা দেখা দিয়েছিল, তাই অনেক প্রতিষ্ঠানকে key বদলাতে হয়।

RFC 8446 (২০১৮) তাই সরলীকরণের পথ নেয়। Key exchange-এর জন্য (EC)DHE, পরিচয়ের জন্য সই। পুরোনো পথ রাখলে downgrade-এর সুযোগও থাকত। RSA এখনো certificate আর signature-এ আছে, তবে handshake-এর সইয়ে শুধু RSA-PSS চলে। ফলে কাজ দুটি আলাদা হয়ে গেছে।

মূল উপলব্ধি: নিরাপদ নকশা মানে শুধু ভালো algorithm নয়, ভুল করার সুযোগ কমানো। যে option ঝুঁকিপূর্ণ, standard থেকে সেটি সরিয়ে দেওয়াই অনেক সময় সবচেয়ে ভালো নিরাপত্তা-উন্নতি।

প্র ০৩Logjam থেকে কী শেখা গেল — সবার একই DH group ব্যবহার করা আর দুর্বল export-সীমা কেন ঝুঁকি বাড়ায়?

২০১৫ সালে একদল গবেষক Logjam গবেষণা প্রকাশ করেন (Adrian ও সহকর্মীরা, “Imperfect Forward Secrecy”). তাঁরা দেখান, ১৯৯০-এর দশকের export নিয়মের কারণে যে ৫১২-bit DH রয়ে গিয়েছিল, পুরোনো server-এ সেটি তখনও চালু ছিল। Protocol-এর দুর্বলতায় কিছু সংযোগ নিচু মানে নামানো সম্ভব ছিল।

গভীর শিক্ষাটি অন্য জায়গায়। Discrete logarithm-এর সেরা পদ্ধতিতে বড় একটি প্রাথমিক হিসাবের অংশ শুধু group-এর ওপর নির্ভর করে, প্রতিটি নির্দিষ্ট key-এর ওপর নয়। তাই বহু server যদি একই কয়েকটি prime ব্যবহার করে, একবারের বিনিয়োগ অনেকের ওপর কাজে লাগে। গবেষণাপত্রটি বলেছিল, অনেক server একই অল্প কয়টি group ব্যবহার করছে, আর ১০২৪-bit group-ও সম্ভবত খুব বড় সম্পদের অধিকারীর নাগালে আসতে পারে। Ephemeral key থাকলেও group দুর্বল হলে forward secrecy-র প্রতিশ্রুতি দুর্বল হয়ে যায়।

এখান থেকে রক্ষকের করণীয় পরিষ্কার। Export-grade cipher পুরোপুরি বন্ধ করা। Classic DH রাখলে কমপক্ষে ২০৪৮-bit মানের group, যেমন RFC 7919-এর মানসম্মত group. আরও ভালো হলো elliptic curve key exchange-এ যাওয়া। আর নিয়মিত configuration audit করা, যাতে পুরোনো option নীরবে চালু না থাকে। পরে পর্ব ৩২-এ দেখবেন, এমন ঝুঁকি vulnerability management-এর আওতায় পড়ে।

“ভাগ করা” মানে সব সময় খারাপ নয়। মানসম্মত group ভালোভাবে পর্যালোচিত থাকে, আর নিজের বানানো group-এ অন্য ভুলের ঝুঁকি থাকে। তাই সমাধান হলো যথেষ্ট বড় মানসম্মত group, ছোট শেয়ার করা group নয়। রাষ্ট্রীয় নীতিও এখানে শিক্ষা দেয়। ইচ্ছাকৃতভাবে দুর্বল রাখা cryptography বহু বছর পর সবার ঝুঁকি হয়ে ফিরে আসে।

মূল উপলব্ধি: নিরাপত্তার হিসাবে শুধু একজন লক্ষ্যবস্তুর খরচ নয়, পুরো ecosystem-এর ওপর হামলাকারীর লাভও ধরতে হয়। আর পুরোনো option না সরালে সেটি একদিন ফিরে আসে।

প্র ০৪গণিত নিখুঁত হলেও key কেন দুর্বল হতে পারে? Random মানের ব্যর্থতার পর প্রতিষ্ঠান কী করবে?

RSA বা Ed25519 ধরে নেয়, গোপন মানগুলো বিশাল সম্ভাবনার মধ্যে সমানভাবে অনিশ্চিত। এই শর্ত ভাঙলে গণিতের কোনো দোষ না থাকলেও নিরাপত্তা চলে যায়।

  • Debian, ২০০৮ (CVE-2008-0166): Debian-এর OpenSSL প্যাকেজে একটি পরিবর্তনের ফলে random seed প্রায় অকার্যকর হয়ে পড়ে। প্রায় দুই বছরে তৈরি SSH আর TLS key-এর সম্ভাবনা খুব সীমিত হয়ে যায়। Network course-এ এই ঘটনার আলোচনা আছে।
  • “Mining Your Ps and Qs”, ২০১২: Heninger ও সহকর্মীরা ইন্টারনেট-ব্যাপী public key জরিপে বহু দুর্বল key পান, বিশেষ করে embedded device-এ। প্রথম boot-এর সময় device-এ entropy কম থাকায় একই বা সম্পর্কিত key তৈরি হচ্ছিল। প্রায় একই সময়ে Lenstra ও সহকর্মীরাও একই রকম ফল প্রকাশ করেন।
  • ROCA, ২০১৭ (CVE-2017-15361): একটি ব্যাপকভাবে ব্যবহৃত security chip-এর library-তে RSA prime বানানোর পদ্ধতিতে কাঠামোগত দুর্বলতা পাওয়া যায়। প্রভাব পড়ে smart card আর জাতীয় পরিচয়পত্রের মতো ব্যবস্থায়। Hardware-এ key থাকলেই নিরাপদ, এই ধারণা এখানে ভেঙে যায়।

রক্ষকের দৃষ্টিতে শিক্ষা কয়েকটি। Key inventory থাকলে তবেই জানা যায় কোন key কোথায়, কখন, কোন tool দিয়ে বানানো। Vulnerability ঘোষিত হলে patch যথেষ্ট নয়, কারণ দুর্বল key থেকেই যায়। তাই key বদলাতে হয়, আর certificate হলে বাতিলও করতে হয়। Embedded device-এ প্রথম boot-এর আগে যথেষ্ট entropy নিশ্চিত করা দরকার। Key বানানোর tool-এর version লগে রাখা পরের তদন্তে সাহায্য করে।

একটি সতর্কতা হলো, এই ঘটনাগুলো থেকে “hardware খারাপ” বা “open source খারাপ”, কোনো সিদ্ধান্তই আসে না। প্রকাশ্য জরিপ আর গবেষণাই এগুলো ধরেছে।

মূল উপলব্ধি: Key শুধু একটি ফাইল নয়। তার জন্ম, ব্যবহার আর মৃত্যুর পুরো হিসাব থাকলেই বিপদের দিনে দ্রুত সাড়া দেওয়া যায়।

প্র ০৫Ed25519 কেন ভুল-সহনশীল নকশা বলে পরিচিত? শুধু গাণিতিক শক্তিই কি একটি algorithm বেছে নেওয়ার কারণ?

ECDSA-র মতো অনেক signature scheme প্রতিটি সইয়ে একটি গোপন nonce চায়। এই nonce পুনরাবৃত্তি হলে বা অনুমানযোগ্য হলে private key-ই ঝুঁকিতে পড়ে। এটি শুধু তত্ত্ব নয়। ২০১০ সালে একটি গেম কনসোলের সই ব্যবস্থায় nonce পুনঃব্যবহারের ত্রুটি প্রকাশ্যে আসে। ২০১৩ সালে Android-এর একটি random-সংক্রান্ত সমস্যার কারণে কিছু Bitcoin wallet ঝুঁকিতে পড়ে বলে জানা যায়। দুই ক্ষেত্রেই ব্যর্থতা এসেছিল ব্যবহারের ভুল থেকে, curve-এর গণিত থেকে নয়।

Daniel J. Bernstein ও সহকর্মীদের Curve25519 আর Ed25519 নকশার একটি লক্ষ্য ছিল ঠিক এই ধরনের ভুল কমানো। Ed25519 nonce বের করে private key থেকে পাওয়া মান আর বার্তার hash থেকে (RFC 8032). তাই প্রতি সইয়ের সময় ভালো random উৎসের ওপর নির্ভর করতে হয় না। Curve-এর গঠন constant-time বাস্তবায়নকে সহজ করে, ফলে timing দিয়ে তথ্য ফাঁসের ঝুঁকি কমে। Key আর সই ছোট, হিসাব দ্রুত।

কিছু trade-off-ও আছে। Deterministic signature-এ বিশেষ পরিবেশে fault attack নিয়ে গবেষণা হয়েছে, তাই hardware-এর ক্ষেত্রে আলাদা বিবেচনা লাগে। নিয়ন্ত্রিত পরিবেশে সংস্থার অনুমোদিত তালিকার প্রশ্ন আসে। NIST FIPS 186-5 (২০২৩) EdDSA-কে অন্তর্ভুক্ত করেছে, যদিও প্রতিটি পণ্যের অনুমোদন আলাদাভাবে দেখতে হয়। আবার ২০১৩ সালের Dual_EC_DRBG বিতর্কের পর “প্যারামিটার কীভাবে বাছা হলো” প্রশ্নটিও গুরুত্ব পায়। স্বচ্ছভাবে বাছা প্যারামিটার আস্থা বাড়ায়।

তবে quantum-এর ঝুঁকিতে Ed25519-ও পড়ে, তাই দীর্ঘমেয়াদি পরিকল্পনায় crypto agility দরকার। অর্থাৎ algorithm বদলানো যায় এমন নকশা রাখতে হবে।

মূল উপলব্ধি: ভালো algorithm শুধু শক্তিশালী নয়, সেটি ঠিকভাবে ব্যবহার করা সহজ, আর ভুলভাবে ব্যবহার করা কঠিন। রক্ষকের কাছে এই গুণটি key size-এর মতোই গুরুত্বপূর্ণ।

অনুশীলন

খাতা-কলমে হিসাব করুন, তারপর উত্তর মিলিয়ে দেখুন।

  1. হাতে Diffie-Hellman: p = 29, g = 2, a = 7, b = 10 ধরে A, B আর দুই দিকের shared secret বের করুন।

    A = 27 mod 29 = 128 mod 29 = 12, কারণ 29 × 4 = 116.

    B = 210 mod 29 = 1024 mod 29 = 9, কারণ 29 × 35 = 1015.

    রিমার দিক: 97 mod 29. 92 = 81, যার mod 29 হলো 23. 94 হলো 232 = 529, যার mod 29 হলো 7. 96 হলো 7 × 23 = 161, যার mod 29 হলো 16. 97 হলো 16 × 9 = 144, যার mod 29 হলো 28.

    সজীবের দিক: 122 = 144, যার mod 29 হলো 28, অর্থাৎ −1. তাই 1210 = (−1)5 = −1, যা mod 29-এ 28. দুই দিকের ফল মিলেছে।

  2. আউটপুট অনুমান করুন: চালানোর আগে নিচের কোডের তিনটি লাইনের আউটপুট লিখুন।
    n, e, d = 2773, 17, 157
    c1 = pow(100, e, n)
    c2 = pow(100, e, n)
    print(c1 == c2)
    print(pow(c1, d, n))
    print(pow(3000, e, n) == pow(227, e, n))
    True
    100
    True

    প্রথম লাইন True, কারণ textbook RSA-তে random কিছু নেই। দ্বিতীয় লাইনে decrypt করে 100 ফিরে আসে। তৃতীয়টিও True, কারণ 3000 mod 2773 = 227. অর্থাৎ m যদি n-এর চেয়ে বড় হয়, তবে আলাদা বার্তা একই হয়ে যায়। Modulus-এর চেয়ে ছোট বার্তাই শুধু ফেরত পাওয়া যায়, এজন্যই hybrid নকশা দরকার হয়।

  3. নকশা সমালোচনা: একটি কাল্পনিক অনলাইন বাজারের অ্যাপে এই নকশা দেখা গেল। সব গ্রাহকের ডেটা একই AES key দিয়ে encrypt হয়। সেই key server-এর RSA-1024 দিয়ে, কোনো padding ছাড়া পাঠানো হয়। RSA private key কোড repository-তে আছে। অন্য একটি অংশে সই ছাড়া DH ব্যবহার হয়। কমপক্ষে পাঁচটি সমস্যা বলুন, আর প্রতিটির উন্নত বিকল্প দিন।
    • একই AES key সবার জন্য: একটি ফাঁসেই সবার ডেটা খোলে। Session-প্রতি বা প্রতি রেকর্ডে আলাদা key, KMS-এ key hierarchy.
    • RSA-1024: মাত্র প্রায় ৮০ bit strength. বদলে X25519, বা অন্তত RSA-3072.
    • Padding নেই: Textbook RSA. বদলে OAEP, আরও ভালো হলো hybrid প্রোটোকল।
    • Private key repository-তে: Repository পাওয়া সবাই key পান। Key তুলে ফেলা, নতুন key বানানো, secret manager বা HSM ব্যবহার, আর ইতিহাসে থাকা key-কে ফাঁস ধরে নেওয়া।
    • সই ছাড়া DH: MITM ঝুঁকি। Certificate-সহ TLS 1.3-এর মতো পরীক্ষিত প্রোটোকল।
    • Forward secrecy নেই: Static key ফাঁস হলে পুরোনো রেকর্ড খুলে যায়। Ephemeral key exchange.

    সবচেয়ে ভালো সরল সমাধান হলো নিজে কিছু না জোড়া দিয়ে TLS 1.3 আর পরীক্ষিত library ব্যবহার করা।

  4. নিজের SSH key পরীক্ষা: নিজের কম্পিউটারে ~/.ssh ফোল্ডারের .pub ফাইলগুলোর fingerprint আর key ধরন দেখুন। প্রতিটি কোথায় ব্যবহার হয়, লিখে ফেলুন। পুরোনো ধরন বা অব্যবহৃত key থাকলে কী করবেন?
    # Public key files only. Run this on your own computer.
    for f in ~/.ssh/*.pub; do ssh-keygen -lf "$f"; done

    প্রতিটি লাইনের শুরুতে আকার আর শেষে ধরন দেখবেন, যেমন 256 ... (ED25519). RSA key ৩০৭২ bit-এর কম হলে, DSA হলে, বা ব্যবহার মনে না পড়লে key বদলানোর পরিকল্পনা করুন। আগে নতুন key যোগ করে login পরীক্ষা করুন, তারপর server-এর authorized_keys থেকে পুরোনো লাইন সরান। মনে রাখবেন, private key-এর ভেতরের লেখা কখনো কাউকে দেখাবেন না, আর এই কাজের জন্য তা খুলতেও হয় না।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমRSA-OAEP আর AES-GCM দিয়ে একটি ফাইল পাঠানোর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. প্রেরক একটি নতুন random session key আর nonce বানান
  2. Session key দিয়ে AEAD mode-এ ফাইল encrypt হয়
  3. প্রাপকের public key দিয়ে session key মোড়ানো হয়
  4. মোড়ানো key, nonce আর ciphertext পাঠানো হয়
  5. প্রাপক private key দিয়ে session key খুলে tag যাচাই করে ফাইল পান

Diffie-Hellman-এ p = 29, g = 2 আর গোপন মান a = 5. প্রকাশ্য মান A = ga mod p কত?

  • 10
  • 3
  • 32
  • 25

খেলনা RSA-তে p = 5, q = 11, e = 3. Private exponent d কত, যেখানে e × d-এর phi = (p−1)(q−1) ভাগশেষ 1?

  • 3
  • 7
  • 55
  • 27

সজীব একটি নথিতে digital signature দিতে চান, যা সবাই যাচাই করতে পারবেন। কোন key কে ব্যবহার করবেন?

  • সজীব নিজের private key দিয়ে সই করবেন, অন্যরা তাঁর public key দিয়ে যাচাই করবেন
  • সজীব নিজের public key দিয়ে সই করবেন, অন্যরা তাঁর private key দিয়ে যাচাই করবেন
  • সজীব প্রাপকের public key দিয়ে সই করবেন
  • দুজনের shared AES key দিয়ে সই হবে

একটি server-এর দীর্ঘমেয়াদি private key ফাঁস হলো, আর হামলাকারীর কাছে পুরোনো encrypted রেকর্ড আছে। কোন নকশায় পুরোনো session সবচেয়ে ভালোভাবে সুরক্ষিত থাকে?

  • Session key সার্ভারের দীর্ঘমেয়াদি RSA key দিয়ে মোড়ানো
  • RSA-4096 দিয়ে session key মোড়ানো
  • প্রতিটি session-এ ephemeral X25519, আর দীর্ঘমেয়াদি key শুধু সই করে
  • সব session-এ একই নির্দিষ্ট AES key

NIST SP 800-57 Part 1 Rev. 5-এর সমতুল্য তালিকা অনুযায়ী প্রায় ১২৮ bit security strength কোন জোড়ায় পাওয়া যায়?

  • RSA-1024 আর ১২৮-bit elliptic curve
  • RSA-3072 আর ২৫৬-bit elliptic curve
  • RSA-2048 আর ৫২১-bit elliptic curve
  • RSA-15360 আর ১৬০-bit elliptic curve

দুটি পক্ষ সই বা certificate ছাড়া Diffie-Hellman চালাচ্ছে। সবচেয়ে বড় ঝুঁকি কোনটি, আর তার প্রধান প্রতিকার কী?

  • পথের দর্শক A আর B দেখলেই shared secret পান, প্রতিকার A আর B গোপন রাখা
  • Hash চুরি হয়, প্রতিকার AES-256
  • Man-in-the-middle, প্রতিকার key exchange-এর মানে সই আর certificate দিয়ে পরিচয় যাচাই
  • Key খুব ছোট, প্রতিকার শুধু p বড় করা

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Public key cryptography key distribution সমস্যার সমাধান দেয়। কাজ তিনটি: key exchange, encryption আর signature.
  2. Diffie-Hellman একই গোপন মান দেয়, কিন্তু পরিচয় দেয় না। সই ছাড়া এটি MITM-এর সামনে খোলা।
  3. RSA সব সময় OAEP বা PSS-সহ, আর পরীক্ষিত library থেকে। Textbook RSA শুধু শেখার জন্য।
  4. Key size বোঝার ভাষা security strength: RSA-3072 ও ২৫৬-bit curve প্রায় ১২৮ bit. X25519 আর Ed25519 ছোট আর দ্রুত।
  5. বাস্তব ব্যবস্থা hybrid, আর ephemeral key দেয় forward secrecy. Private key-এর জন্ম ভালো random থেকে, আর জীবন সুরক্ষিত জায়গায়।

পরের পর্বে: রিমা কীভাবে জানবেন এই public key সত্যিই সজীবের? পর্ব ১১-এ দেখবেন digital signature, certificate, CA আর বিশ্বাসের শিকল।

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

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান