Java তে Padding ব্যবহার (PKCS5Padding, NoPadding)

Padding Techniques - জাভা ক্রিপ্টোগ্রাফি (Java Cryptography) - Java Technologies

365

Padding হল একটি ক্রিপ্টোগ্রাফিক কৌশল যা এনক্রিপ্ট করা ডেটার দৈর্ঘ্য সঠিক ব্লক সাইজে পূর্ণ করতে ব্যবহৃত হয়। Block Cipher অ্যালগরিদমগুলির মধ্যে, ডেটা এনক্রিপ্ট করার জন্য ব্লক সাইজে বিভক্ত করা হয় (যেমন 128-বিট, 256-বিট), কিন্তু কিছু বার্তা বা ডেটা এই ব্লক সাইজের সাথে পুরোপুরি মেলে না। এমন পরিস্থিতিতে, Padding ব্যবহার করা হয় যাতে পুরো ব্লক সাইজ পূর্ণ হয়।

Java Cryptography API (JCA) এ দুটি জনপ্রিয় Padding মোড আছে: PKCS5Padding এবং NoPadding। নিচে আমরা এই Padding মোডগুলি কীভাবে কাজ করে এবং কখন ব্যবহার করা উচিত তা আলোচনা করব।


1. PKCS5Padding

PKCS5Padding (Public Key Cryptography Standards #5) একটি জনপ্রিয় padding স্কিম, যা ব্লক সাইজের সাথে মেলে না এমন ডেটাকে পূর্ণ করতে ব্যবহৃত হয়। এটি সাধারণত 8-বাইট ব্লক সাইজের সিস্টেমে ব্যবহৃত হয়, তবে এটি সাধারণত AES বা অন্য ব্লক সাইজের সিস্টেমেও ব্যবহৃত হতে পারে।

PKCS5Padding এর কাজ করার প্রক্রিয়া:

  • যদি ব্লক সাইজের শেষ অংশ পূর্ণ না থাকে, তবে এটি সেই অংশের মধ্যে প্যাডিং অ্যাড করে, যাতে ডেটার দৈর্ঘ্য ব্লক সাইজের সাথে মেলে।
  • Padding টুকু সেই ব্লক সাইজের পরিমাণ হয়। উদাহরণস্বরূপ, যদি ব্লক সাইজ 8 বাইট হয় এবং বার্তাটি 5 বাইট থাকে, তবে PKCS5Padding 3 বাইট অ্যাড করবে, যেখানে প্রতিটি বাইটে মান থাকবে 0x03 (যেটি 3 বার্তা ব্লক সাইজে পূর্ণ করার জন্য হবে)।

PKCS5Padding উদাহরণ (AES এনক্রিপশন)

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class PKCS5PaddingExample {
    public static void main(String[] args) throws Exception {
        // AES Key জেনারেট করা
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);  // 128-bit AES key
        SecretKey secretKey = keyGenerator.generateKey();

        // Cipher তৈরি করা এবং ইনিশিয়ালাইজ করা
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // বার্তা এনক্রিপ্ট করা
        String message = "This is a test message.";
        byte[] encryptedBytes = cipher.doFinal(message.getBytes());

        // Encrypted বার্তা Base64 এ এনকোড করা
        String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted Message with PKCS5Padding: " + encryptedMessage);

        // Decrypting the message
        cipher.init(Cipher.DECRYPT_MODE, secretKey, cipher.getParameters());
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        String decryptedMessage = new String(decryptedBytes);
        System.out.println("Decrypted Message: " + decryptedMessage);
    }
}

ব্যাখ্যা:

  1. KeyGenerator: 128-বিট AES কী জেনারেট করা হয়েছে।
  2. Cipher.getInstance("AES/CBC/PKCS5Padding"): AES এনক্রিপশন CBC মোডে এবং PKCS5Padding ব্যবহার করা হয়েছে।
  3. cipher.doFinal(): এটি বার্তাটিকে এনক্রিপ্ট এবং ডিক্রিপ্ট করে।

Output:

Encrypted Message with PKCS5Padding: <encrypted message in Base64>
Decrypted Message: This is a test message.

2. NoPadding

NoPadding হল একটি padding অপশন যেখানে কোনও padding অ্যাড করা হয় না। এটি সাধারণত ব্যবহৃত হয় যখন ইনপুট ডেটার আকার সঠিক ব্লক সাইজের সাথে মেলে এবং আরও padding প্রয়োজন হয় না। যদি ইনপুট ডেটার দৈর্ঘ্য ব্লক সাইজের সাথে পুরোপুরি মেলে না, তবে NoPadding ব্যবহারে এনক্রিপশন ব্যর্থ হতে পারে।

NoPadding এর কাজ করার প্রক্রিয়া:

  • যদি ইনপুট ডেটার দৈর্ঘ্য ব্লক সাইজের সাথে মেলে না, তবে NoPadding দ্বারা এনক্রিপশন করা যাবে না। যদি ইনপুট ডেটার দৈর্ঘ্য ব্লক সাইজের সঙ্গে সঠিকভাবে মিলে না, তবে IllegalBlockSizeException পাওয়া যাবে।

NoPadding উদাহরণ (AES এনক্রিপশন)

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class NoPaddingExample {
    public static void main(String[] args) throws Exception {
        // AES Key জেনারেট করা
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);  // 128-bit AES key
        SecretKey secretKey = keyGenerator.generateKey();

        // Cipher তৈরি করা এবং ইনিশিয়ালাইজ করা
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // বার্তা এনক্রিপ্ট করা (যতটুকু আছেঃ ব্লক সাইজ 16-byte)
        String message = "1234567890123456"; // 16 bytes length (AES block size)
        byte[] encryptedBytes = cipher.doFinal(message.getBytes());

        // Encrypted বার্তা Base64 এ এনকোড করা
        String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted Message with NoPadding: " + encryptedMessage);

        // Decrypting the message
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        String decryptedMessage = new String(decryptedBytes);
        System.out.println("Decrypted Message: " + decryptedMessage);
    }
}

ব্যাখ্যা:

  1. KeyGenerator: 128-বিট AES কী জেনারেট করা হয়েছে।
  2. Cipher.getInstance("AES/ECB/NoPadding"): AES এনক্রিপশন ECB মোডে এবং NoPadding ব্যবহার করা হয়েছে।
  3. NoPadding ব্যবহারের জন্য, ডেটা অবশ্যই ব্লক সাইজের সাথে মিলে যেতে হবে (16-বাইটের ইনপুট এখানে ব্যবহৃত হয়েছে)।

Output:

Encrypted Message with NoPadding: <encrypted message in Base64>
Decrypted Message: 1234567890123456

3. Padding ব্যবহার করার সময় কী চিন্তা করা উচিত?

PKCS5Padding:

  • Flexibility: PKCS5Padding একটি খুবই সুরক্ষিত এবং সাধারণভাবে ব্যবহৃত padding স্কিম যা আপনার ডেটার আকার ব্লক সাইজে পূর্ণ না হলে তা স্বয়ংক্রিয়ভাবে পূর্ণ করে দেয়।
  • Compatibility: এটি বেশিরভাগ ক্রিপ্টোগ্রাফিক লাইব্রেরিতে সাপোর্টেড এবং নিরাপদ।
  • Recommended for General Use: আপনি যদি ব্লক সাইজে পূর্ণতা না পাওয়া ডেটার সাথে কাজ করেন, তবে PKCS5Padding সবচেয়ে ভাল পছন্দ।

NoPadding:

  • Use Case: যদি আপনি নিশ্চিত হন যে ইনপুট ডেটার দৈর্ঘ্য ব্লক সাইজের সাথে মেলে (যেমন 16 বাইটের ডেটা), তখন NoPadding ব্যবহার করা যেতে পারে।
  • Caution: তবে, যদি ইনপুট ডেটা ব্লক সাইজে পূর্ণ না হয়, তবে NoPadding ব্যর্থ হবে এবং IllegalBlockSizeException ছুড়ে দেবে।

Padding হল একটি গুরুত্বপূর্ণ পদ্ধতি যা ক্রিপ্টোগ্রাফিক ব্লক সাইফার ব্যবহারের জন্য ডেটার আকার সঠিকভাবে পূর্ণ করতে সহায়তা করে। Java তে PKCS5Padding এবং NoPadding দুটি প্রধান padding মেথড, যেখানে:

  • PKCS5Padding স্বয়ংক্রিয়ভাবে ডেটা পূর্ণ করে এবং এটি নিরাপদ ও সাধারণভাবে ব্যবহৃত।
  • NoPadding তখন ব্যবহৃত হয় যখন ডেটার দৈর্ঘ্য সঠিক ব্লক সাইজের সাথে মেলে, তবে যদি না মেলে তবে এটি ব্যর্থ হবে।
Content added By
Promotion

Are you sure to start over?

Loading...