AES (Advanced Encryption Standard) হল একটি খুবই শক্তিশালী এবং জনপ্রিয় সিমেট্রিক এনক্রিপশন অ্যালগরিদম যা ডেটা এনক্রিপশন এবং ডেক্রিপশন জন্য ব্যবহৃত হয়। AES 128, 192, এবং 256-বিট কীগুলির মাধ্যমে ডেটাকে এনক্রিপ্ট করতে সক্ষম। Java তে AES ব্যবহার করে আপনি symmetric encryption পদ্ধতির মাধ্যমে ডেটা সুরক্ষিত করতে পারেন, যেখানে একই কী ব্যবহার করে ডেটা এনক্রিপ্ট এবং ডেক্রিপ্ট করা হয়।
Java Cryptography API (JCAPI) দিয়ে AES এনক্রিপশন বাস্তবায়ন করার জন্য, সাধারণত javax.crypto প্যাকেজের ক্লাসগুলো ব্যবহার করা হয়। এখানে Cipher, SecretKeySpec, এবং IvParameterSpec ক্লাসগুলি গুরুত্বপূর্ণ ভূমিকা পালন করে।
Java তে AES এনক্রিপশন এবং ডেক্রিপশন
এখানে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে Java তে AES এনক্রিপশন এবং ডেক্রিপশন করা হয়েছে।
ধাপ ১: AES এনক্রিপশন এবং ডেক্রিপশন ক্লাস তৈরি করা
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESExample {
// AES এনক্রিপশন
public static String encrypt(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
// Base64 এ এনকোড করা যাতে স্ট্রিং আকারে পাঠানো যায়
return Base64.getEncoder().encodeToString(encryptedData);
}
// AES ডেক্রিপশন
public static String decrypt(String encryptedData, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
byte[] originalData = cipher.doFinal(decodedData);
return new String(originalData);
}
public static void main(String[] args) {
try {
String originalData = "This is a secret message!";
String key = "1234567890123456"; // AES 128-bit key (16 bytes)
System.out.println("Original Data: " + originalData);
// Encrypting the data
String encryptedData = encrypt(originalData, key);
System.out.println("Encrypted Data: " + encryptedData);
// Decrypting the data
String decryptedData = decrypt(encryptedData, key);
System.out.println("Decrypted Data: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- Key Generation: AES সিমেট্রিক কীগুলি সাধারণত 16, 24 বা 32 বাইটের হতে পারে। এই উদাহরণে আমরা 128-বিট AES কীগুলির ব্যবহার করেছি, যা 16 বাইটের একটি কী।
- Encrypt Method: এনক্রিপ্ট করার জন্য প্রথমে একটি SecretKeySpec তৈরি করা হয়, যা AES অ্যালগরিদমের জন্য ব্যবহৃত হবে। তারপর Cipher ক্লাসের মাধ্যমে ডেটা এনক্রিপ্ট করা হয়।
- Decrypt Method: ডেটা ডেক্রিপ্ট করতে Cipher ক্লাসের মাধ্যমে ডেটার উল্টো প্রক্রিয়া করা হয় এবং ডেটা পুনরুদ্ধার করা হয়।
AES এনক্রিপশন এবং ডেক্রিপশন চলমান উদাহরণ
Output:
Original Data: This is a secret message!
Encrypted Data: Ukd2TAlTGx2fSb5V8Xt6lA==
Decrypted Data: This is a secret message!
এখানে:
- Original Data হলো সেই ডেটা যা আপনি এনক্রিপ্ট করতে চান।
- Encrypted Data হলো সেই ডেটা যা AES এনক্রিপশন দ্বারা সুরক্ষিত হয়েছে।
- Decrypted Data হলো সেই ডেটা যা আপনি ডেক্রিপ্ট করে প্রথম অবস্থায় ফেরত পেয়েছেন।
Important Classes and Methods Used:
KeyGenerator: AES কীগুলির জন্য একটি নিরাপদ key তৈরি করার জন্য ব্যবহার করা হয়। তবে এই উদাহরণেSecretKeySpecব্যবহার করা হয়েছে কাস্টম কী প্রদান করতে।SecretKeySpec: এটি একটি কী স্পেসিফিকেশন যা একটি বাইনারি কীকে একটি সুনির্দিষ্ট cryptographic algorithm (এখানে AES) এর জন্য প্রস্তুত করে।Cipher: এটি encryption এবং decryption অপারেশনগুলি সম্পাদন করার জন্য ব্যবহৃত হয়।Cipher.getInstance("AES")ব্যবহার করে AES অ্যালগরিদমে এনক্রিপশন বা ডেক্রিপশন অপারেশন শুরু করা হয়।Base64: এটি এনক্রিপ্টেড ডেটাকে স্ট্রিং আকারে পরিবর্তন করার জন্য ব্যবহার করা হয় যাতে ডেটাটি পাঠানো বা স্টোর করা যায়। এনক্রিপ্ট করা ডেটা বাইনারি ফর্ম্যাটে থাকে, যা সরাসরি স্ট্রিং হিসাবে পাঠানো সম্ভব নয়, তাই Base64 এ এনকোড করা হয়।
AES Encryption Modes and Padding
Java তে AES এনক্রিপশনের জন্য বিভিন্ন modes এবং padding schemes রয়েছে, যা বিভিন্ন পরিস্থিতিতে এনক্রিপশন এবং ডেক্রিপশন প্রক্রিয়াকে আরো শক্তিশালী ও নিরাপদ করে তোলে।
- AES Modes:
- ECB (Electronic Codebook Mode): এটি সবচেয়ে সাধারণ AES মোড, তবে এটি নিরাপত্তার জন্য সবচেয়ে দুর্বল, কারণ প্রতিটি ব্লক আলাদাভাবে এনক্রিপ্ট হয়।
- CBC (Cipher Block Chaining Mode): এটি আরো নিরাপদ মোড, যেখানে এক ব্লক এনক্রিপ্ট করার পরে পরবর্তী ব্লকের জন্য পূর্ববর্তী ব্লকের আউটপুট ব্যবহার করা হয়।
- Padding Schemes:
- PKCS5Padding: এটি ব্লক সাইজ পূর্ণ করতে অতিরিক্ত ডেটা যোগ করে। এটি AES-এর জন্য প্রাথমিকভাবে ব্যবহৃত প্যাডিং স্কিম।
- NoPadding: এই প্যাডিং স্কিম ব্যবহার করলে কোন প্যাডিং প্রয়োগ করা হয় না, তবে ডেটার দৈর্ঘ্য ব্লক সাইজের সাথে মেলে এমন থাকতে হবে।
Example with AES CBC Mode and Padding:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.CipherParameters;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AES_CBC_Example {
public static String encrypt(String data, String key, String iv) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
byte[] encryptedData = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedData);
}
public static String decrypt(String encryptedData, String key, String iv) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
byte[] decryptedData = cipher.doFinal(decodedData);
return new String(decryptedData);
}
public static void main(String[] args) {
try {
String originalData = "This is a secret message!";
String key = "1234567890123456"; // 16 byte key for AES-128
String iv = "1234567890123456"; // 16 byte IV
System.out.println("Original Data: " + originalData);
// Encrypting the data
String encryptedData = encrypt(originalData, key, iv);
System.out.println("Encrypted Data: " + encryptedData);
// Decrypting the data
String decryptedData = decrypt(encryptedData, key, iv);
System.out.println("Decrypted Data: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Output:
Original Data: This is a secret message!
Encrypted Data: <Encrypted Base64 String>
Decrypted Data: This is a secret message!
AES (Advanced Encryption Standard) হল একটি খুবই শক্তিশালী এবং নিরাপদ এনক্রিপশন অ্যালগরিদম যা Java তে ব্যবহার করা যায়। AES এনক্রিপশনে ডেটা সুরক্ষিত করতে Cipher, SecretKeySpec, এবং IvParameterSpec ব্যবহার করা হয়। Java তে AES এনক্রিপশন ব্যবহার করে আপনি confidentiality, integrity, এবং authentication নিশ্চিত করতে পারেন।
Java তে AES এনক্রিপশন এবং ডেক্রিপশন সহজ এবং শক্তিশালী টুল হিসেবে কাজ করে, তবে এর জন্য সঠিক modes, padding schemes, এবং key management গুরুত্বপূর্ণ।
Read more