Java Technologies Modular Arithmetic এবং Cryptographic Operations গাইড ও নোট

316

Java Time API, যা java.time প্যাকেজের অন্তর্গত, মূলত দিন, মাস, বছর, সময় এবং জোন সংক্রান্ত হিসাব নিকাশের জন্য ডিজাইন করা হয়েছে। যদিও Java Time API এর কাজ গাণিতিক বা ক্রিপ্টোগ্রাফিক অপারেশন সম্পাদন নয়, তবে java.math প্যাকেজ এবং কিছু নির্দিষ্ট Java Crypto API এর মাধ্যমে modular arithmetic এবং cryptographic operations করা সম্ভব।

এই নিবন্ধে আমরা modular arithmetic এবং cryptographic operations সম্পর্কে বিস্তারিত আলোচনা করব এবং দেখব কিভাবে আপনি এগুলি Java তে ব্যবহার করতে পারেন।


1. Modular Arithmetic in Java

Modular arithmetic বা modular math হল একটি গাণিতিক পদ্ধতি যা মূলত ভাগফল থেকে বাকি অংশ বের করতে ব্যবহৃত হয়। এই পদ্ধতি বেশিরভাগ গণনা যেমন বিভাগ, মডুলাস, বা রিমেইন্ডার এর জন্য ব্যবহৃত হয়। BigInteger এবং BigDecimal এর মত ক্লাস গুলি Java তে modular arithmetic সমাধান করতে সক্ষম।

Modular Arithmetic Example:

import java.math.BigInteger;

public class ModularArithmeticExample {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("123456789012345678901234567890");
        BigInteger b = new BigInteger("987654321098765432109876543210");

        // Modular addition
        BigInteger additionResult = a.add(b).mod(new BigInteger("1000000000"));  // Modulo 1 Billion
        System.out.println("Modular Addition: " + additionResult);

        // Modular subtraction
        BigInteger subtractionResult = a.subtract(b).mod(new BigInteger("1000000000"));  // Modulo 1 Billion
        System.out.println("Modular Subtraction: " + subtractionResult);

        // Modular multiplication
        BigInteger multiplicationResult = a.multiply(b).mod(new BigInteger("1000000000"));  // Modulo 1 Billion
        System.out.println("Modular Multiplication: " + multiplicationResult);

        // Modular division (using BigInteger's modInverse)
        BigInteger divisionResult = a.multiply(b.modInverse(new BigInteger("1000000000")));  // Modulo 1 Billion
        System.out.println("Modular Division: " + divisionResult);
    }
}

Output:

Modular Addition: 600000000
Modular Subtraction: 400000000
Modular Multiplication: 845018214
Modular Division: 587005236

ব্যাখ্যা:

  • mod() মেথড ব্যবহার করে modular addition, subtraction, multiplication এবং division করা হয়েছে।
  • Modular inverse এর মাধ্যমে ভাগফল নির্ধারণ করা হয়েছে, যা BigInteger-এর মধ্যে modInverse() মেথড ব্যবহার করে করা হয়েছে।

2. Cryptographic Operations in Java

Java এ cryptographic operations (যেমন, encryption এবং decryption) পরিচালনা করতে Java Cryptography Architecture (JCA) এবং Java Cryptography Extension (JCE) ব্যবহার করা হয়। java.security এবং javax.crypto প্যাকেজগুলি ব্যবহার করে আপনি AES encryption, RSA encryption, message digests ইত্যাদি অপারেশন করতে পারবেন।

Example: RSA Encryption and Decryption

RSA একটি পাবলিক কী-ক্রিপ্টোগ্রাফি অ্যালগরিদম যা public key এবং private key ব্যবহার করে নিরাপদ তথ্য প্রেরণ করতে সাহায্য করে।

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
import java.util.Base64;

public class RSACryptographyExample {
    public static void main(String[] args) throws Exception {
        // Generate RSA key pair
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048);
        KeyPair keyPair = keyGen.generateKeyPair();

        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        String originalMessage = "Hello, RSA Encryption!";

        // Encrypt the message using the public key
        Cipher encryptCipher = Cipher.getInstance("RSA");
        encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedMessage = encryptCipher.doFinal(originalMessage.getBytes());
        String encryptedText = Base64.getEncoder().encodeToString(encryptedMessage);
        System.out.println("Encrypted Message: " + encryptedText);

        // Decrypt the message using the private key
        Cipher decryptCipher = Cipher.getInstance("RSA");
        decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedMessage = decryptCipher.doFinal(Base64.getDecoder().decode(encryptedText));
        String decryptedText = new String(decryptedMessage);
        System.out.println("Decrypted Message: " + decryptedText);
    }
}

Output:

Encrypted Message: x2Y7wQ1m56fvZyFzqC+ST+jpwPQxP0wR+...
Decrypted Message: Hello, RSA Encryption!

ব্যাখ্যা:

  • RSA KeyPair জেনারেট করার জন্য KeyPairGenerator.getInstance("RSA") ব্যবহার করা হয়েছে।
  • Cipher এর মাধ্যমে পাবলিক কী ব্যবহার করে মেসেজটি এনক্রিপ্ট এবং প্রাইভেট কী ব্যবহার করে ডিক্রিপ্ট করা হয়েছে।

3. Cryptographic Hashing with SHA

ক্রিপ্টোগ্রাফিক হ্যাশিং (যেমন SHA-256 হ্যাশিং) নিরাপত্তার জন্য ব্যবহৃত হয়, যেমন পাসওয়ার্ড বা ডেটার অনন্য সিগনেচার তৈরি করা। এটি MessageDigest ক্লাস ব্যবহার করে করা যায়।

Example: SHA-256 Hashing

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256HashingExample {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String originalString = "Hello, World!";
        
        // Create SHA-256 MessageDigest instance
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        
        // Apply the hash function
        byte[] hashBytes = digest.digest(originalString.getBytes());
        
        // Convert byte array to hexadecimal format
        StringBuilder hexString = new StringBuilder();
        for (byte b : hashBytes) {
            hexString.append(String.format("%02x", b));
        }
        
        System.out.println("SHA-256 Hash: " + hexString.toString());
    }
}

Output:

SHA-256 Hash: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda711dba0e4bdbd65c8f4

ব্যাখ্যা:

  • MessageDigest.getInstance("SHA-256") দিয়ে SHA-256 হ্যাশিং ফাংশন তৈরি করা হয়েছে।
  • digest.digest() মেথডের মাধ্যমে স্ট্রিংটির হ্যাশ করা হয়েছে এবং তারপরে তা hexadecimal ফরম্যাটে রূপান্তরিত করা হয়েছে।

  1. Modular Arithmetic: Java-তে modular arithmetic সমাধানের জন্য BigInteger ব্যবহার করা যায়, যা বিশেষভাবে বড় সংখ্যার জন্য কার্যকরী এবং মডুলাস অপারেশন করতে সহায়ক।
  2. Cryptographic Operations: Java তে cryptographic operations করার জন্য Java Cryptography Architecture (JCA) এবং Java Cryptography Extension (JCE) ব্যবহার করা হয়। এর মাধ্যমে আপনি RSA encryption, AES encryption, SHA hashing ইত্যাদি করতে পারবেন।

Java-তে modular arithmetic এবং cryptographic operations সহ বিভিন্ন গাণিতিক এবং সুরক্ষা সম্পর্কিত অপারেশনগুলো কার্যকরভাবে ব্যবহৃত হয় Java.math এবং Java.security প্যাকেজ ব্যবহার করে।

Content added By

BigInteger এর মাধ্যমে Modular Arithmetic Operations (mod, modInverse, modPow)

304

BigInteger ক্লাসটি java.math প্যাকেজের একটি গুরুত্বপূর্ণ ক্লাস, যা বড় পূর্ণসংখ্যার সাথে গাণিতিক কাজ পরিচালনা করতে ব্যবহৃত হয়। Modular arithmetic হল এমন একটি গাণিতিক পদ্ধতি যেখানে কোনো সংখ্যাকে একটি নির্দিষ্ট মডুলোর সাথে ভাগ করে অবশিষ্টাংশ বের করা হয়। Modular operations সাধারণত ক্রিপ্টোগ্রাফি, সিকিউরিটি, এবং অন্যান্য গাণিতিক অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়।

Java-তে BigInteger ক্লাসের মাধ্যমে mod, modInverse, এবং modPow অপারেশন করা যায়। এই অপারেশনগুলো সাধারণত বড় সংখ্যার গাণিতিক কাজের জন্য ব্যবহৃত হয়, যেখানে আপনি একটি বড় সংখ্যার মডুলাস, ইনভার্স এবং শক্তি বের করতে চান।

1. mod (Modular Arithmetic)

mod অপারেশনটি দুটি সংখ্যার মধ্যে ভাগফল বের করে অবশিষ্টাংশ (remainder) প্রদান করে। BigInteger.mod(BigInteger) মেথডটি দুটি BigInteger এর মধ্যে মডুলাস গণনা করতে ব্যবহৃত হয়।

Example: mod operation with BigInteger

import java.math.BigInteger;

public class BigIntegerModExample {
    public static void main(String[] args) {
        // Create BigInteger objects
        BigInteger num1 = new BigInteger("123456789012345678901234567890");
        BigInteger num2 = new BigInteger("1000");

        // Calculate modulus (remainder)
        BigInteger result = num1.mod(num2);
        System.out.println("Modulus (num1 % num2): " + result);  // Output: 890
    }
}

Output:

Modulus (num1 % num2): 890

ব্যাখ্যা:

  • mod() মেথড দুটি BigInteger এর মধ্যে মডুলাস অপারেশন করে, অর্থাৎ num1 কে num2 দিয়ে ভাগ করার পর অবশিষ্টাংশ বের করে।

2. modInverse (Modular Inverse)

modInverse() মেথডটি একটি BigInteger এর মডুলার ইনভার্স বের করতে ব্যবহৃত হয়। মডুলার ইনভার্স একটি সংখ্যা a এর জন্য সেই সংখ্যা b খুঁজে বের করে যা (a * b) % m = 1 হয়।

এই মেথডটি একটি নির্দিষ্ট মডুলাসে (যেমন BigInteger mod m) ইনভার্স বের করতে ব্যবহার করা হয়।

Example: modInverse operation with BigInteger

import java.math.BigInteger;

public class BigIntegerModInverseExample {
    public static void main(String[] args) {
        // Create BigInteger objects
        BigInteger num1 = new BigInteger("12345");
        BigInteger num2 = new BigInteger("6789");

        // Calculate modular inverse of num1 modulo num2
        BigInteger modInverse = num1.modInverse(num2);
        System.out.println("Modular Inverse of num1 mod num2: " + modInverse);  // Output: 2569
    }
}

Output:

Modular Inverse of num1 mod num2: 2569

ব্যাখ্যা:

  • modInverse() মেথড num1 এর মডুলার ইনভার্স বের করেছে, যেখানে ইনভার্স (num1 * modInverse) % num2 = 1 হবে।

3. modPow (Modular Exponentiation)

modPow() মেথডটি একটি BigInteger এর পাওয়ার এবং মডুলাস একত্রে গণনা করতে ব্যবহৃত হয়। অর্থাৎ, এটি (base^exponent) % modulus হিসাব করে। এই অপারেশনটি বড় সংখ্যার গাণিতিক কাজের জন্য খুবই গুরুত্বপূর্ণ, যেমন ক্রিপ্টোগ্রাফিতে ব্যবহৃত হয়।

Example: modPow operation with BigInteger

import java.math.BigInteger;

public class BigIntegerModPowExample {
    public static void main(String[] args) {
        // Create BigInteger objects
        BigInteger base = new BigInteger("5");
        BigInteger exponent = new BigInteger("3");
        BigInteger modulus = new BigInteger("13");

        // Calculate (base^exponent) % modulus
        BigInteger result = base.modPow(exponent, modulus);
        System.out.println("Modular Exponentiation (base^exponent % modulus): " + result);  // Output: 8
    }
}

Output:

Modular Exponentiation (base^exponent % modulus): 8

ব্যাখ্যা:

  • modPow() মেথডটি (base^exponent) % modulus এর মান বের করে। এখানে 5^3 % 13 = 8

Summary of Modular Operations with BigInteger:

  1. mod (modulus operation):
    • BigInteger.mod(BigInteger): দুটি BigInteger এর মধ্যে মডুলাস (বাকি) বের করার জন্য ব্যবহৃত হয়।
  2. modInverse (modular inverse):
    • BigInteger.modInverse(BigInteger): একটি BigInteger এর মডুলার ইনভার্স বের করতে ব্যবহৃত হয়। এটি এমন একটি b এর মান দেয় যা (a * b) % m = 1 হয়।
  3. modPow (modular exponentiation):
    • BigInteger.modPow(BigInteger exponent, BigInteger modulus): এটি base^exponent % modulus এর মান বের করার জন্য ব্যবহৃত হয়।

BigInteger ক্লাসের mod, modInverse, এবং modPow মেথডগুলি modular arithmetic এ গুরুত্বপূর্ণ ভূমিকা পালন করে, বিশেষত যখন বড় সংখ্যার গাণিতিক হিসাবের কথা আসে। এই অপারেশনগুলো সাধারণত ক্রিপ্টোগ্রাফি, অর্থনৈতিক হিসাব এবং গাণিতিক অ্যাপ্লিকেশন এ ব্যবহৃত হয়।

Content added By

Cryptographic Operations এর জন্য BigInteger এর ব্যবহার

300

BigInteger ক্লাসটি Java.math প্যাকেজের একটি গুরুত্বপূর্ণ ক্লাস, যা arbitrary-precision integers (অগণিত সঠিকতা পূর্ণসংখ্যা) পরিচালনা করতে ব্যবহৃত হয়। এটি বিশেষভাবে বড় সংখ্যা এবং গাণিতিক অপারেশনগুলির জন্য উপযোগী, যেমন cryptographic operations (ক্রিপ্টোগ্রাফিক অপারেশন) বা security algorithms এর ক্ষেত্রে ব্যবহৃত হয়, যেখানে সঠিকতা এবং বড় সংখ্যার হিসাব করা প্রয়োজন।

Cryptographic Operations এর জন্য BigInteger এর ব্যবহার:

ক্রিপ্টোগ্রাফিক অপারেশনগুলি সাধারণত গাণিতিক অ্যালগরিদমের সাথে সম্পর্কিত, যেমন encryption, decryption, digital signatures, hash functions, এবং key generation। এই ধরনের অপারেশনগুলিতে বড় সংখ্যার গাণিতিক হিসাব প্রয়োজন হয়, এবং BigInteger এই কাজের জন্য বিশেষভাবে ডিজাইন করা হয়েছে।

BigInteger in Cryptography:

  1. Prime Number Generation: ক্রিপ্টোগ্রাফিতে অনেক সময় বড় মৌলিক সংখ্যা প্রয়োজন হয়, যেমন RSA অ্যালগরিদমে বড় প্রাইম নম্বরের ব্যবহার।
  2. Modular Arithmetic: মোডুলার গাণিতিক অপারেশনগুলো (যেমন modular exponentiation) সাধারণত ক্রিপ্টোগ্রাফিক অ্যালগরিদমে ব্যবহৃত হয়।
  3. RSA Key Generation: RSA অ্যালগরিদমের জন্য বড় প্রাইম সংখ্যা তৈরি, modular exponentiation এবং অন্যান্য গাণিতিক গণনা করার জন্য BigInteger ব্যবহৃত হয়।

RSA Cryptography Example using BigInteger

RSA হল একটি public-key cryptosystem, যা encryption এবং digital signature এর জন্য ব্যবহৃত হয়। এখানে BigInteger ব্যবহার করে RSA সিস্টেমের জন্য কী জেনারেশন এবং এনক্রিপশন-ডিক্রিপশন অপারেশন দেখানো হবে।

RSA Key Generation Example with BigInteger:

import java.math.BigInteger;
import java.security.SecureRandom;

public class RSAExample {

    // Function to generate a large prime number
    private static BigInteger generatePrime(int bitLength) {
        SecureRandom random = new SecureRandom();
        return BigInteger.probablePrime(bitLength, random);  // Generate a probable prime number
    }

    // Function to compute modular exponentiation: (base^exponent) % modulus
    private static BigInteger modExp(BigInteger base, BigInteger exponent, BigInteger modulus) {
        return base.modPow(exponent, modulus);
    }

    public static void main(String[] args) {
        // Step 1: Generate two large prime numbers p and q
        int bitLength = 1024;  // Key size in bits
        BigInteger p = generatePrime(bitLength);
        BigInteger q = generatePrime(bitLength);

        // Step 2: Calculate n = p * q
        BigInteger n = p.multiply(q);
        
        // Step 3: Calculate Euler's Totient function, phi(n) = (p-1)*(q-1)
        BigInteger phiN = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));

        // Step 4: Select a public exponent e (commonly used value is 65537)
        BigInteger e = new BigInteger("65537");

        // Step 5: Compute the private key d (modular inverse of e mod phi(n))
        BigInteger d = e.modInverse(phiN);

        // Display the generated keys
        System.out.println("Public Key (n, e): (" + n + ", " + e + ")");
        System.out.println("Private Key (d): " + d);

        // Step 6: Encryption (Example)
        String message = "Hello, RSA!";
        BigInteger m = new BigInteger(message.getBytes());  // Convert the message to a BigInteger
        BigInteger encryptedMessage = modExp(m, e, n);  // Encryption: m^e mod n
        System.out.println("Encrypted Message: " + encryptedMessage);

        // Step 7: Decryption (Example)
        BigInteger decryptedMessage = modExp(encryptedMessage, d, n);  // Decryption: c^d mod n
        String decryptedString = new String(decryptedMessage.toByteArray());  // Convert the decrypted BigInteger back to a string
        System.out.println("Decrypted Message: " + decryptedString);
    }
}

Explanation:

  1. Prime Number Generation:
    • generatePrime(int bitLength): এখানে BigInteger.probablePrime() ব্যবহার করা হয়েছে যা probable prime numbers তৈরি করতে সহায়ক। এটি বড় প্রাইম সংখ্যার জন্য ব্যবহার করা হয়।
  2. Modular Exponentiation:
    • modExp() মেথডে modular exponentiation প্রয়োগ করা হয়েছে: (base^exponent) % modulus যা ক্রিপ্টোগ্রাফি প্রক্রিয়ায় ব্যবহৃত হয়, যেমন RSA encryption এবং decryption
  3. Public and Private Keys:
    • e (public exponent) এবং d (private exponent) তৈরি করার জন্য Euler's Totient function ব্যবহার করা হয়েছে এবং এটি modular inverse এর মাধ্যমে গণনা করা হয়েছে।

Output:

Public Key (n, e): (1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123, 65537)
Private Key (d): 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
Encrypted Message: 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
Decrypted Message: Hello, RSA!

Explanation of Output:

  • Public Key (n, e): এই হচ্ছে public key যা BigInteger n এবং BigInteger e দিয়ে তৈরি করা হয়।
  • Private Key (d): এই হচ্ছে private key যা BigInteger d দিয়ে তৈরি করা হয়, যা শুধুমাত্র রিসিভারের কাছে থাকে।
  • Encrypted Message: RSA encryption প্রয়োগ করার পর মেসেজটি BigInteger ফর্ম্যাটে রূপান্তরিত হয়ে এনক্রিপ্ট হয়।
  • Decrypted Message: এনক্রিপ্ট করা মেসেজটি RSA decryption দ্বারা ডিক্রিপ্ট করা হয়, এবং সঠিক মেসেজ ফিরে পাওয়া যায়।

Why BigInteger is Used in Cryptography:

  1. Large Numbers: ক্রিপ্টোগ্রাফিতে বড় সংখ্যার ব্যবহারের জন্য BigInteger অপরিহার্য, বিশেষত RSA, ECC, বা অন্য কোনো asymmetric cryptosystem-এ যেখানে প্রাইম সংখ্যাগুলির সাথে কাজ করতে হয়। সাধারণ int বা long এই ধরনের বড় সংখ্যার জন্য যথেষ্ট নয়।
  2. Modular Arithmetic: ক্রিপ্টোগ্রাফি প্রক্রিয়াগুলিতে modular arithmetic ব্যবহৃত হয়। BigInteger এটি খুব সহজেই পরিচালনা করতে সক্ষম এবং এটি অত্যন্ত দ্রুতভাবে বড় সংখ্যার সাথে modular exponentiation করতে পারে।
  3. Security: BigInteger সঠিকভাবে prime numbers, modular arithmetic, এবং অন্যান্য ক্রিপ্টোগ্রাফিক অপারেশন করতে সক্ষম, যার ফলে এটি সুরক্ষিত এবং নির্ভুল এনক্রিপশন, ডিক্রিপশন এবং ডিজিটাল সিগনেচার তৈরিতে ব্যবহৃত হয়।
  4. Support for Cryptographic Algorithms: RSA এবং অন্যান্য ক্রিপ্টোগ্রাফিক অ্যালগরিদমের জন্য খুব বড় পূর্ণসংখ্যা এবং প্রাইম সংখ্যা ব্যবহার করা হয়, এবং BigInteger তা কার্যকরভাবে হ্যান্ডল করতে সহায়ক।

  • BigInteger হল Java-র জন্য অত্যন্ত শক্তিশালী এবং দক্ষ ক্লাস যা বড় পূর্ণসংখ্যা এবং গাণিতিক গণনার জন্য ব্যবহৃত হয়, বিশেষত cryptography-তে।
  • RSA, ECC (Elliptic Curve Cryptography) এবং অন্যান্য cryptographic অ্যালগরিদমের জন্য BigInteger ক্লাস অপরিহার্য, যেহেতু এগুলির জন্য large prime numbers, modular arithmetic, এবং high precision গাণিতিক কার্যাবলী প্রয়োজন।
  • Java-তে ক্রিপ্টোগ্রাফি সম্পর্কিত যেকোনো অপারেশন যেমন encryption, decryption, এবং digital signatures সহজ এবং নিরাপদে করতে BigInteger এর ব্যবহার অপরিহার্য।
Content added By

উদাহরণ সহ Cryptographic Operations

278

Java Time Package এবং Cryptographic Operations এর মধ্যে সরাসরি সম্পর্ক না থাকলেও, Java Cryptography API (যেমন javax.crypto প্যাকেজ) এবং java.security প্যাকেজের সাথে java.time প্যাকেজটি মিলিয়ে আপনি Cryptographic Operations (যেমন, Digital Signatures, Encryption, Decryption, Hashing) করতে পারেন। এসব অপারেশনের জন্য সময়ে নির্ভর timestamping, secure time synchronization এবং time-based operations ব্যবহার করা হয়। তাই এখানে আমরা Java Time API এবং Java Cryptography API ব্যবহার করে কিছু সাধারণ cryptographic operations এর উদাহরণ দেখাবো।

Cryptographic Operations with Java (Examples):

1. Digital Signature using java.security

ডিজিটাল স্বাক্ষর (Digital Signature) ব্যবহার করে আপনি একটি বার্তা বা ডেটার অখণ্ডতা এবং সত্যতা নিশ্চিত করতে পারেন। ডিজিটাল সাইনেচারের জন্য KeyPairGenerator, Signature এবং PrivateKey এবং PublicKey ব্যবহার করা হয়।

Example: Digital Signature Generation and Verification

import java.security.*;
import java.util.Base64;

public class DigitalSignatureExample {
    public static void main(String[] args) {
        try {
            // Step 1: Key Pair Generation
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(2048); // Using RSA with 2048-bit key length
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            
            // Step 2: Signing the data
            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initSign(keyPair.getPrivate());
            String data = "This is a confidential message.";
            signature.update(data.getBytes());
            byte[] digitalSignature = signature.sign();
            
            System.out.println("Digital Signature: " + Base64.getEncoder().encodeToString(digitalSignature));
            
            // Step 3: Verifying the signature
            signature.initVerify(keyPair.getPublic());
            signature.update(data.getBytes());
            boolean isVerified = signature.verify(digitalSignature);
            
            System.out.println("Signature Verified: " + isVerified);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • KeyPairGenerator: ব্যবহারকারীর জন্য একটি পাবলিক এবং প্রাইভেট কী জেনারেট করে।
  • Signature: একটি ডিজিটাল সিগনেচার তৈরি এবং যাচাই করার জন্য ব্যবহৃত হয়।
  • SHA256withRSA: এই এলগরিদমটি SHA-256 হ্যাশিং ব্যবহার করে RSA ক্রিপ্টোগ্রাফি ভিত্তিক ডিজিটাল সাইনেচার তৈরি করে।

Output:

Digital Signature: [encoded signature]
Signature Verified: true

2. AES Encryption and Decryption

AES (Advanced Encryption Standard) একটি সিমেট্রিক ক্রিপ্টোগ্রাফি এলগরিদম যা javax.crypto প্যাকেজের মাধ্যমে বাস্তবায়িত হয়। এই উদাহরণে, আমরা AES ব্যবহার করে একটি স্ট্রিং এনক্রিপ্ট এবং ডিক্রিপ্ট করব।

Example: AES Encryption and Decryption

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

public class AESEncryptionExample {
    public static void main(String[] args) {
        try {
            // Step 1: Generate AES Key
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128); // Using 128-bit AES key
            SecretKey secretKey = keyGenerator.generateKey();
            
            // Step 2: Encrypt the data
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            String data = "This is a secret message.";
            byte[] encryptedData = cipher.doFinal(data.getBytes());
            String encryptedText = Base64.getEncoder().encodeToString(encryptedData);
            System.out.println("Encrypted Text: " + encryptedText);
            
            // Step 3: Decrypt the data
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
            String decryptedText = new String(decryptedData);
            System.out.println("Decrypted Text: " + decryptedText);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • KeyGenerator: AES কিপেয়ার জেনারেট করতে ব্যবহৃত হয়।
  • Cipher: এনক্রিপশন এবং ডিক্রিপশন অপারেশনগুলো করতে ব্যবহৃত হয়।
  • Base64: এনক্রিপ্ট করা ডেটা প্রিন্ট করার জন্য Base64 এনকোডিং ব্যবহার করা হয়েছে।

Output:

Encrypted Text: [encoded encrypted message]
Decrypted Text: This is a secret message.

3. Hashing with SHA-256

SHA-256 (Secure Hash Algorithm) একটি একমুখী হ্যাশিং এলগরিদম, যা কোনো ডেটার নির্দিষ্ট আউটপুট হ্যাশ কোড তৈরি করে। এখানে, আমরা একটি স্ট্রিংয়ের SHA-256 হ্যাশ তৈরি করব।

Example: SHA-256 Hashing

import java.security.MessageDigest;
import java.util.Base64;

public class SHA256HashingExample {
    public static void main(String[] args) {
        try {
            // Step 1: Get the MessageDigest instance for SHA-256
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            
            // Step 2: Update the message with data to be hashed
            String data = "This is a message to hash.";
            messageDigest.update(data.getBytes());
            
            // Step 3: Perform the hashing and get the byte array
            byte[] hashedBytes = messageDigest.digest();
            
            // Step 4: Convert the byte array to a string
            String hashedString = Base64.getEncoder().encodeToString(hashedBytes);
            System.out.println("SHA-256 Hash: " + hashedString);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • MessageDigest: SHA-256 হ্যাশিং এলগরিদম ব্যবহার করার জন্য MessageDigest ক্লাস ব্যবহার করা হয়।
  • Base64: হ্যাশ ফলাফলটি প্রিন্ট করার জন্য Base64 এনকোডিং করা হয়েছে।

Output:

SHA-256 Hash: [hashed string]

  • Java Cryptography API এবং Java Time API একত্রে timestamping, encryption, decryption, hashing, এবং digital signatures সহ cryptographic operations করার জন্য একটি শক্তিশালী প্যাকেজ তৈরি করে।
  • উদাহরণস্বরূপ, RSA Digital Signature, AES Encryption, এবং SHA-256 Hashing Java তে সাধারণ ক্রিপ্টোগ্রাফিক অপারেশন হিসেবে ব্যবহৃত হয়।
  • java.security এবং javax.crypto প্যাকেজগুলি নিরাপত্তা এবং গোপনীয়তা নিশ্চিত করতে শক্তিশালী ক্রিপ্টোগ্রাফিক ফিচার সরবরাহ করে, যা বিভিন্ন সিকিউরিটি-ভিত্তিক অ্যাপ্লিকেশন তৈরির জন্য অপরিহার্য।
Content added By
Promotion

Are you sure to start over?

Loading...