Cipher এবং Cipher Modes হল ক্রিপ্টোগ্রাফিতে ব্যবহৃত গুরুত্বপূর্ণ উপাদান, যা ডেটার encryption এবং decryption (এনক্রিপশন এবং ডিক্রিপশন) প্রক্রিয়ায় ব্যবহৃত হয়। Cipher হল একটি অ্যালগরিদম যা ডেটাকে এনক্রিপ্ট বা ডিক্রিপ্ট করার জন্য ব্যবহৃত হয় এবং Cipher Modes হল সেই অ্যালগরিদমের উপায় বা কৌশল যা এনক্রিপশন বা ডিক্রিপশন প্রক্রিয়াকে প্রভাবিত করে।
Java Cryptography API (JCAPI) ব্যবহার করে বিভিন্ন ধরনের Cipher এবং Cipher Modes প্রক্রিয়া বাস্তবায়ন করা যায়। নিচে Cipher এবং Cipher Modes এর ব্যাখ্যা এবং Java তে তাদের ব্যবহারের উদাহরণ দেওয়া হল।
১. Cipher (এনক্রিপশন অ্যালগরিদম)
Cipher একটি ক্রিপ্টোগ্রাফিক অ্যালগরিদম যা plaintext ডেটাকে ciphertext (এনক্রিপ্টেড ডেটা) এ রূপান্তরিত করে এবং বিপরীত প্রক্রিয়া ডিক্রিপশনে একই অ্যালগরিদম ব্যবহার করে।
Java তে Cipher ক্লাস javax.crypto.Cipher প্যাকেজে পাওয়া যায় এবং এটি বিভিন্ন encryption এবং decryption অ্যালগরিদম সমর্থন করে, যেমন AES, DES, RSA, Blowfish, ইত্যাদি।
Cipher এর মূল কাজ:
- Encryption: Plaintext ডেটাকে এনক্রিপ্ট করে এবং একটি নিরাপদ আউটপুট (ciphertext) তৈরি করে।
- Decryption: এনক্রিপ্ট করা ডেটা (ciphertext) কে পুনরায় plaintext আকারে ফিরিয়ে আনে।
Java Example: Cipher for Encryption and 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 {
// Key generation for AES (Advanced Encryption Standard)
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES key
SecretKey secretKey = keyGenerator.generateKey();
// Create Cipher instance for AES encryption
Cipher cipher = Cipher.getInstance("AES");
// Encryption process
cipher.init(Cipher.ENCRYPT_MODE, secretKey); // Set cipher to encryption mode
String plaintext = "This is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted Text: " + encryptedText);
// Decryption process
cipher.init(Cipher.DECRYPT_MODE, secretKey); // Set cipher to decryption mode
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted Text: " + decryptedText);
}
}
Output Example:
Encrypted Text: /2uDTb4W+fzyTsl8y9ZdeA==
Decrypted Text: This is a secret message!
Explanation:
- AES Algorithm ব্যবহার করে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয়েছে।
Cipher.getInstance("AES"): AES এনক্রিপশন অ্যালগরিদমের জন্য সাইফার তৈরি করা হয়েছে।cipher.init(Cipher.ENCRYPT_MODE, secretKey): এনক্রিপশন মোডে সাইফার ইনিশিয়ালাইজ করা হয়েছে।cipher.doFinal(): এনক্রিপশন বা ডিক্রিপশন সম্পন্ন করার জন্য এটি ব্যবহার করা হয়।
২. Cipher Modes (এনক্রিপশন মোডস)
Cipher Modes হল সেই পদ্ধতি বা কৌশল যা block ciphers এবং stream ciphers এর এনক্রিপশন এবং ডিক্রিপশন প্রক্রিয়ায় ব্যবহার করা হয়। Cipher modes নির্ধারণ করে কিভাবে ব্লকসাইজ ডেটা (যেমন 128-বিট) এনক্রিপ্ট এবং ডিক্রিপ্ট হবে।
Common Cipher Modes:
- ECB (Electronic Codebook):
- এটি সবচেয়ে সহজ এবং সাধারণ এনক্রিপশন মোড, যেখানে প্রতিটি ব্লক আলাদাভাবে এনক্রিপ্ট করা হয়। তবে এটি নিরাপত্তার জন্য দুর্বল, কারণ একে অপরের সাথে সম্পর্কিত ব্লকগুলি সিমিলার থাকবে।
- Not recommended for strong security.
- CBC (Cipher Block Chaining):
- প্রতিটি ব্লককে তার পূর্ববর্তী ব্লকের সাথে XOR করা হয়, যা ব্লকগুলির মধ্যে সম্পর্ক তৈরি করে। এটি padding ব্যবহার করে এবং নিরাপদ এনক্রিপশন মোড হিসেবে জনপ্রিয়।
- Recommended for stronger security.
- CFB (Cipher Feedback):
- এটি একটি ব্লক সাইফার মোড যা স্ট্রীম সাইফারের মতো কাজ করে। ইনপুট ডেটার উপর কাজ করতে এটি ফিডব্যাক ব্যবহার করে এবং তা পছন্দসই আউটপুট তৈরি করতে সাহায্য করে।
- OFB (Output Feedback):
- এটি stream cipher হিসেবে কাজ করে এবং ব্লক সাইফারের আউটপুটকে ইনপুট হিসেবে ব্যবহার করে। এটি এনক্রিপশন স্ট্রিম তৈরি করে, যা দ্রুত এবং নিরাপদ।
- CTR (Counter Mode):
- এটি stream cipher এর মতো কাজ করে, যেখানে ব্লক সাইফারের প্রতিটি ব্লকের জন্য একটি ইউনিক কন্ট্রোল কাউন্টার (counter) ব্যবহার করা হয়। এটি এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য একই প্রক্রিয়া ব্যবহার করে এবং উচ্চ পারফরম্যান্স দেয়।
Java Example: CBC Mode for Encryption
এখানে AES সাইফার মোড হিসেবে CBC ব্যবহার করে এনক্রিপশন এবং ডিক্রিপশন উদাহরণ দেওয়া হল:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
import java.security.SecureRandom;
public class CipherModeCBCExample {
public static void main(String[] args) throws Exception {
// Generate a secret key for AES
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128-bit AES key
SecretKey secretKey = keyGenerator.generateKey();
// Generate a random initialization vector (IV) for CBC
SecureRandom secureRandom = new SecureRandom();
byte[] iv = new byte[16]; // 16 bytes IV for AES
secureRandom.nextBytes(iv);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Create Cipher instance for AES CBC mode
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Encryption process
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
String plaintext = "This is a secure message!";
byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted Text (CBC Mode): " + encryptedText);
// Decryption process
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted Text (CBC Mode): " + decryptedText);
}
}
Output Example:
Encrypted Text (CBC Mode): wkjXfmhLOhMmNjzdxgFHwA==
Decrypted Text (CBC Mode): This is a secure message!
Explanation:
- AES/CBC/PKCS5Padding:
AESঅ্যালগরিদমের জন্য CBC মোড এবং PKCS5Padding প্যাডিং মেথড ব্যবহার করা হয়েছে। IvParameterSpec: ইনিশিয়ালাইজেশন ভেক্টর (IV) ব্যবহার করা হয়েছে যা CBC মোডে গুরুত্বপূর্ণ।
৩. Cipher Modes এর নিরাপত্তা এবং ব্যবহার
- ECB মোডটি নিরাপত্তার দিক থেকে দুর্বল, কারণ একক ব্লক এনক্রিপ্ট হলে একই ইনপুটের জন্য সবসময় একই আউটপুট তৈরি হয়, যা আক্রমণকারীদের জন্য সুবিধাজনক হতে পারে। তাই এটি সাধারণত ব্যবহৃত হয় না।
- CBC মোড বেশি নিরাপদ কারণ এতে প্রতিটি ব্লকের জন্য একটি ইউনিক ইনিশিয়ালাইজেশন ভেক্টর (IV) ব্যবহার করা হয়, যা এনক্রিপশনকে আরও সুরক্ষিত করে তোলে।
- CFB, OFB, এবং CTR মোডগুলিও নিরাপদ এবং স্ট্রীম সাইফারের মতো কাজ করে, যা বিশেষভাবে দ্রুত এবং উপযোগী বিভিন্ন অ্যাপ্লিকেশন যেমন real-time encryption এর জন্য ব্যবহৃত হয়।
- Cipher হল ক্রিপ্টোগ্রাফির একটি মৌলিক উপাদান যা ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য ব্যবহৃত হয়।
- Cipher Modes হল এনক্রিপশন অ্যালগরিদমের ভিন্ন ভিন্ন কার্যপ্রণালী, যা ডেটার সুরক্ষা নিশ্চিত করতে সাহায্য করে।
- Java Cryptography API (JCAPI) ব্যবহার করে আপনি বিভিন্ন Cipher Modes যেমন AES, RSA, CBC, ECB, SHA, HMAC ইত্যাদি ব্যবহার করতে পারেন, যা আপনার ডেটা এনক্রিপশন এবং সুরক্ষা নিশ্চিত করে।
Cipher এবং Cipher Modes এর মাধ্যমে আপনি সুরক্ষিত ডেটা ট্রান্সফার এবং ম্যানিপুলেশন নিশ্চিত করতে পারবেন, যা আধুনিক অ্যাপ্লিকেশন এবং সিস্টেমগুলির জন্য অপরিহার্য।
Cipher হল একটি ক্রিপ্টোগ্রাফিক অ্যালগরিদম যা ডেটা এনক্রিপশন এবং ডিক্রিপশনের জন্য ব্যবহৃত হয়। এটি একটি গোপন পদ্ধতি ব্যবহার করে ডেটাকে রূপান্তরিত (encrypt) করে, যাতে কোনো অবাঞ্ছিত পক্ষ ডেটা পড়তে না পারে। শুধু মাত্র অনুমোদিত ব্যক্তি (যিনি এনক্রিপশন বা ডিক্রিপশন কী জানেন) সেই ডেটা অ্যাক্সেস করতে সক্ষম হন।
Cipher এর প্রধান ফিচার
- Encryption (এনক্রিপশন): Cipher ব্যবহার করে আপনি একটি প্লেইনটেক্সট (স্পষ্ট ডেটা) কে সিকিউরড বা এনক্রিপ্টেড টেক্সটে রূপান্তরিত করেন, যাতে সেই টেক্সটটি অপরিচিত বা অবাঞ্ছিত পক্ষ দ্বারা সহজে পড়া না যায়।
- Decryption (ডিক্রিপশন): Cipher ব্যবহৃত হয়ে এনক্রিপ্ট করা ডেটাকে আবার প্লেইনটেক্সটে (আসল ডেটা) রূপান্তরিত করা যায়, কিন্তু শুধুমাত্র প্রাপকের কাছে থাকা সঠিক কী দিয়ে এটি করা সম্ভব।
Types of Ciphers
Ciphers সাধারণত দুটি প্রকারে ভাগ করা হয়:
- Symmetric Key Ciphers:
- একই কী দিয়ে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয়।
- AES, DES, 3DES এই ধরনের সাইফারের উদাহরণ।
- দ্রুত এবং কমপ্লেক্সিটির দিক থেকে সহজ হলেও কী পরিচালনা একটু সমস্যা হতে পারে।
- Asymmetric Key Ciphers:
- দুটি আলাদা কী ব্যবহৃত হয়—একটি Public Key (যা সবাই জানে) এবং একটি Private Key (যা শুধুমাত্র প্রাপকের কাছে থাকে)।
- RSA, Elliptic Curve Cryptography (ECC) এই ধরনের সাইফারের উদাহরণ।
- নিরাপত্তা অনেক বেশি হলেও পারফরম্যান্স কিছুটা ধীর।
Cipher কীভাবে কাজ করে?
Cipher সাধারণত block cipher এবং stream cipher হিসেবে বিভক্ত করা হয়, যা তাদের ডেটা এনক্রিপ্ট করার পদ্ধতির উপর নির্ভর করে।
- Block Cipher:
- একটি নির্দিষ্ট আকারের ডেটা ব্লক (যেমন 128 বিট) নিয়ে কাজ করে। প্রতিটি ব্লক একটি নির্দিষ্ট এনক্রিপশন কী দিয়ে এনক্রিপ্ট করা হয়।
- উদাহরণ: AES (Advanced Encryption Standard), DES (Data Encryption Standard)।
- Stream Cipher:
- এটি ডেটাকে বিট বা বাইট আকারে এনক্রিপ্ট করে। এটি ধারাবাহিকভাবে ইনপুট ডেটা গ্রহণ করে এবং তাকে এনক্রিপ্ট করে।
- উদাহরণ: RC4।
Java Cryptography: Cipher Implementation
Java Cryptography API ব্যবহার করে সাইফার এনক্রিপশন এবং ডিক্রিপশন সহজেই করা যায়। Java-তে Cipher ক্লাস ব্যবহার করে সাইফার প্রক্রিয়া বাস্তবায়ন করা হয়। নিচে একটি উদাহরণ দেওয়া হয়েছে যেখানে AES (Advanced Encryption Standard) সাইফার ব্যবহৃত হয়েছে।
AES Cipher Example in Java
এখানে একটি সহজ উদাহরণ দেওয়া হলো যেখানে AES সাইফার ব্যবহৃত হয়েছে প্লেইনটেক্সটকে এনক্রিপ্ট এবং ডিক্রিপ্ট করতে।
1. AES Encryption and Decryption in Java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class CipherExample {
public static void main(String[] args) throws Exception {
// Generate a secret AES key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // Key size
SecretKey secretKey = keyGenerator.generateKey();
// Input data to be encrypted
String inputData = "Hello, this is a secure message!";
// Create Cipher instance for AES encryption
Cipher cipher = Cipher.getInstance("AES");
// Encrypt the data using AES and the secret key
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(inputData.getBytes());
// Encode the encrypted data to Base64 for display
String encryptedText = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("Encrypted Text: " + encryptedText);
// Decrypt the data using the same secret key
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
// Convert decrypted data back to string
String decryptedText = new String(decryptedData);
System.out.println("Decrypted Text: " + decryptedText);
}
}
Output Example:
Encrypted Text: D5uvU0pZt9A1v6z9JcAzyQ==
Decrypted Text: Hello, this is a secure message!
Explanation:
- KeyGenerator: এটি একটি AES সিক্রেট কী তৈরি করে।
- Cipher.getInstance("AES"): এটি AES সাইফারকে ইনিশিয়ালাইজ করে।
- cipher.init(Cipher.ENCRYPT_MODE, secretKey): এটি সাইফারকে এনক্রিপশন মোডে সেট করে এবং সিক্রেট কী ব্যবহার করে।
- cipher.doFinal(inputData.getBytes()): ইনপুট ডেটা এনক্রিপ্ট করা হয়।
- Base64.getEncoder().encodeToString(encryptedData): এনক্রিপ্ট করা ডেটা Base64 ফরম্যাটে রূপান্তরিত হয়, যাতে এটি পাঠযোগ্য হয়।
- cipher.init(Cipher.DECRYPT_MODE, secretKey): ডিক্রিপশন মোডে সাইফার ইনিশিয়ালাইজ করা হয়।
- cipher.doFinal(Base64.getDecoder().decode(encryptedText)): এনক্রিপ্ট করা ডেটা ডিক্রিপ্ট করা হয়।
Cipher-এর ব্যবহারের ক্ষেত্র
- Data Encryption (ডেটা এনক্রিপশন):
- সাইফার ব্যবহৃত হয় সুরক্ষিত ডেটা ট্রান্সফারের জন্য, যেমন confidential information সংরক্ষণ করা বা পাঠানো।
- Symmetric Ciphers (AES) এবং Asymmetric Ciphers (RSA) সিক্রেট ডেটা এনক্রিপ্ট করতে ব্যবহৃত হয়।
- Secure Communication (নিরাপদ যোগাযোগ):
- SSL/TLS প্রোটোকলটি cipher ব্যবহার করে সুরক্ষিত ওয়েব যোগাযোগ নিশ্চিত করে।
- সাইফার ওয়েব ব্রাউজার এবং সার্ভারের মধ্যে নিরাপদ ডেটা ট্রান্সফার নিশ্চিত করতে ব্যবহৃত হয়।
- File Encryption (ফাইল এনক্রিপশন):
- সাইফার ফাইল এবং ডকুমেন্ট এনক্রিপ্ট করতে ব্যবহৃত হয়, যাতে অপ্রত্যাশিত পক্ষ সেই ফাইল বা ডকুমেন্ট অ্যাক্সেস করতে না পারে।
- Digital Signatures (ডিজিটাল সিগনেচার):
- ডকুমেন্টে সাইন করার জন্য private key দিয়ে সাইফার ব্যবহার করা হয়, যা পরে public key দিয়ে যাচাই করা হয়।
- Password Encryption (পাসওয়ার্ড এনক্রিপশন):
- সাইফার ব্যবহৃত হয় পাসওয়ার্ড এনক্রিপ্ট করতে, যাতে পাসওয়ার্ড সিস্টেমে সুরক্ষিত থাকে এবং সুরক্ষিতভাবে সংরক্ষিত থাকে।
- Blockchain (ব্লকচেইন):
- Blockchain সিস্টেমে cipher ব্যবহৃত হয় ব্লকগুলোর মধ্যে সুরক্ষিত ট্রান্সফার এবং ম্যানিপুলেশন রোধ করতে।
- VPN (Virtual Private Network):
- VPNs সাইফার ব্যবহার করে নেটওয়ার্কের মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করতে। এটি ডেটাকে এনক্রিপ্ট করে এবং নিরাপদভাবে পাঠায়।
Cipher হল ক্রিপ্টোগ্রাফির একটি গুরুত্বপূর্ণ অংশ যা ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হয়। Java Cryptography API ব্যবহার করে AES, RSA, DES ইত্যাদি সাইফার অ্যালগরিদমের মাধ্যমে আপনি নিরাপদ ডেটা ট্রান্সফার এবং সুরক্ষা নিশ্চিত করতে পারেন। সাইফার ব্যবহৃত হয় data encryption, secure communication, digital signatures, file encryption, password hashing, এবং blockchain সহ বিভিন্ন ক্ষেত্রে নিরাপত্তা নিশ্চিত করতে।
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 ক্লাসের মাধ্যমে। এটি বিভিন্ন এনক্রিপশন মোড, প্যাডিং অপশন এবং কী ব্যবস্থাপনা সমর্থন করে যা নিরাপদ যোগাযোগ এবং ডেটা সুরক্ষার জন্য অপরিহার্য।
Cipher Modes হল ক্রিপ্টোগ্রাফিতে ব্যবহৃত পদ্ধতি যা block cipher অ্যালগরিদমের এনক্রিপশন প্রক্রিয়ার গুণমান এবং নিরাপত্তা বাড়াতে ব্যবহৃত হয়। যখন ব্লক সাইজে ডেটা এনক্রিপ্ট করা হয়, তখন একই key এবং block cipher algorithm ব্যবহার করে একাধিক ব্লক এনক্রিপ্ট করার জন্য বিভিন্ন modes of operation ব্যবহার করা হয়।
এই modes-এর মধ্যে সবচেয়ে সাধারণগুলি হল ECB, CBC, CFB, এবং OFB, যা block cipher অ্যালগরিদমের আচরণকে পরিবর্তন করে।
Cipher Modes এর ধারণা:
- ECB (Electronic Codebook) Mode:
- এটি সবচেয়ে সহজ এবং সোজা cipher mode, যেখানে প্রতিটি ব্লক আলাদাভাবে এনক্রিপ্ট করা হয়। একটি নির্দিষ্ট key এবং block cipher algorithm ব্যবহার করে প্রতিটি ব্লক আলাদা আলাদা এনক্রিপ্ট করা হয়। ECB মুডের সবচেয়ে বড় সমস্যা হল এটি একেবারে নিরাপদ নয়, কারণ একই ইনপুট ব্লক প্রতিবার একই আউটপুট ব্লক তৈরি করবে, যা pattern বা repetition সনাক্ত করতে সাহায্য করে।
- Problem with ECB: যদি কিছু ডেটাতে পুনরাবৃত্তি থাকে (যেমন একই পাসওয়ার্ড বার বার ব্যবহৃত হচ্ছে), তাহলে আক্রমণকারী সহজেই সেই পুনরাবৃত্তি সনাক্ত করতে পারে, যা নিরাপত্তা বিঘ্নিত করতে পারে।
- Use Case: সাধারণত ECB mode অত্যন্ত নিরাপত্তাহীন বলে এটি বড় সিকিউরিটি ব্যবস্থায় ব্যবহার করা হয় না।
Example: ECB Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
public class ECBModeExample {
public static void main(String[] args) throws Exception {
// Key generation
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
// Cipher instance for ECB
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// Example of Encryption using ECB mode
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encrypted = cipher.doFinal("This is a test.".getBytes());
System.out.println("Encrypted: " + new String(encrypted));
// Example of Decryption using ECB mode
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Decrypted: " + new String(decrypted));
}
}
- CBC (Cipher Block Chaining) Mode:
- CBC হল একটি উন্নত পদ্ধতি যেখানে এনক্রিপশন প্রক্রিয়া শুরু করার জন্য একটি Initialization Vector (IV) ব্যবহার করা হয়। একটি ব্লক এনক্রিপ্ট করার জন্য, প্রথমে তার সাথে আগের ব্লকের এনক্রিপ্টেড আউটপুট XOR করা হয়। এটি একাধিক ব্লক এনক্রিপশনে শক্তিশালী নিরাপত্তা দেয় কারণ একই ইনপুটের জন্য প্রতিবার আলাদা আউটপুট তৈরি হয়।
- Security Advantage: যেহেতু ব্লকগুলো একে অপরের উপর নির্ভরশীল, তাই এক ব্লকের পরিবর্তন পুরো ডেটা সিস্টেমের মধ্যে পরিবর্তন আনবে, যা আক্রমণকারীদের জন্য কঠিন করে তোলে।
- Use Case: এটি নিরাপদ ব্লক সাইফার এনক্রিপশনের জন্য ব্যবহৃত হয়, বিশেষ করে যেখানে অনেক সিকিউরিটি প্রয়োজন।
Example: CBC Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.spec.IvParameterSpec;
public class CBCModeExample {
public static void main(String[] args) throws Exception {
// Key and IV generation
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
byte[] iv = new byte[16]; // Initialization Vector
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Cipher instance for CBC
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Encryption using CBC mode
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
byte[] encrypted = cipher.doFinal("This is a test.".getBytes());
System.out.println("Encrypted (CBC): " + new String(encrypted));
// Decryption using CBC mode
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Decrypted (CBC): " + new String(decrypted));
}
}
- CFB (Cipher Feedback) Mode:
- CFB হল একটি ব্লক সাইফার কিপিং মেথড যেখানে প্রতিটি ব্লক এনক্রিপ্ট করার জন্য আগের ব্লক থেকে আউটপুট ব্যবহার করা হয়। CFB বিভিন্ন ভ্যারিয়েন্টে আসে (CFB-1, CFB-8, CFB-128) যেখানে ব্লকের সাইজ পরিবর্তিত হয়। এটি stream cipher এর মতো কাজ করে, অর্থাৎ ইনপুট ডেটা ব্লক আকারে আছেঠেনা, বরং বিট বা ছোট ছোট অংশে এনক্রিপ্ট করা হয়।
- Security Advantage: এটি stream cipher এর মতো কাজ করার কারণে, key এবং IV প্রক্রিয়া ব্যবহার করার মাধ্যমে সিকিউরিটি বৃদ্ধি পায়।
- Use Case: এটি বিশেষত টাইম-সেন্সিটিভ ডেটা এনক্রিপশন এবং সিকিউরিটি অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়।
Example: CFB Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
public class CFBModeExample {
public static void main(String[] args) throws Exception {
// Key and IV generation
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
byte[] iv = new byte[16]; // Initialization Vector
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Cipher instance for CFB
Cipher cipher = Cipher.getInstance("AES/CFB8/PKCS5Padding");
// Encryption using CFB mode
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
byte[] encrypted = cipher.doFinal("This is a test.".getBytes());
System.out.println("Encrypted (CFB): " + new String(encrypted));
// Decryption using CFB mode
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Decrypted (CFB): " + new String(decrypted));
}
}
- OFB (Output Feedback) Mode:
- OFB একটি ব্লক সাইফার অপারেশন মুড যা ব্লক সাইফার এনক্রিপ্টের আউটপুটকে পরবর্তী ব্লক এনক্রিপ্ট করার জন্য ইনপুট হিসাবে ব্যবহার করে। এর মধ্যে initialization vector (IV) ব্যবহৃত হয়, যা আগে এনক্রিপ্ট করা আউটপুটের সাথে XOR করা হয়। এই মোডটি CFB এর মতো কাজ করে, তবে এতে ইনপুট ডেটা এবং সিকোয়েন্সের এনক্রিপ্টেড আউটপুটের মধ্যে সম্পর্ক ভিন্ন।
- Security Advantage: এটি নিরাপদ এবং সিকিউরিটি বৃদ্ধি পায় কারণ এতে আগের ব্লকগুলোর প্রভাব নেই এবং এটি সহজে error propagation রোধ করতে সাহায্য করে।
- Use Case: এটি এমন অ্যাপ্লিকেশনে ব্যবহৃত হয় যেখানে ছোট ব্লকগুলির এনক্রিপশন প্রয়োজন এবং ফাইল বা স্ট্রিম প্রক্রিয়াকরণে কাজ আসে।
Example: OFB Mode
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
public class OFBModeExample {
public static void main(String[] args) throws Exception {
// Key and IV generation
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
byte[] iv = new byte[16]; // Initialization Vector
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
// Cipher instance for OFB
Cipher cipher = Cipher.getInstance("AES/OFB/PKCS5Padding");
// Encryption using OFB mode
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
byte[] encrypted = cipher.doFinal("This is a test.".getBytes());
System.out.println("Encrypted (OFB): " + new String(encrypted));
// Decryption using OFB mode
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Decrypted (OFB): " + new String(decrypted));
}
}
Cipher Modes (ECB, CBC, CFB, OFB) হল ব্লক সাইফার এনক্রিপশনকে আরও শক্তিশালী এবং নিরাপদ করার জন্য ব্যবহৃত প্রক্রিয়া।
- ECB সহজ হলেও নিরাপত্তাহীন।
- CBC, CFB, এবং OFB সিকিউর এবং সাধারণত নিরাপত্তা অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়।
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