Advertisement
Solingen

z11.1.cpp

Dec 22nd, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Быстрая проверка простоты (для маленьких p, q)
  5. bool isPrime(int x)
  6. {
  7. if (x < 2) return false;
  8. for (int i = 2; i*i <= x; i++)
  9. if (x % i == 0) return false;
  10. return true;
  11. }
  12.  
  13. // НОД
  14. int gcd(int a, int b)
  15. {
  16. while (b != 0)
  17. {
  18. int t = a % b;
  19. a = b;
  20. b = t;
  21. }
  22. return a;
  23. }
  24.  
  25. // Быстрое возведение в степень по модулю
  26. long long modPow(long long base, long long exp, long long m)
  27. {
  28. long long result = 1;
  29. base = base % m;
  30. while (exp > 0)
  31. {
  32. if (exp & 1) // если exp нечетно
  33. result = (result * base) % m;
  34. base = (base * base) % m;
  35. exp >>= 1;
  36. }
  37. return result;
  38. }
  39.  
  40. // Поиск мультипликативной обратной к e (mod phi)
  41. int modInverse(int e, int phi)
  42. {
  43. // Простой перебор (неэффективно, но понятно)
  44. for (int x = 1; x < phi; x++)
  45. {
  46. if ((1LL * e * x) % phi == 1) return x;
  47. }
  48. return -1;
  49. }
  50.  
  51. int main()
  52. {
  53. int p, q;
  54. cout << "Введите два небольших простых числа p, q: ";
  55. cin >> p >> q;
  56.  
  57. if (!isPrime(p) || !isPrime(q))
  58. {
  59. cout << "p или q не простые\n";
  60. return 0;
  61. }
  62.  
  63. long long n = (long long)p * q;
  64. long long phi = (long long)(p - 1) * (q - 1);
  65.  
  66. // Выбираем e
  67. int e = 2;
  68. while (e < phi)
  69. {
  70. if (gcd(e, phi) == 1) break;
  71. e++;
  72. }
  73.  
  74. int d = modInverse(e, phi);
  75.  
  76. cout << "n = " << n << ", phi(n) = " << phi << endl;
  77. cout << "Открытая экспонента e = " << e << endl;
  78. cout << "Закрытая экспонента d = " << d << endl;
  79.  
  80. // Шифрование
  81. long long M; // сообщение
  82. cout << "Введите сообщение (M < n): ";
  83. cin >> M;
  84.  
  85. long long C = modPow(M, e, n);
  86. cout << "Зашифровано: " << C << endl;
  87.  
  88. // Расшифровка
  89. long long Dec = modPow(C, d, n);
  90. cout << "Расшифровано: " << Dec << endl;
  91.  
  92. return 0;
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement