Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. import java.util.LinkedList;
  2. import java.util.List;
  3.  
  4. public class Main {
  5. private static long powMod(long a, long n, long m) {
  6. long res = 1;
  7. while (n > 0) {
  8. if ((n & 1) == 1) {
  9. res = a * res % m;
  10. }
  11. a = a * a % m;
  12. n >>= 1;
  13. }
  14. return res;
  15. }
  16.  
  17. private static long modInverse(long a, long m) {
  18. a = a % m;
  19. for (long x = 1;
  20. x < m;
  21. x++) {
  22. if ((a * x) % m == 1) {
  23. return x;
  24. }
  25. }
  26. return 1;
  27. }
  28.  
  29. private static long randomPrimeInRange(long upperLimit) {
  30. for (long result = (int) (Math.random() * upperLimit); result != 0; result--) {
  31. if (isPrime(result)) {
  32. return result;
  33. }
  34. }
  35. return randomPrimeInRange(upperLimit);
  36. }
  37.  
  38. private static boolean isPrime(long n) {
  39. if (n < 2) {
  40. return false;
  41. }
  42. if (n == 2) {
  43. return true;
  44. }
  45. for (long i = 2; i < Math.sqrt(n); i++) {
  46. if (n % i == 0) {
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52.  
  53. private static List<Long> encryptRSA(String s, long e, long n) {
  54. List<Long> encrypted = new LinkedList<>();
  55. for (int i = 0;
  56. i < s.length();
  57. ++i) {
  58. encrypted.add(powMod(s.charAt(i), e, n));
  59. }
  60. return encrypted;
  61. }
  62.  
  63. private static String decryptRSA(List<Long> encrypted, long d, long n) {
  64. StringBuilder stringBuilder = new StringBuilder();
  65. encrypted.forEach(c -> stringBuilder.append((char) powMod(c, d, n)));
  66. return stringBuilder.toString();
  67. }
  68.  
  69. public static void main(String[] args) {
  70. long p = randomPrimeInRange(5000L);
  71. System.out.println("p=" + p);
  72. long q = randomPrimeInRange(5000L);
  73. System.out.println("q=" + q);
  74. long phi = (p - 1) * (q - 1);
  75. System.out.println("phi=" + phi);
  76. long e = randomPrimeInRange(phi);
  77. System.out.println("e=" + e);
  78. long d = modInverse(e, phi);
  79. System.out.println("d=" + d);
  80. long n = p * q;
  81. System.out.println("n=" + n);
  82. System.out.println();
  83. System.out.println(decryptRSA(encryptRSA("test message", e, n), d, n));
  84.  
  85. }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement