Block Cipher হল একটি ক্রিপটোগ্রাফি এলগোরিদম যা একটি নির্দিষ্ট ব্লক সাইজে ডেটা এনক্রিপ্ট করে। Block Cipher শুধুমাত্র নির্দিষ্ট আকারের (যেমন 64-বিট, 128-বিট) ব্লক ডেটাকে প্রক্রিয়া করতে পারে। কিন্তু অনেক সময় ডেটার আকার ব্লক সাইজের একাধিক অংশে ভাগ করা সম্ভব হয় না, অর্থাৎ ডেটার আকার ব্লক সাইজের গুণিতক না হলে, কীভাবে শেষ অংশে প্রক্রিয়া করা হবে তা একটি সমস্যা হয়ে দাঁড়ায়। এই সমস্যার সমাধান হিসেবে Padding ব্যবহার করা হয়।
Padding হল একটি প্রক্রিয়া যেখানে ব্লক সাইজ পূর্ণ না হলে অতিরিক্ত কিছু বাইট যোগ করা হয়, যাতে ব্লকের আকার ঠিক হয়। এটি ব্লক সাইফারের জন্য প্রয়োজনীয় হতে পারে, কারণ এটি ব্লক সাইজের ভিত্তিতে ডেটাকে সঠিকভাবে প্রক্রিয়া করতে সাহায্য করে।
Padding এর উদ্দেশ্য:
- ডেটার আকার পূর্ণ করা: ব্লক সাইজের সাথে ডেটার আকারের মিল না থাকলে অতিরিক্ত বাইট যোগ করে ডেটা একটি পূর্ণ ব্লক তৈরি করা হয়।
- বিশ্বস্ততা নিশ্চিত করা: Padding প্রক্রিয়া নিশ্চিত করে যে ডেটা সঠিকভাবে এনক্রিপ্ট এবং ডিক্রিপ্ট হতে পারে এবং তার কোন পরিবর্তন বা ভুল হবে না।
- নিরাপত্তা: Padding নিশ্চিত করে যে, ইনপুট ডেটার আকার সঠিকভাবে পূর্ণ হওয়া ছাড়া আক্রমণকারী কোনভাবেই ডেটা অনুমান করতে পারবে না।
Padding এর বিভিন্ন ধরনের কৌশল
Padding অনেক ধরনের হতে পারে, তবে সবচেয়ে জনপ্রিয় কিছু পদ্ধতি হল:
PKCS7 (Public Key Cryptography Standard #7):
- PKCS7 হলো সবচেয়ে সাধারণ padding পদ্ধতি। এতে, যতটুকু padding প্রয়োজন, তা একই বাইট (যেমন 0x01, 0x02, 0x03 ইত্যাদি) দিয়ে পূর্ণ করা হয়। এটি block size এর সাথে সামঞ্জস্যপূর্ণ এবং এটি সহজেই ডিক্রিপশন করা যায়।
উদাহরণ: যদি ব্লক সাইজ 16 বাইট হয় এবং আপনি 14 বাইট ডেটা এনক্রিপ্ট করছেন, তাহলে শেষ দুটি বাইট 0x02 দ্বারা পূর্ণ করা হবে।
- ISO/IEC 10126 Padding:
- ISO/IEC 10126 প্যাডিং পদ্ধতিতে, সবশেষ বাইটটি কতগুলো বাইট প্রয়োজন তা জানায় এবং বাকী বাইটগুলি এলোমেলো ভ্যালু দ্বারা পূর্ণ করা হয়।
- ANSI X.923 Padding:
- ANSI X.923 প্যাডিং পদ্ধতিতে, ব্লকের শেষে 0x00 দিয়ে বাকি বাইটগুলো পূর্ণ করা হয়, এবং শেষ বাইটে padding length সন্নিবেশ করা হয়।
- Zero Padding:
- Zero Padding-এ, ব্লকটির শেষে 0x00 বাইট যোগ করা হয়। এটি সাধারনভাবে ব্যবহৃত হয়, কিন্তু নিরাপত্তা ক্ষেত্রে কিছু ঝুঁকি থাকতে পারে, কারণ অনেক সময় ইনপুট ডেটা যেহেতু শেষের দিকে 0x00 রাখতে পারে, তখন এটি সঠিকভাবে ডিক্রিপ্ট না হতে পারে।
Java তে Block Cipher এ Padding ব্যবহারের উদাহরণ
Java Cryptography API (JCA) তে Block Cipher ব্যবহার করার সময়, প্যাডিং সাধারণত স্বয়ংক্রিয়ভাবে Cipher ক্লাসের মাধ্যমে পরিচালিত হয়। এখানে AES এনক্রিপশন এবং PKCS7 padding ব্যবহারের একটি উদাহরণ দেওয়া হল।
AES Block Cipher এ Padding উদাহরণ
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class AESPaddingExample {
public static void main(String[] args) throws Exception {
// Generate AES Key
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 128-bit AES key
SecretKey secretKey = keyGen.generateKey();
// AES cipher using CBC mode with PKCS7 Padding
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Generate an initialization vector (IV)
byte[] iv = new byte[16]; // AES block size is 16 bytes
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// Initialize the cipher for encryption
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
// The message to encrypt
String message = "Hello, this is a test message!";
// Encrypt the message
byte[] encryptedMessage = cipher.doFinal(message.getBytes());
// Encode the encrypted message to Base64 for display
String encryptedBase64 = Base64.getEncoder().encodeToString(encryptedMessage);
System.out.println("Encrypted Message: " + encryptedBase64);
// Initialize the cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
// Decrypt the message
byte[] decryptedMessage = cipher.doFinal(encryptedMessage);
// Print the decrypted message
String decryptedText = new String(decryptedMessage);
System.out.println("Decrypted Message: " + decryptedText);
}
}
ব্যাখ্যা:
- Cipher.getInstance("AES/CBC/PKCS5Padding"): এই লাইনটি AES এনক্রিপশনকে CBC mode এবং PKCS5Padding সহ ইনিশিয়ালাইজ করে।
AES: এনক্রিপশন এলগোরিদমCBC: Cipher Block Chaining মোড, যা ব্লক সাইফারে এনক্রিপশন প্রক্রিয়াকে আরও সুরক্ষিত করে।PKCS5Padding: প্যাডিং কৌশল যা ব্লক সাইজ পূর্ণ করার জন্য ব্যবহৃত হয়।
- IvParameterSpec: Initialization Vector (IV) হলো একটি র্যান্ডম ডেটা যা ব্লক সাইফার মোডের জন্য ব্যবহৃত হয়। IV সঠিকভাবে এনক্রিপশন এবং ডিক্রিপশনের জন্য অত্যন্ত গুরুত্বপূর্ণ।
- cipher.doFinal(): এই মেথডটি ডেটা এনক্রিপ্ট বা ডিক্রিপ্ট করার জন্য ব্যবহৃত হয়।
- Base64 Encoding: এনক্রিপ্ট করা ডেটা
Base64এনকোডিং ব্যবহার করে পাঠযোগ্য আকারে রূপান্তরিত করা হয়।
Output:
Encrypted Message: Yl4+68lExdFCEdb3fGnBhCw2t6uQHmM4Pn2BQsl5hb4=
Decrypted Message: Hello, this is a test message!
এখানে:
- Encrypted Message: প্যাডিং সহ এনক্রিপ্ট করা বার্তা
Base64এনকোডিং আকারে দেখানো হয়েছে। - Decrypted Message: ডিক্রিপ্ট করার পর মূল বার্তা ফিরে এসেছে, এবং প্যাডিং স্বয়ংক্রিয়ভাবে সরিয়ে ফেলা হয়েছে।
Padding এর গুরুত্ব
- Block Size Alignment: Padding নিশ্চিত করে যে ব্লক সাইজের সাথে ডেটার আকার মিলে যায়। এটি ব্লক সাইফারের জন্য অপরিহার্য, কারণ সাইফারের জন্য নির্দিষ্ট ব্লক সাইজ প্রয়োজন।
- Security: Padding ডেটার সুরক্ষা নিশ্চিত করে। উদাহরণস্বরূপ, PKCS7 padding নিশ্চিত করে যে ডেটার শেষের অংশে কিছু অতিরিক্ত বাইট থাকবে যা ডেটার সঠিকভাবে পুনঃপ্রক্রিয়াকরণের জন্য প্রয়োজনীয়।
- Flexibility: Padding কৌশলগুলি বিভিন্ন ব্লক সাইজের সাথে কাজ করতে সক্ষম, যার ফলে এটি অনেক ধরণের সিস্টেমে কার্যকরী হয়।
Padding হল Block Cipher প্রক্রিয়ার একটি গুরুত্বপূর্ণ অংশ। এটি ব্লক সাইজের সাথে ডেটার আকার সঠিকভাবে মিলিয়ে আনে, যাতে ক্রিপটোগ্রাফিক এলগোরিদম সঠিকভাবে কাজ করতে পারে। Java Cryptography API (JCA) ব্যবহার করে, আপনি সহজেই AES বা অন্য কোন ব্লক সাইফার ব্যবহার করে Padding প্রক্রিয়াকে অ্যাপ্লাই করতে পারেন। PKCS7 (বা PKCS5Padding) হল সবচেয়ে জনপ্রিয় padding কৌশল, যা নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে ব্যবহৃত হয়।
Read more