Saturday, March 12, 2016

বাংলাদেশ ব্যাংকের টাকা চুরি - গোপন কথা কেন রয়না গোপন

বাংলাদেশ ব্যাংকের টাকা হ্যাকাররা চুরি করার পর বাংলাদেশের পত্র পত্রিকায় বিভিন্নভাবে ব্যাপরটা ব্যাখ্যা করা হয়েছে। কিছু কিছু পত্রিকায় কিছু লেখা পড়ার পর মনে হল টেকনিক্যাল ব্যাপারটা যেভাবে ব্যাখ্যা করা হচ্ছে সেটার মাঝে সমস্যা আছে। সুইফট হল একটা প্রতিষ্ঠান (Society) যেটার পুরো নাম Society for Worldwide Interbank Financial Telecommunication সংক্ষেপে SWIFT. এদের নেটওয়ার্কের মাধ্যমে টাকা এক ব্যাংক থেকে আকের ব্যাংকে স্থানান্তর হয়ে থাকে। এই স্থানান্তরের ব্যাপারটা সম্পন্ন হয় একটা নিরাপদ নেটওয়ার্কের মাধ্যমে। এই নেটওয়ার্কের আওতায় থাকা প্রত্যেকটা ব্যাংকের একটা পরিচিতি নম্বর থাকে যটাকে বলা হয় সুইফট কোড। নাম কোড হলেও এটা একটা পরিচিতি নম্বর। যেমন বাংলাদেম ব্যাংকের সুইফট কোড হচ্ছে BBHOBDDH। ব্যাংক যখন টাকা এক ব্যাংক থেকে আরেক ব্যাংকে নেটওয়ার্কের মাধ্যমে টাকা পাঠায় তখন বিভিন্ন নিরাপত্তা ব্যবস্থা গ্রহন করে থাকে। কিন্তু কখনও কখনও সেই নিরাপত্তা ব্যবস্থা ভেঙ্গে হ্যাকাররা টাকা চুরি করতে পারে। ব্যাংকের চেস্টা থাকে যেন কেউ চুরি করতে না পারে এবং সেজন্য প্রয়োজনীয় ব্যবস্থা গ্রহন করে।

ব্যাপারটা বুঝতে হলে আমাদের কয়েকটা বিষয বুঝতে হবে। সুইফট সিস্টেম কিভাবে কাজ করে সেটা ব্যাখ্যা করার জন্য মোটামুটি একটা বই লিখে ফেলা সম্ভব। আমি সবকিছু ব্যাখ্যা করার চেষ্টা না করে শুধু একটা গুরুত্বপূর্ণ বিষয়ে আলোচনা করতে চাই। সুইফট সিস্টেমের একটা গুরুত্বপূর্ণ বিষয় হল এক ব্যাংক থেকে আরেক ব্যাংকে advice পাঠানো। যেমন বলা হচ্ছে বাংলাদেশ ব্যাংক থেকে ফেডারেল রিজার্ভ ব্যাংকে ফিলিপাইনে টাকা পাঠানোর জন্য advice পাঠানো হয়েছে। ধরা যাক advice এ এরকম একটি বার্তা ছিল - "প্রিয় ফেডারেল রিজার্ভ ব্যাংক, আপনার ব্যাংকে রক্ষিত আমার হিসাব নম্বর ১৯৭১ থেকে ফিলিপাইনের আবুল ব্যাংকে (যাহার সুইট কোড FABCDEG) রক্ষিত কুদ্দুসের ৪২০ নম্বর সঞ্চয়ী হিসাবে ১০০ মিলিয়ন ডলার পাঠান। - ইতি বাংলাদেশ ব্যাংক - সুইফট কোড BBHOBDDH"। এরকম একটি বার্তা যেন যে কেউ পাঠাতে না পারে সেকারনে বিভিন্ন সতর্কতামূলক ব্যবস্থা নেয়া হয়। যেমন পাসওয়ার্ড, সার্টিফিকেট, গোপন চাবি (private key) ইত্যাদি ব্যবহার করা হয় বার্তাটিকে সঙ্কেতায়িত (encrypt) করার জন্য। যেটা এই ক্ষেত্রে বাংলাদেশ ব্যাংক ছাড়া আর কেই করতে পারবে না। কিন্তু কোন ভাবে যদি গোপন চাবিটি কোন অসাধু ব্যক্তির হাতে পড়ে তাহলে সে ইচ্ছামত বার্তা পাঠাতে পারবে। সুতরাং গোপন চাবিটি যত্ন করে রাখতে হবে যেন কেউ না পায়। ব্যাপারটা আরও জটিল। কিন্তু আমরা সহজভাবে বোঝার চেষ্টা করব। এটা নিশ্চয়ই বুঝতে পারছেন বাংলাদেশ ব্যাংক থেকে ফেডারেল রিজার্ভ ব্যাংকে যে বার্তা পাঠানো হবে সেটা অবশ্যই গোপন বার্তা হতে হবে। আবার ফেডারেল রিজার্ভ ব্যাংকের কাছে এমন প্রযুক্তি থাতে হবে যেন তারা সেই গোপন বার্তা বুঝতে পারে।

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

একটা তথ্যকে গোপন বার্তায় রুপান্তর করার প্রক্রিয়াকে আমরা বলব এনক্রিপ্ট (encrypt) করা এবং এনক্রিপ্ট করা গোপন বার্তা থেকে সেটাকে মূল তথ্যে রুপান্তর করার প্রক্রিয়াকে আমরা বলব ডিক্রিপ্ট (decrypt) করা। আজকে আমরা এনক্রিপ্ট / ডিক্রিপ্ট করার একটি জনপ্রিয় পদ্ধতি RSA শিখব। এই লেখাটা আমি এমনভাবে লেখার চেষ্টা করব যেন প্রাথমিক বিদ্যালয়ের ছাত্রছাত্রীরাও বুঝতে পারে।

প্রথমে আমাদের জানতে হবে মৌলিক সংখ্যা (prime number) সম্পর্কে। এই বিশেষ সংখ্যা গুলো ১ এর চেয়ে বড় এমন সব সংখ্যা যেগুলোকে শুধু ১ এবং সেই সংখ্যা দিয়ে ভাগ করলে নিঃশেষে বিভাজ্য হবে- কোন ভাগশেষ থাকবে না। ভাগ করতে হবে শুধু ধনাত্বক পূর্ণ সংখ্যা দিয়ে- যেমন (-৫) বা (২.৭) দিয়ে ভাগ করা যাবে না। যেমন ৭ সংখ্যাটিকে শুধুমাত্র ১ এবং ৭ দিয়ে ভাগ করলে নিঃশেষে বিভাজ্য হবে। সুতরাং ৭ একটি মৌলিক সংখ্যা। কিন্তু ৯ সংখ্যাটিকে ১ এবং ৯ ছাড়াও ৩ দিয়ে ভাগ করলেও নিঃশেষে বিভাজ্য হবে। সুতরাং ৯ মৌলিক সংখ্যা নয়। ২ হচ্ছে একমাত্র জোড় মৌলিক সংখ্যা। বাকি সব মৌলিক সংখ্যা বিজোড়। কিছু মৌলিক সংখ্যার উদাহরনঃ ২,৩,৫,৭,১১,১৩,১৭,১৯,২৩,২৯,৩১,৩৭,৪১,৪৩,৪৭,৫৩ ইত্যাদি।

এখন আমাদের ভাগশেষ বের করা বুঝতে হবে। আশা করি সবাই ব্যাপরাটা জানেন। আমি কয়েকটা উদাহরন দেই- ৭ সংখ্যাটিকে ৩ দিয়ে ভাগ করলে ভাগফল হবে ২ আর ভাগশেষ হবে ১। আবার ১১ সংখ্যাটিকে ৪ দিয়ে ভাগ করলে ভাগশেষ হবে ৩। ভাগশেষ বোঝানোর জন্য আমরা % চিহ্ন ব্যবহার করব-

৭ % ৩ = ১
১১ % ৪ = ৩

আমাদের আরও বুঝতে হবে দুইটি সংখ্যার গ.সা.গু (GCD) কিভাবে বের করতে হয়। কোন দুইটি সংখ্যার গ.সা.গু বের করার জন্য প্রথমে আমরা সংখ্যা দুটিকে যেসব সংখ্যা দিয়ে ভাগ করা যায় (নিঃশেষে বিভাজ্য) সেগুলো বের করতে পারি। এরপর সবচেয়ে বড় যে সংখ্যাটি দিয়ে দুটি সংখ্যাকেই ভাগ করা যায় সেই বড় সংখ্যাটি হবে ওই সংখ্যা দুটির গ.সা.গু। যেমস ৮ এবং ১২ সংখ্যাদুটির গ.সা.গু বের করার জন্য -

৮ কে ১,২,৪,৮  সংখ্যাগুলো দিয়ে ভাগ করা যায়
১২ কে ১,২,৩,৪,৬,১২  সংখ্যাগুলো দিয়ে ভাগ করা যায়
এখন আমরা দেখতে পাচ্ছি ৮ এবং ১২ উভয়কে ১,২,৪ দ্বারা ভাগ করা যায়। ১,২,৪ এই তিনটি সংখ্যার মধ্যে ৪ সবচেয়ে বড়। সুতরাং ৮ এবং ১২ এর গ.সা.গু বা GCD হল ৪। সেটাকে আমরা এভাবে লিখব- GCD(৮, ১২) = ৪

এখন আমাদের সূচক বা power বুঝতে হবে। আমরা যদি ৫ সংখ্যাটিকে ২ বার গুন করা বোঝাতে চাই তাহলে আমরা লিখতে পারি -

৫x৫
অথবা আমরা সূচক বা power ব্যবহার করে লিখতে পারি

এবার আমরা দেখি কিভাবে দুইটি সংখ্যার গুনফলের সাথে একটি সংখ্যা দিয়ে ভাগ করা দরকার হলে কিভাবে সহজে ভাগশেষ বের করা যায়। মনে করি ৭x৬ কে ৫ দিয়ে ভাগ করলে ভাগশেষ কত হবে বের করতে চাই। অর্থাৎ
৭x৬ % ৫ = ?
আমরা জানি ৭ % ৫ = ২ এবং ৬ % ৫ = ১। তাহলে
  ৭x৬ % ৫
= ২x১ % ৫
= ২ % ৫
= ২
এভাবে আমরা ৭x৬ = ৪২ মান না বের করেও ৭x৬ কে ৫ দিয়ে ভাগ করলে ভাগশেষ ২ হবে সেটা বের করতে পারি। ৪২ কে ৫ দিয়ে ভাগ করলেও ভাগশেষ ২ হয়। কিন্তু অনেক বড় সংখ্যার অনেক বড় পাওয়ার থাকলে গুনফল না বের করে সারাসরি ভাগশেষ বের করা সুবিধাজনক। এবার আগের চেয়ে একটু বড় সংখ্যার উদাহরন দেখি-
  % ৩ = ?
 বা
৫x৫x৫ % ৩ = ?
আমরা জানি ৫%৩=২ সুতরাং
  ৫x৫x৫ % ৩ 
= ২x২x২ % ৩
= ৮ % ৩
= ২
পরীক্ষা করার জন্য আমারা দেখি যে ৫x৫x৫ % ৩ = ১২৫ % ৩ = ২।

আমরা গোপন বার্তা কিভাবে তৈরি করা যায় সেটা সেখার জন্য যতটুকু গনিত জানা দরকার সেটা জেনে নিয়েছি।

এরপরে সুবিধার জন্য সংখ্যাগুলো ইংরেজিতে লিখব। প্রথমে একটি সূত্র দেখি। আমরা এমন তিনটি ধনাত্বক পূর্ণসংখ্যা e,d,n বের করতে পারব যেগুলো ব্যবহার করলে নীচের সমীকরনের উভয় পক্ষ সমান হবে-

    (me)d % n = m   |  0 <=m < n  and GCD(m,n) = 1 
এখন উপরের সমীকরন থেকে আমরা বলতে পারি
যদি  
    c = me % n 

হয় তবে

    m = cd % n
হবে।
এই ছোট্ট সমীকরন দুটিই RSA এনক্রিপশন ডিক্রিপশনের মূল কথা। আমরা একটি তথ্য এনক্রিপ্ট করতে চাইব তখন আমাদের একটি private key এবং একটি public key দরকার হবে। এইগুলি কিভাবে বের করা হবে সেটা আমরা একটু পরই দেখব। এখানে m আমাদের তথ্য যেটাকে আমরা গোপন বার্তায় রুপান্তর করতে চাই। আর c হচ্ছে আমাদের গোপন বার্তা। (e,n) হচ্ছে public key এবং (d,n) হচ্ছে private key। প্রথমে একটা উদহরন দেখে নেই- ধরা যাক আমাদের একটি গোপন সংখ্যা m=4 যেটা আমরা আমাদের বন্ধু শুক্কুর আলীর কাছে পাঠাতে চাই। আমরা জানি শুক্কুর আলীর পাবলিক কি হচ্ছে e=5, n=21। তাহলে
c = 45%21
  = 16
এখন আমরা আমাদের গোপন বার্তা 16 শুক্কুর আলীর কাছে পাঠিয়ে দিতে পারি। এখানে একটা ব্যাপার লক্ষ্য করি যে আমরা কিন্তু আমাদের শুক্কুর আলীর private key জানি না। সেটা শুধু শুক্কুর আলীই জানে। আর শুক্কুর আলীর public key সবাই জানে- সেজন্য আমরাও জানি। তথ্য এসক্রিপ্ট করার জন্য public key থাকলেই হয় কিন্তু ডিক্রিপ্ট করার জন্য private key দরকার হবে যেটা শুধু শুক্কুর আলীর কাছে আছে। সুতরাং আমরা বলতে পারি আমাদের গোপন তথ্য শুক্কুর আলী ছাড়া আর কেউ পড়তে পারবে না। বার্তাটি পাওয়ার পর শুক্কুর আলী তার private key যেটা হচ্ছে d=341, n=21 ব্যবহার করে আমাদের তথ্যটি বের করবে এভাবেঃ
m = 16341 % 21
  = 4

এখন আমরা দেখি কিভাবে শুক্কুর আলী e,d,n এর মান পেল। প্রধমে শুক্কুর আলী দুইটি অনেক বড় প্রাইম নাম্বার নিল-
p=7
q=3
এবার n=pxq ব্যবহার করে পেল:
n=21
এখানে মনে রাখতে হবে GCD(m,n) = 1 সমীকরণের জন্য ৩,৬,৭ মানগুলো ব্যবহার করা যাবে না। আমরা ধরে নেই যে এই সংখ্যাগুলো আমাদের এনক্রিপ্ট করার দরকার নাই। বাস্তবে অনেক বড় প্রাইম নাম্বার ব্যবহার করলে এই সমস্যা হবে না। এবার সে
φ(n) = (p-1)x(q-1)
থেকে পেল
φ(n) = 12    [φ => Euler's totient function]
এবার সে এমন একটি সংখ্যা e খুজে বের করল যেন
1 < e < φ(n) এবং GCD(e, φ(n)) = 1 
সে হিসাব করে দেখল e=5 সে ব্যবহার করতে পারে। এবার এমন একটি সংখ্যা d খুঁজে বের করল যেন
d x e % φ(n) = 1
d x 5 % 12 = 1
সে অনেকক্ষন ধরে হেসাব করে দেখল d = 341 ধরলে 341 x 5 % 12 = 1 হয়।

এবারে সে p,q,d এর মানগুলো খুব গোপনে রাখল আর (e,n) এর মান সবার কাছে পাঠিয়ে দিল যেন সবাই তাকে গোপন বার্তা পাঠাতে পারে। আর সে সেগুলো (d,n) ব্যবহার করে পড়তে পারে।

এই পদ্ধতির বড় সুবিধা হচ্ছে public key দিয়ে এনক্রিপ্ট করা তথ্য private key দিয়ে ডিক্রিপ্ট করা যায় আবার private key দিয়ে এনক্রিপ্ট করা তথ্য public key দিয়ে ডিক্রিপ্ট করা যায়। উপরের উদাহরন থেকে আপনারা নিজেরা সেটা পরীক্ষা করে দেখতে পারেন।

যদি শুক্কুর আলি আমাদের একটি বার্তা তার private key দিয়ে এনক্রিপ্ট করে পাঠায় এবং যদি তার public key দিয়ে সে বার্তা ডিক্রিপ্ট করা যায় তাহলে আমরা নিশ্চিত ভাবে জানি যে ওই বার্তা সেই পাঠিয়েছে।

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

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

এই লেখায় খুব ছোট ছোট সংখ্যা ব্যবহার করেছি বোঝার সুবিধার জন্য। 0,1,2,4,5,8 ইত্যাদি মান এনক্রিপশন ডিক্রিপশন ঠিকমত কাজ করবে এই মানগুলো ব্যবহার করলে। এর চেয়ে বড় সংখ্যার জন্য কাজ করাতে চাইলে আরও বড় মৌলিক সংখ্যা নিতে হবে। সেক্ষেত্রে হিসাবটা কঠিন হয়ে যাবে। সেটা করার কোন দরকার নাই RSA বোঝার জন্য। বাস্তবে অনেক বড় বড় মৌলিক সংখ্যা ব্যবহার করা হয় যেন এর d মান কম্পিউটার দিায়ে বের করে ফেলা না যায় এবং অনেক বড় সংখ্যার জন্য কাজ করে।

No comments:

Post a Comment