Advertisement
Solingen

z11.3.cpp

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