Advertisement
Solingen

z11.2.cpp

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