Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions BasicRSA.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@

import java.math.BigInteger;
import java.util.Scanner;

public class BasicRSA{

static int gcd(int a, int b)
{ /*Returns Greatest common divisor of 2 numbers
*implementing Euclidean ALgorithm */

if (a == 0) return b;
else return gcd(b % a, a);
}

static int modInv(int a, int b)
{ /*Returns modular inverse of a mod b
*implementing Extended Euclidean ALgorithm*/
return modInv(a,b,b,0,1);
}

static int modInv(int a,int b,int c,int x,int y)
{ //over-loading

if(b%a==0) return y;
else return modInv(b%a,a,c,y,c+(x-(b/a)*y)%c );
}

public static void main(String args[]){

Scanner sc= new Scanner(System.in);
System.out.println("You are required to enter 2 prime numbers followed by the message you want to encrypt");

System.out.println("Enter first prime :");
int p= sc.nextInt();

System.out.println("Enter Second prime:");
int q=sc.nextInt();

System.out.println("Enter a num to encrypt:");
int m=sc.nextInt();
//Plaintext: message to be encrypted

sc.close();

int n=p*q;
int z=(p-1)*(q-1)/gcd(p-1,q-1);
int e,d=0; // e is for public key exponent, d is for private key exponent

for (e = 2; e < z; e++) {
if (gcd(e, z) == 1) {
break;
}
}

d=modInv(e,z);

BigInteger M= BigInteger.valueOf(m);
BigInteger E= BigInteger.valueOf(e);
BigInteger N= BigInteger.valueOf(n);
BigInteger D= BigInteger.valueOf(d);
BigInteger C= M.modPow(E,N);
BigInteger M2= C.modPow(D,N);



System.out.println("Public Key Pair : " + e + " " + n );
System.out.println("Private Key Pair : " + d + " " + n );
System.out.println("Encrypted num : "+ C);
System.out.println("Decrypted num : "+ M2);
System.out.println("This is deciphered using Private key");
}
}