Rivest Shamir Adleman(RSA) Algorithm and Functions

Introduction

RSA (Rivest-Shamir-Adleman) is a widely adopted asymmetric encryption algorithm that offers secure communication, digital signatures, and key exchange. In Java, you can leverage the built-in cryptographic libraries to generate RSA key pairs, encrypt and decrypt messages, and perform digital signatures. This article explores the RSA application and its uses in various functions.

RSA Key Generation in Java

Generating RSA key pairs is the first step in using RSA for encryption and digital signatures. Java provides the KeyPairGenerator class in Java.security package for this purpose. Here we will demonstrate RSA key generation:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

public class RSAKeyGenerationExample {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        // Generate RSA key pair
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // Key size in bits
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        // Access RSA public and private keys
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

        // Print key details
        System.out.println("Public Key: " + publicKey);
        System.out.println("Private Key: " + privateKey);
    }
}

RSA Encryption and Decryption in Java

RSA can be used to securely encrypt and decrypt messages. Here we will see RSA encryption and decryption using the generated RSA key pair:

import javax.crypto.Cipher;

public class RSAEncryptionExample {
    public static void main(String[] args) throws Exception {
        String message = "Hello, RSA!";
        
        // Encrypt message using RSA public key
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(message.getBytes());
        String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes);
        
        // Decrypt message using RSA private key
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage));
        String decryptedMessage = new String(decryptedBytes);
        
        System.out.println("Encrypted Message: " + encryptedMessage);
        System.out.println("Decrypted Message: " + decryptedMessage);
    }
}

Digital Signatures with RSA in Java

RSA can be employed for generating and verifying digital signatures to ensure the authenticity and integrity of digital documents. How to generate and verify RSA digital signatures?

import java.security.Signature;

public class RSADigitalSignatureExample {
    public static void main(String[] args) throws Exception {
        String message = "Hello, RSA Signature!";
        
        // Generate signature using RSA private key
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(message.getBytes());
        byte[] signatureBytes = signature.sign();
        
        // Verify signature using RSA public key
        signature.initVerify(publicKey);
        signature.update(message.getBytes());
        boolean isVerified = signature.verify(signatureBytes);
        
        System.out.println("Signature Verified: " + isVerified);
    }
}

Conclusion

RSA encryption in Java provides a robust framework for secure communication and digital signatures. By utilizing the KeyPairGenerator, Cipher, and Signature classes, you can generate RSA key pairs, encrypt and decrypt messages, and ensure the authenticity of digital documents. Understanding and implementing RSA in Java equips developers with powerful tools to strengthen security in various scenarios, such as secure communication and data validation.