Advertisement
iccaka

Java RSA example

Dec 10th, 2021
801
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.85 KB | None | 0 0
  1. import java.math.BigDecimal;
  2. import java.math.BigInteger;
  3. import java.util.Random;
  4. import java.util.Scanner;
  5.  
  6. public class Main {
  7.  
  8.     public static void main(String args[]) {
  9.         int p, q, n, phi, d = 0, e, i;
  10.         double c;
  11.         BigInteger message_back;
  12.         Scanner sc = new Scanner(System.in);
  13.  
  14.         System.out.println("Enter first prime number - p:");
  15.         p = sc.nextInt();
  16.  
  17.         if (!isPrime(p)) {
  18.             System.out.println("The number you've entered ( " + p + " ) is not prime!");
  19.             return;
  20.         }
  21.  
  22.         System.out.println("Enter second prime number - q:");
  23.         q = sc.nextInt();
  24.  
  25.         if (!isPrime(q)) {
  26.             System.out.println("The number you've entered ( " + q + " ) is not prime!");
  27.             return;
  28.         }
  29.  
  30.         n = p * q;
  31.         System.out.println("The value of n: " + n);
  32.  
  33.         System.out.println("Enter the message to be encrypted ( must be smaller than 'n' --> " + n + " )");
  34.         int message = sc.nextInt();
  35.  
  36.         if (message >= n) {
  37.             return;
  38.         }
  39.  
  40.         phi = (p - 1) * (q - 1);
  41.         System.out.println("The value of f(n): " + phi);
  42.  
  43.         for (e = 2; e < phi; e++) {
  44.             if (getGCD(e, phi) == 1) {
  45.                 break;
  46.             }
  47.         }
  48.         System.out.println("The value of e: " + e);
  49.  
  50.         for (i = 0; i <= 9; i++) {
  51.             int x = 1 + (i * phi);
  52.  
  53.             if (x % e == 0) {
  54.                 d = x / e;
  55.                 break;
  56.             }
  57.         }
  58.         System.out.println("The value of d: " + d);
  59.  
  60.         c = (Math.pow(message, e)) % n;
  61.         System.out.println("The encrypted message is: " + c);
  62.  
  63.         BigInteger N = BigInteger.valueOf(n);
  64.         BigInteger C = BigDecimal.valueOf(c).toBigInteger();
  65.         message_back = (C.pow(d)).mod(N);
  66.         System.out.println("The decrypted message is: " + message_back);
  67.     }
  68.  
  69.     private static boolean isPrime(int num) {
  70.         if (num == 0 || num == 1) {
  71.             return false;
  72.         }
  73.         if (num == 2) {
  74.             return true;
  75.         }
  76.         if (num % 2 == 0) {
  77.             return false;
  78.         }
  79.  
  80.         Random rand = new Random();
  81.  
  82.         for (int i = 0; i < 3; i++) {
  83.             long r = Math.abs(rand.nextLong());
  84.             long a = r % (num - 1) + 1;
  85.  
  86.             if (modPow(a, num - 1, num) != 1) {
  87.                 return false;
  88.             }
  89.         }
  90.  
  91.         return true;
  92.     }
  93.  
  94.     private static long modPow(long a, long b, long c) {
  95.  
  96.         long result = 1;
  97.  
  98.         for (int i = 0; i < b; i++) {
  99.             result *= a;
  100.             result %= c;
  101.         }
  102.  
  103.         return result % c;
  104.     }
  105.  
  106.     private static int getGCD(int e, int phi) {
  107.         if (e == 0) {
  108.             return phi;
  109.         } else {
  110.             return getGCD(phi % e, e);
  111.         }
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement