Friday 26 April 2013

RSA Public Key Encryption Algorithm in Java

Definition: 

RSA is an algorithm for public-key cryptography that is based on the presumed difficulty of factoring large integers, the factoring problem.

Algorithm:

  • p and q: the primes from the key generation,
  • d_P = d\text{ (mod }p-1\text{)},
  • d_Q = d\text{ (mod }q-1\text{)} and
  • q_\text{inv} = q^{-1}\text{ (mod }p\text{)}.
  • m_1 = c^{d_P}\text{ (mod }p\text{)}
  • m_2 = c^{d_Q}\text{ (mod }q\text{)}
  • h = q_\text{inv}*(m_1-m_2)\text{ (mod }p\text{)} (if m_1 < m_2 then some libraries compute h as q_\text{inv} \times (m_1+p-m_2)\text{ (mod }p\text{)})
  • m = m_2 + (h*q)\, 
Definition and Algorithm taken from Wikipedia.

I have write a Java program implementing the RSA Public key cipher algorithm. You can use the code in case 'k' , case 'c' , case 'p' for key generation, encryption and decryption  respectively.

package encryption.rsa;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class RSA {

    public static void main(String[] args) throws IOException {
        char selection = '3';
        BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
        BigInteger p;
        BigInteger q;
        BigInteger n;
        BigInteger phiN;
        BigInteger e = new BigInteger("0");
        BigInteger d = new BigInteger("0");
        BigInteger plain;
        BigInteger cipher;
        while (selection != 'e') {
            switch (selection) {

                case 'k':
                    System.out.print("Enter the Value of p: ");
                    p = new BigInteger(console.readLine());
                    System.out.print("Enter the Value of q: ");
                    q = new BigInteger(console.readLine());
                    if (!p.isProbablePrime(4) || !q.isProbablePrime(4)) {
                        System.out.print("p or q is a composite number!\n\n");
                        break;
                    }
                    n = p.multiply(q);
                    phiN = p.subtract(new BigInteger("1")).multiply(q.subtract(new BigInteger("1")));
                    for (int i = 2; i < (phiN.intValue() / 2); i++) {
                        if (phiN.remainder(new BigInteger(String.valueOf(i))).intValue() != 0) {
                            e = new BigInteger(String.valueOf(i));
                            d = e.modInverse(phiN);
                            break;
                        }
                    }
                    System.out.print("\n\nPublic Key: {" + e.toString() + ", " + n.toString() + "}\n");
                    System.out.print("Private Key: {" + d.toString() + ", " + n.toString() + "}\n");
                    break;
                case 'c':
                    System.out.print("\n\nEnter the value to Encrypt: ");
                    plain = new BigInteger(console.readLine());
                    System.out.print("Enter the value of e: ");
                    e = new BigInteger(console.readLine());
                    System.out.print("Enter the value of n: ");
                    n = new BigInteger(console.readLine());
                    cipher = plain.modPow(e, n);
                    System.out.print("\nThe Ciphered Value of " + plain.toString()
                            + " is " + cipher.toString() + '.');
                    break;
                case 'p':
                    System.out.print("\n\nEnter the value to Decrypt: ");
                    cipher = new BigInteger(console.readLine());
                    System.out.print("Enter the value of d: ");
                    d = new BigInteger(console.readLine());
                    System.out.print("Enter the value of n: ");
                    n = new BigInteger(console.readLine());
                    plain = cipher.modPow(d, n);
                    System.out.print("\nThe Deciphered Value of " + cipher.toString()
                            + " is " + plain.toString() + '.');
                    break;
            }
            System.out.println("\n\n\nPlease Select From the Following:");
            System.out.println("Generate [k]ey pair.");
            System.out.println("En[c]rypt.");
            System.out.println("Decry[p]t");
            System.out.println("[E]xit");
            selection = console.readLine().charAt(0);
        }
    }
}

No comments:

Post a Comment