Cipher ক্লাস Java Cryptography API (JCAPI) তে একটি অত্যন্ত গুরুত্বপূর্ণ ক্লাস যা encryption এবং decryption প্রক্রিয়া সম্পন্ন করতে ব্যবহৃত হয়। এটি symmetrical encryption (যেমন AES, DES) এবং asymmetrical encryption (যেমন RSA) সহ বিভিন্ন ক্রিপ্টোগ্রাফি অ্যালগরিদম সমর্থন করে।
Cipher ক্লাসের মাধ্যমে, আপনি নিরাপদভাবে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারেন, যা data security, privacy এবং integrity নিশ্চিত করতে গুরুত্বপূর্ণ।
Cipher ক্লাসের ভূমিকা
Cipher ক্লাস Java তে javax.crypto প্যাকেজে অন্তর্ভুক্ত একটি ক্লাস যা এনক্রিপশন এবং ডিক্রিপশন অপারেশনগুলি সম্পন্ন করার জন্য ব্যবহৃত হয়। এটি একটি block cipher বা stream cipher হিসেবেও কাজ করতে পারে এবং ডেটার আকারের উপর ভিত্তি করে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারে।
Cipher ক্লাসের মূল কার্যাবলী:
- Encryption: ডেটাকে একটি পাবলিক বা প্রাইভেট কী ব্যবহার করে এনক্রিপ্ট করা।
- Decryption: এনক্রিপ্ট করা ডেটাকে একটি প্রাইভেট বা পাবলিক কী দিয়ে ডিক্রিপ্ট করা।
- Key Management: কীগুলিকে ইনিশিয়ালাইজ করা এবং সেগুলি ব্যবহার করা।
- Mode Selection: যেমন ECB, CBC, CFB ইত্যাদি মোড নির্বাচন করা।
- Padding: সঠিক ব্লক সাইজে ডেটা উপস্থাপন করার জন্য padding অপশন ব্যবহার করা।
Cipher ক্লাসের ব্যবহার: উদাহরণ
1. Symmetric Encryption (AES)
এখানে একটি উদাহরণ দেওয়া হয়েছে যেখানে AES (Advanced Encryption Standard) ব্যবহার করে symmetric encryption এবং decryption করা হয়েছে। এখানে একটি একই কী দিয়ে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয়েছে।
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class CipherExample {
public static void main(String[] args) throws Exception {
String data = "Hello, World!"; // Data to be encrypted
// Generate AES key using KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // AES 128-bit key
SecretKey secretKey = keyGenerator.generateKey();
// Initialize Cipher for encryption
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// Encrypt the data
byte[] encryptedData = cipher.doFinal(data.getBytes());
// Encode the encrypted data in Base64 for readable format
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("Encrypted Data: " + encryptedDataBase64);
// Decrypt the data
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
String decryptedString = new String(decryptedData);
System.out.println("Decrypted Data: " + decryptedString);
}
}
Output:
Encrypted Data: D4V5O2Tc/YWrYMKnxlW3uA==
Decrypted Data: Hello, World!
Explanation:
- AES এনক্রিপশন ব্যবহৃত হয়েছে যেখানে প্রথমে একটি SecretKey তৈরি করা হয়েছে।
- Cipher.getInstance("AES") দিয়ে AES এনক্রিপশন মোড ইনিশিয়ালাইজ করা হয়েছে।
- cipher.doFinal() মেথড ব্যবহার করে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয়েছে।
2. Asymmetric Encryption (RSA)
এখানে RSA এনক্রিপশন ব্যবহার করে asymmetric encryption এর উদাহরণ দেওয়া হয়েছে, যেখানে পাবলিক কী দিয়ে ডেটা এনক্রিপ্ট করা হয়েছে এবং প্রাইভেট কী দিয়ে ডিক্রিপ্ট করা হয়েছে।
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 RSACipherExample {
public static void main(String[] args) throws Exception {
String data = "Hello, RSA!";
// Generate a key pair (public and private key)
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // RSA key size 2048 bits
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// Initialize Cipher for encryption (RSA)
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// Encrypt the data
byte[] encryptedData = cipher.doFinal(data.getBytes());
// Encode encrypted data in Base64
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("Encrypted Data: " + encryptedDataBase64);
// Decrypt the data
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
String decryptedString = new String(decryptedData);
System.out.println("Decrypted Data: " + decryptedString);
}
}
Output:
Encrypted Data: Bx7Uy0YVdQHRHRz5+MPf0KP41OAfpuhrD8D1eVjI33U...
Decrypted Data: Hello, RSA!
Explanation:
- RSA ব্যবহার করে একটি KeyPair তৈরি করা হয়েছে।
- publicKey দিয়ে ডেটা এনক্রিপ্ট করা হয়েছে এবং privateKey দিয়ে সেই ডেটা ডিক্রিপ্ট করা হয়েছে।
- RSA ব্যবহার করলে publicKey দিয়ে ডেটা এনক্রিপ্ট এবং privateKey দিয়ে ডিক্রিপ্ট করা হয়।
Cipher ক্লাসের মেজর মেথডসমূহ
getInstance(String transformation):- এটি একটি সুনির্দিষ্ট ক্রিপ্টোগ্রাফিক অ্যালগরিদম (যেমন AES, RSA) নির্দিষ্ট করতে ব্যবহৃত হয়। উদাহরণ:
Cipher.getInstance("AES")
- এটি একটি সুনির্দিষ্ট ক্রিপ্টোগ্রাফিক অ্যালগরিদম (যেমন AES, RSA) নির্দিষ্ট করতে ব্যবহৃত হয়। উদাহরণ:
init(int opmode, Key key):- এই মেথডটি এনক্রিপশন বা ডিক্রিপশন মোডে সাইফারকে ইনিশিয়ালাইজ করে।
opmode: এনক্রিপশন (ENCRYPT_MODE) বা ডিক্রিপশন (DECRYPT_MODE)key: সাইফার ব্যবহৃত কী
- এই মেথডটি এনক্রিপশন বা ডিক্রিপশন মোডে সাইফারকে ইনিশিয়ালাইজ করে।
doFinal(byte[] input):- এই মেথডটি ইনপুট ডেটা এনক্রিপ্ট বা ডিক্রিপ্ট করে এবং আউটপুট আউটপুট আারে রিটার্ন করে।
getBlockSize():- এটি সাইফারের ব্লক সাইজ প্রদান করে (যদি applicable হয়)।
update(byte[] input):- এটি সাইফারের ইনপুট ডেটার অংশ আপডেট করে।
Cipher Mode এবং Padding
Cipher ক্লাসে বিভিন্ন মোড এবং প্যাডিং অপশন ব্যবহার করা যেতে পারে, যা এনক্রিপশন প্রক্রিয়াকে আরো সুরক্ষিত করে। সাধারণ মোডগুলি হলো:
- ECB (Electronic Codebook): এটি সহজ কিন্তু নিরাপত্তা ঝুঁকিপূর্ণ, কারণ এতে একই ইনপুট সবসময় একই আউটপুট দেয়।
- CBC (Cipher Block Chaining): এটি বেশি নিরাপদ কারণ এটি আগের ব্লকের আউটপুটের উপর ভিত্তি করে পরবর্তী ব্লক এনক্রিপ্ট করে।
- CFB (Cipher Feedback): এটি একটি ব্লক সাইফার, যেখানে ব্লক আউটপুটের উপর নির্ভর করে পরবর্তী ব্লক এনক্রিপ্ট হয়।
Padding: যেহেতু ব্লক সাইফারগুলি ডেটাকে নির্দিষ্ট ব্লক সাইজে এনক্রিপ্ট করে, তাই প্যাডিং ব্যবহার করা হয় যাতে ইনপুট ডেটা সঠিক ব্লক সাইজে থাকে।
- PKCS5Padding: সাধারণত ব্লক সাইজের সাথে মেলে না এমন ইনপুটের জন্য ব্যবহৃত হয়।
Cipher ক্লাস Java Cryptography API তে একটি শক্তিশালী ক্লাস যা ডেটা এনক্রিপশন এবং ডিক্রিপশন প্রক্রিয়া সম্পন্ন করতে ব্যবহৃত হয়। আপনি symmetric encryption (যেমন AES) এবং asymmetric encryption (যেমন RSA) এর মতো বিভিন্ন ক্রিপ্টোগ্রাফিক অ্যালগরিদম ব্যবহার করতে পারেন Cipher ক্লাসের মাধ্যমে। এটি বিভিন্ন এনক্রিপশন মোড, প্যাডিং অপশন এবং কী ব্যবস্থাপনা সমর্থন করে যা নিরাপদ যোগাযোগ এবং ডেটা সুরক্ষার জন্য অপরিহার্য।
Read more