Cryptography, Public and Private Key Encryption, Digital Signature

image source: Max Pixel

ক্রিপ্টোগ্রাফির প্রতি সব সময়েই আগ্রহ ছিল। বিশেষ করে public key, private key জিনিসগুলো কিভাবে কাজ করে জানার ইচ্ছা ছিল। এই সুন্দর বইটি পড়ে কিছু কিছু বুঝতে পেরেছি। তাই যতটুকু বুঝলাম শেয়ার করার চেষ্টা করলাম।

ক্রিপ্টোগ্রাফি কী?

আমরা অনেকেই কিন্তু ছোটবেলায় ক্রিপ্টোগ্রাফার ছিলাম। ছোটবেলায় কি কাউকে এমন চিঠি লিখেছেন?

J mpwf zpv Tplijob! Upnbsf ob qbjmf lpdiv hbtf gbtij mbjhb npjsb kbnv. Lptpn

এরকম না হলেও কাছাকাছি নিশ্চয় লিখেছেন ;)

আচ্ছা! যারা লিখেন নি তাদের জন্য। এখানে প্রতি লেটারের জন্য পরের লেটার নেয়া হয়েছে। প্রতি লেটারের সাথে এক যোগ করা হয়েছে বলা যায়। এটা থেকে আসল টেক্সট পেতে হলে প্রতি লেটারের জন্য আগের লেটার নিতে হবে। অর্থাৎ এক বিয়োগ করতে হবে। এইভাবে যে কোন মেসেজ encrypt করা সম্ভব। এখন ১ যোগ না করে ১ থেকে ২৫ এর মধ্যে যেকোন সংখ্যা যোগ করা যেত। যোগ করে যদি ২৬ এর বেশি হয়ে যায় তাহলে ২৬ এর ভাগশেষ বা মড(modulus) নিতে হবে। তাহলে Z এর পরে আবার A থেকে শুরু হবে।

এখনে আমরা যে সংখ্যাটি যোগ করছি সেটিকে বলা হয় ‍ key বা চাবি। যদি key জানা থাকে তাহলে আমরা ‘সাইফার টেক্সট(cipher text)’ ডিক্রিপ্ট করে প্লেইন টেক্সট(plain text)পেতে পারি।

এই এনক্রিপশনের পদ্ধতি সিজার সাইফার (Caesar cipher) হিসেবে পরিচিত। এটা খুবই দুর্বল। কেননা সম্ভাব্য কি সংখ্যা মাত্র ২৫। কেন? কারণ যদি key হিসেবে ২৬ নেই তাহলে ২৬ যোগ করে মড ২৬ নিলে একই লেটার আসবে। তাহলে দেখা যাচ্ছে ২৬ নেয়া আর ০ নেয়ে একই কথা। আবার ২৭ নেয়া আর ১ নেয়া একই কথা। যে key ই ব্যবহার করি না কেন, ২৫ টি key ট্রাই করেই ডিক্রিপ্ট করে ফেলা যাবে। সিজার সাইফার থেকে শক্তিশালী অনেক সাইফার আছে যেগুলোতে সম্ভাব্য কি সংখ্যা অনেক বেশি হয়। অনেকগুলোতে এমন বেশি হয় যে কম্পিউটারেও একটা একটা key ট্রাই করে এনক্রিপশন ভাঙ্গা যায় না। সেগুলোতে ‘যোগ করে মড’ সিম্পল ফর্মুলা না ব্যবহার করে ভিন্ন ফর্মুলা ব্যবহার করা হয়। সেগুলোরও নিজস্ব দুর্বলতা আছে। কিছু ভাঙ্গা যায় আবার কিছু ভাঙ্গা মোটামুটি অসম্ভব। বিস্তারিত জানতে হলে বইটি পড়ে ফেলতে হবে।

পাবলিক কী এনক্রিপশন (Public Key Encryption)

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

Public key এনক্রিপশনে একটি key এর বদলে এক জোড়া key থাকে। একটা পাবলিক(public) আরেকটা প্রাইভেট(private)। এগু‌লোর বৈশিষ্ট্য এমন যে একটা দিয়ে এনক্রিপ্ট করলে কেবলমাত্র অন্যটা দিয়ে ডিক্রিপ্ট করা যায়। তাহলে প্রবলেম solved. কারো সাথে যোগাযোগ করতে চাইলে তাকে আপনার পাবলিক key পাঠিয়ে দিন। সেটা হ্যাকারের কাছে গেলে যাক, কোন সমস্যা নেই। সে আপনার পাবলিক key দিয়ে এনক্রিপ্ট করে আপনাকে মেসেজ পাঠাবে। সেই মেসেজ কেবলমাত্র আপনার প্রাইভেট key দিয়েই ডিক্রিপ্ট করা যাবে, যেটি শুধু আপনার কাছেই আছে। তাহলে সেই মেসেজ আপনি ছাড়া কেউ ডিক্রিপ্ট করতে পারবে না।

যেভাবে কাজ করে

পাবলিক কী এনক্রিপশনের জন্য বিভিন্ন রকম এলগরিদম আছে। তার মধ্যে RSA অন্যতম। RSA কিভাবে কাজ করে একটু লেখার চেষ্টা করব।

প্রথম স্টেপে এক জোড়া key জেনারেট করতে হবে। এজন্য প্রথমে দুটি বড় random prime number p ও q নেয়া হয়। কত বড় ? একশত ডিজিটের উপরে। অবাক হওয়ার কিছু নেই। মিলার র‍্যাবিন এ্যালগরিদম ব্যাবহার করে এমন বড় প্রাইম নাম্বার জেনারেট করা যায়। তারপর তাদের গুণ করে গুণফল n বের করা হয়। এখন আরেকটি বড় এবং র‍্যান্ডম নাম্বার e জেনারেট করা হয় যেটি (p-1)*(q-1) এর সাথে কো প্রাইম। তারপরে e এর মডিউলার ইনভার্স d বের করা হয়।

এখন n ও e মিলিতভাবে পাবলিক কি হিসেবে কাজ করে আর n ও d প্রাইভেট কি হিসেবে কাজ করে।

Key জেনারেট করা হল। এবার এনক্রিপ্ট করতে হবে। এখন বলে রাখা ভাল যে এখানে ক্যারেক্টার বাই ক্যারেক্টার এনক্রিপ্ট করা হয় না। বরং প্লেইন টেক্সকে প্রথমে ইন্টিজার ব্লকে পরিণত করা হয়। অর্থাৎ টেক্সটকে বড় বড় ইন্টিজারে এনকোড করা হয়। যেমন “Hello World!” হয়ে যায় 1033441003260674863333142663। এভাবে পুরো মেসেজকে কিছু সংখ্যক বড় ইন্টিজারে পরিণত করা যায়। এই প্রসেসে কোন key ব্যবহার করা হয় না। তার মানে ইন্টিজারগুলো ডিকোড করে আবার সহজেই কোন key ছাড়াই আসল মেসেজ পাওয়া যাবে। প্রসেসটি বিস্তারিত লিখলাম না। তবে ব্যাপারটা তেমন জটিল না।

তারপর সেই ইন্টিজারগুলোকে এনক্রিপ্ট করা হয়। এনক্রিপ্ট করার ফর্মুলা হল:

ciphertext = (plaintext ^ e) mod n

এই ফর্মুলা ব্যবহার করে প্রতিটি plaintext ইন্টিজারের জন্য এনক্রিপ্টেড ciphertext ইন্টিজার পাওয়া যাবে। এই ইন্টিজারগুলোই এনক্রিপ্টেড মেসেজ। এখন এই ciphertext থেকে আবার আগের ইন্টিজারগুলো পেতে এই ফর্মুলা ব্যবহার করতে হবে:

plaintext = (ciphertext ^ d) mod n

এখন এই ইন্টিজারগুলো ডিকোড করে আসল মেসেজ পাওয়া যাবে।

এখন এই দুটি ফর্মুলা কেন কাজ সেটা কিন্তু আমাকে জিজ্ঞেস করে লাভ নেই। কারন আমি নিজেও বুঝি না। জস্ট মনে করুন নাম্বার থিওরির ম্যাজিক।

একটি মজার ব্যাপার হল নব্বই এর দশকের প্রথম দিকে আমেরিকাতে স্ট্রং ক্রিপ্টোগ্রফি মিসাইল-ট্যাংকের মতই মিলিটারি ইকুইপমেন্ট হিসেবে দেখা হত। এই আর্টিকেল নিয়ে যদি কেউ টাইম ট্রাভেল করে ঐ সময়ের আমেরিকাতে যান তাহলে কিন্তু জেলে যাওয়ার ভাল সম্ভাবনা আছে। সাবধান করে দিলাম। ‌

ডিজিটাল সিগনেচার

মনে করুন আপনি কাউকে একটি ডকুমেন্ট পাঠাবেন। কিভাবে নিশ্চিত করবেন সেটি প্রাপকের কাছে যাওয়ার মাঝ পথে কেউ চেন্জ করে দেয়নি? প্রথমে ডকুমেন্টটির হ্যাশ জেনারেট করবেন। তারপর সেই হ্যাশ আপনার প্রাইভেট কি দিয়ে এনক্রিপ্ট করে ডকুমেন্টের সাথে এটাচ করে দেবেন। এখন সেই ডকুমেন্ট যে যেখানেই পাক, যাচাই করতে পারবে সেটি সিগনেচারের পর চেন্জ হয়েছে কিনা বা সিগনেচার জেনুইন কিনা।

কিভাবে? সে আপনার পাবলিক কি দিয়ে এনক্রিপ্টেড হ্যাশ ডিক্রিপ্ট করবে। তারপর ডকুমেন্টের হ্যাশ জেনারেট করে মিলিয়ে দেখবে। যদি মিলে যায় তাহলে সব ঠিক। যদি না মিলে তাহলে দুইটা ব্যাপার হতে পারে। হয় ফাইলটি সিগনেচারের পরে কেউ চেন্জ করেছে নয়ত হ্যাশটি অন্য কারো প্রাইভেট কি দিয়ে এনক্রিপ্ট করা হয়েছে, অর্থাৎ সিগনেচার জেনুইন নয়।

আমরা যখন ইন্টারনেট ব্যবহার করি তখন এই ব্যাপারগুলো কিন্তু প্রতি মুহূর্তেই ঘটে চলে। যদিও আমাদের এসব নিয়ে মাথা ঘামাতে হয় না। ব্যাপারগুলো আরো জানতে কিংবা পাইথন দিয়ে জিনিসগুলো ইমপ্লিমেন্ট করতে চাইলে বইটি পড়ে ফেলতে হবে।

লেখাটি বেশ আগের। আজকে আবার নজরে পড়াতে একটু ঘষামাজা করে মিডিয়ামে দিলাম। ভুল ত্রুটি থাকলে দয়া করে ধরিয়ে দেবেন। ধন্যবাদ।

--

--