Public Key এবং Private Key হল Asymmetric Cryptography এর দুটি প্রধান উপাদান। এই ক্রিপ্টোগ্রাফি পদ্ধতি একটি কী পেয়ার (Key Pair) ব্যবহার করে যেখানে একটি পাবলিক কী (Public Key) এবং একটি প্রাইভেট কী (Private Key) থাকে। তাদের ব্যবহারের মাধ্যমে তথ্যের নিরাপত্তা, এনক্রিপশন এবং ডেক্রিপশন নিশ্চিত করা হয়। সাধারণত, Public Key সবার জন্য অ্যাক্সেসযোগ্য হয়, কিন্তু Private Key শুধুমাত্র নির্দিষ্ট ব্যক্তি বা সিস্টেমের কাছে থাকে।
Public Key এবং Private Key এর মৌলিক ধারণা:
- Public Key (পাবলিক কী):
- Public Key হল একটি কী যা যেকোনো ব্যক্তির কাছে শেয়ার করা যায়।
- এটি সাধারণত এনক্রিপশন বা সাইনিং (signing) এর জন্য ব্যবহৃত হয়।
- যে কেউ এই কী দিয়ে বার্তা এনক্রিপ্ট করতে পারে, কিন্তু শুধুমাত্র Private Key ব্যবহারকারী এটি ডিক্রিপ্ট করতে সক্ষম হবে।
- Private Key (প্রাইভেট কী):
- Private Key একটি সিক্রেট কী যা শুধু মালিকের কাছে থাকে।
- এটি সাধারণত ডিক্রিপশন বা সাইন ভেরিফিকেশন (sign verification) এর জন্য ব্যবহৃত হয়।
- এই কী দিয়ে এনক্রিপ্ট করা তথ্য শুধুমাত্র পাবলিক কী দিয়ে ডিক্রিপ্ট করা যাবে।
Public Key এবং Private Key এর ব্যবহারের প্রধান ক্ষেত্র:
এনক্রিপশন এবং ডেক্রিপশন: Public Key Cryptography এর মাধ্যমে, Public Key দিয়ে একটি বার্তা এনক্রিপ্ট করা হয় এবং সেটি শুধুমাত্র Private Key দিয়ে ডিক্রিপ্ট করা সম্ভব। এটি নিশ্চিত করে যে শুধুমাত্র প্রাপকের কাছে থাকা Private Key ব্যবহার করে বার্তাটি পড়া যেতে পারে।
- Encyption: জনসাধারণের কাছে শেয়ার করা পাবলিক কী দিয়ে তথ্য এনক্রিপ্ট করা যায়।
- Decryption: ডিক্রিপশন শুধুমাত্র প্রাইভেট কী দিয়ে করা সম্ভব, যা শুধুমাত্র নির্দিষ্ট ব্যক্তির কাছে থাকে।
উদাহরণ:
import javax.crypto.Cipher; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.util.Base64; public class RSACryptographyExample { public static void main(String[] args) throws Exception { // RSA Key Pair Generation KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); // Encyption using Public Key String originalMessage = "Hello, this is a secret message!"; Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedMessage = cipher.doFinal(originalMessage.getBytes()); String encryptedMessageBase64 = Base64.getEncoder().encodeToString(encryptedMessage); System.out.println("Encrypted Message: " + encryptedMessageBase64); // Decryption using Private Key cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedMessage = cipher.doFinal(Base64.getDecoder().decode(encryptedMessageBase64)); String decryptedMessageStr = new String(decryptedMessage); System.out.println("Decrypted Message: " + decryptedMessageStr); } }আউটপুট:
Encrypted Message: VJXXdP... Decrypted Message: Hello, this is a secret message!এখানে, Public Key দিয়ে বার্তা এনক্রিপ্ট করা হয়েছে এবং শুধুমাত্র Private Key দিয়ে সেই বার্তা ডিক্রিপ্ট করা হয়েছে।
ডিজিটাল সাইনিং (Digital Signing): Private Key দিয়ে একটি বার্তা বা ডকুমেন্ট সাইন করা হয় এবং অন্যরা সেই সাইন ভেরিফাই করতে Public Key ব্যবহার করতে পারে। এটি মূলত ডেটার অখণ্ডতা এবং প্রামাণিকতা নিশ্চিত করতে ব্যবহৃত হয়।
Process:
- ডেটা বা বার্তা প্রথমে Private Key দিয়ে সাইন করা হয়।
- তারপর, সাইন করা বার্তা বা ডেটা প্রাপকের কাছে পাঠানো হয়।
- প্রাপক পাবলিক কী ব্যবহার করে সাইনটি যাচাই করতে পারে।
উদাহরণ:
import java.security.*; import java.util.Base64; public class DigitalSignatureExample { public static void main(String[] args) throws Exception { // KeyPair Generation KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // Signing the message String message = "This is a secure message"; Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(message.getBytes()); byte[] signedMessage = signature.sign(); String signedMessageBase64 = Base64.getEncoder().encodeToString(signedMessage); System.out.println("Signed Message: " + signedMessageBase64); // Verifying the signature signature.initVerify(publicKey); signature.update(message.getBytes()); boolean isVerified = signature.verify(Base64.getDecoder().decode(signedMessageBase64)); System.out.println("Signature Verified: " + isVerified); } }আউটপুট:
Signed Message: q+eY3B... Signature Verified: trueএখানে, Private Key দিয়ে বার্তা সাইন করা হয়েছে এবং Public Key দিয়ে সাইনটি যাচাই করা হয়েছে।
- Authentication (প্রমাণীকরণ): Public Key এবং Private Key ব্যবহৃত হয় প্রমাণীকরণের জন্য, বিশেষত SSL/TLS প্রোটোকল এবং SSH (Secure Shell) সেশনগুলোতে।
- Public Key ব্যবহৃত হয় ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করতে।
- Private Key সার্ভার বা ক্লায়েন্টের কাছে থাকে এবং এটি তাদের সনাক্তকরণের জন্য ব্যবহৃত হয়।
Public Key এবং Private Key এর নিরাপত্তা বৈশিষ্ট্য:
- Confidentiality (গোপনীয়তা): শুধুমাত্র প্রাইভেট কী দিয়ে এনক্রিপ্ট করা তথ্য ডিক্রিপ্ট করা সম্ভব।
- Authentication (প্রমাণীকরণ): সাইনিং এবং ভেরিফিকেশন প্রক্রিয়ার মাধ্যমে পরিচিতি নিশ্চিত করা যায়।
- Integrity (অখণ্ডতা): ডিজিটাল সাইনিং তথ্যের অখণ্ডতা নিশ্চিত করে এবং এটি চেক করা যায়।
Public Key এবং Private Key হল Asymmetric Cryptography এর দুটি অপরিহার্য অংশ যা এনক্রিপশন, ডেক্রিপশন, ডিজিটাল সাইনিং এবং প্রমাণীকরণের জন্য ব্যবহৃত হয়। এগুলি নিরাপদ যোগাযোগ নিশ্চিত করে, ডেটার অখণ্ডতা এবং প্রামাণিকতা বজায় রাখে এবং বিভিন্ন নিরাপত্তা প্রযুক্তিতে ব্যবহৃত হয়।
Read more