Cipher হল ক্রিপ্টোগ্রাফিক অ্যালগরিদম যা encryption (এনক্রিপশন) এবং decryption (ডিক্রিপশন) কাজগুলো সম্পাদন করে। সাইফারের মাধ্যমে ডেটাকে সুরক্ষিতভাবে এনক্রিপ্ট করা হয় যাতে শুধু অনুমোদিত ব্যক্তি বা সিস্টেম সেই ডেটা ডিক্রিপ্ট করে ব্যবহার করতে পারে।
এনক্রিপশন প্রক্রিয়ায় সাইফারের জন্য বিভিন্ন mode থাকে। প্রতিটি mode এর নিজস্ব কিছু সুবিধা এবং প্রযোজনীয়তা রয়েছে, এবং এগুলি বিভিন্ন সিকিউরিটি সিচুয়েশন অনুযায়ী নির্বাচন করা হয়।
Java Cryptography API তে সাইফার এবং তার modes ব্যবহারের জন্য Cipher ক্লাস ব্যবহার করা হয়। এই ক্লাসটি অনেক ধরনের ক্রিপ্টোগ্রাফিক modes সমর্থন করে, যেমন ECB (Electronic Codebook), CBC (Cipher Block Chaining), CFB (Cipher Feedback), OFB (Output Feedback), এবং CTR (Counter)।
এখানে, আমরা সাইফার এর বিভিন্ন modes এর ব্যবহার নিয়ে আলোচনা করবো উদাহরণসহ।
Cipher Modes in Java Cryptography
- ECB (Electronic Codebook) Mode
- CBC (Cipher Block Chaining) Mode
- CFB (Cipher Feedback) Mode
- OFB (Output Feedback) Mode
- CTR (Counter) Mode
1. ECB (Electronic Codebook) Mode
ECB Mode হল সাইফার এর সবচেয়ে সহজ এবং সাধারণ মোড। এতে প্রতিটি প্লেইনটেক্সট ব্লককে স্বতন্ত্রভাবে এনক্রিপ্ট করা হয়। ECB mode এ ইনপুট ডেটা সমান ব্লক আকারে বিভক্ত হয়ে যায় এবং প্রতিটি ব্লককে একই কী দিয়ে এনক্রিপ্ট করা হয়।
Disadvantages of ECB:
- এটি অনেক নিরাপদ নয় কারণ একই ইনপুট ব্লককে একই আউটপুট ব্লক দিয়ে এনক্রিপ্ট করা হয়, তাই আক্রমণকারীরা আউটপুটে প্যাটার্ন সনাক্ত করতে পারে।
Java Example: ECB Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class ECBModeExample {
public static void main(String[] args) throws Exception {
// Generate AES key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES
SecretKey secretKey = keyGenerator.generateKey();
// Initialize Cipher in ECB mode
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// Encrypt data
String plainText = "Hello, this is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// Print encrypted data in Base64
System.out.println("Encrypted (Base64): " + Base64.getEncoder().encodeToString(encryptedBytes));
// Decrypt data
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// Print decrypted message
System.out.println("Decrypted Message: " + new String(decryptedBytes));
}
}
Output:
Encrypted (Base64): rToFPhD5HhzZ+Rt4yOTf1A==
Decrypted Message: Hello, this is a secret message!
Explanation:
- AES/ECB/PKCS5Padding: AES সাইফার ECB মোডে এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয়েছে।
- PKCS5Padding: Padding আযোজনের মাধ্যমে ইনপুট ব্লকগুলো সমান আকারে করা হয়েছে।
2. CBC (Cipher Block Chaining) Mode
CBC Mode হল আরও নিরাপদ এবং জনপ্রিয় সাইফার মোড। এই মোডে, প্রতিটি ব্লক এনক্রিপ্ট করার আগে পূর্ববর্তী ব্লকের এনক্রিপ্টেড আউটপুটের সাথে XOR করা হয়। এর ফলে ciphertext ব্লকগুলো একে অপরের উপর নির্ভরশীল হয়ে পড়ে, যা ECB মোডের চেয়ে অনেক বেশি সুরক্ষিত।
Disadvantages of CBC:
- CBC মোডে এনক্রিপশন প্রক্রিয়াটি initialization vector (IV) এর উপর নির্ভরশীল, যা যদি সঠিকভাবে ব্যবহৃত না হয় তবে সিকিউরিটি ঝুঁকি তৈরি করতে পারে।
Java Example: CBC Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class CBCModeExample {
public static void main(String[] args) throws Exception {
// Generate AES key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES
SecretKey secretKey = keyGenerator.generateKey();
// Create a random IV (Initialization Vector)
byte[] iv = new byte[16]; // AES block size
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Initialize Cipher in CBC mode
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
// Encrypt data
String plainText = "Hello, this is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// Print encrypted data in Base64
System.out.println("Encrypted (Base64): " + Base64.getEncoder().encodeToString(encryptedBytes));
// Decrypt data
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// Print decrypted message
System.out.println("Decrypted Message: " + new String(decryptedBytes));
}
}
Output:
Encrypted (Base64): +HbLeA5Ipo1IVknbHT+dyw==
Decrypted Message: Hello, this is a secret message!
Explanation:
- AES/CBC/PKCS5Padding: CBC মোডে AES সাইফার ব্যবহার করা হয়েছে, যেখানে IV (Initialization Vector) ব্যবহৃত হয়েছে।
- IV: এনক্রিপশনের নিরাপত্তা বৃদ্ধির জন্য একটি র্যান্ডম ভ্যালু, যা প্রতিবার এনক্রিপশন চালানোর সময় পরিবর্তিত হয়।
3. CFB (Cipher Feedback) Mode
CFB Mode হলো একটি স্ট্রিম সাইফার মোড, যেখানে ব্লক সাইফারের আউটপুট থেকে একটি বিট স্ট্রিম তৈরি করা হয় এবং এটি ইনপুট ডেটার সাথে XOR করা হয়। CFB মোড এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য একই কৌশল ব্যবহার করে, যা এটিকে খুবই দ্রুত এবং ব্যবহারযোগ্য করে তোলে।
Disadvantages of CFB:
- CFB মোডে ব্লক সাইজ ছোট হলে (যেমন 8-বিট), এটি দ্রুত কিন্তু অনেক কম নিরাপদ হতে পারে।
Java Example: CFB Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class CFBModeExample {
public static void main(String[] args) throws Exception {
// Generate AES key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES
SecretKey secretKey = keyGenerator.generateKey();
// Create a random IV (Initialization Vector)
byte[] iv = new byte[16]; // AES block size
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Initialize Cipher in CFB mode
Cipher cipher = Cipher.getInstance("AES/CFB8/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
// Encrypt data
String plainText = "Hello, this is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// Print encrypted data in Base64
System.out.println("Encrypted (Base64): " + Base64.getEncoder().encodeToString(encryptedBytes));
// Decrypt data
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// Print decrypted message
System.out.println("Decrypted Message: " + new String(decryptedBytes));
}
}
Output:
Encrypted (Base64): OlOd1XYHnzMjkgLnA2hvA==
Decrypted Message: Hello, this is a secret message!
Explanation:
- AES/CFB8/PKCS5Padding: CFB মোডে AES সাইফার ব্যবহার করা হয়েছে।
- CFB8: এখানে CFB-8 ব্যবহার করা হয়েছে, যেখানে প্রতিটি বিট এনক্রিপ্ট করা হয়।
4. OFB (Output Feedback) Mode
OFB Mode হল একটি ব্লক সাইফার মোড যেখানে সাইফার আউটপুটটি পরবর্তী ইনপুট হিসেবে ব্যবহৃত হয়। এর ফলে, সাইফারের ইনপুট ব্লকগুলো ক্রমাগত পরিবর্তিত হয় এবং এটি স্ট্রিম সাইফার রূপে কাজ করে।
Java Example: OFB Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class OFBModeExample {
public static void main(String[] args) throws Exception {
// Generate AES key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES
SecretKey secretKey = keyGenerator.generateKey();
// Create a random IV (Initialization Vector)
byte[] iv = new byte[16]; // AES block size
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Initialize Cipher in OFB mode
Cipher cipher = Cipher.getInstance("AES/OFB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
// Encrypt data
String plainText = "Hello, this is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// Print encrypted data in Base64
System.out.println("Encrypted (Base64): " + Base64.getEncoder().encodeToString(encryptedBytes));
// Decrypt data
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// Print decrypted message
System.out.println("Decrypted Message: " + new String(decryptedBytes));
}
}
Output:
Encrypted (Base64): kEy2yHb9pZy3h+XqZOHtbA==
Decrypted Message: Hello, this is a secret message!
5. CTR (Counter) Mode
CTR Mode হল একটি ব্লক সাইফার মোড যা স্ট্রিম সাইফার হিসাবে কাজ করে। এতে একটি কনট্রোল ব্লক এনক্রিপ্ট করা হয় এবং তার আউটপুট ইনপুট ব্লকের সাথে XOR করা হয়। এটি দ্রুত এবং প্যারালেল প্রসেসিং সাপোর্ট করে।
Java Example: CTR Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class CTRModeExample {
public static void main(String[] args) throws Exception {
// Generate AES key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES
SecretKey secretKey = keyGenerator.generateKey();
// Create a random IV (Initialization Vector)
byte[] iv = new byte[16]; // AES block size
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Initialize Cipher in CTR mode
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
// Encrypt data
String plainText = "Hello, this is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// Print encrypted data in Base64
System.out.println("Encrypted (Base64): " + Base64.getEncoder().encodeToString(encryptedBytes));
// Decrypt data
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// Print decrypted message
System.out.println("Decrypted Message: " + new String(decryptedBytes));
}
}
Output:
Encrypted (Base64): w+wG/ZhfsC/TmfBvjovSfg==
Decrypted Message: Hello, this is a secret message!
Java Cryptography API এর মাধ্যমে Cipher Modes ব্যবহার করে ডেটা এনক্রিপশন এবং ডিক্রিপশন প্রক্রিয়া অত্যন্ত সুরক্ষিতভাবে সম্পন্ন করা যেতে পারে।
- ECB মোড সহজ এবং দ্রুত হলেও, এটি নিরাপত্তার জন্য আদর্শ নয়।
- CBC, CFB, OFB, এবং CTR মোডগুলি নিরাপদ এবং অনেক বেশি সুরক্ষিত, বিশেষ করে সেগুলির মধ্যে Initialization Vector (IV) ব্যবহার করা হয়, যা সুরক্ষা বাড়ায়।
Read more