- #include <iostream>
- #include <cmath>
- using namespace std;
- // Проверка на простое число
- bool is_prime(int num) {
- if (num <= 1) {
- return false;
- }
- for (int i = 2; i <= sqrt(num); i++) {
- if (num % i == 0) {
- return false;
- }
- }
- return true;
- }
- // Функция для нахождения НОД двух чисел
- int gcd(int a, int b) {
- if (b == 0) {
- return a;
- }
- return gcd(b, a % b);
- }
- // Функция для нахождения d (закрытый ключ)
- int find_d(int e, int totient) {
- int d = 0;
- while ((d * e) % totient != 1) {
- d++;
- }
- return d;
- }
- int main() {
- // Ввод простых чисел p и q
- int p, q;
- cout << "Enter two prime numbers: ";
- cin >> p >> q;
- // Вычисление n и totient(n)
- int n = p * q;
- int totient = (p - 1) * (q - 1);
- // Ввод секретного ключа d
- int d;
- cout << "Enter the secret key d: ";
- cin >> d;
- // Вывод открытого ключа e
- int e = find_d(d, totient);
- cout << "The public key is: " << e << endl;
- // Шифрование сообщения
- string message;
- cout << "Enter a message to encrypt: ";
- cin.ignore();
- getline(cin, message);
- int encrypted[message.length()];
- for (int i = 0; i < message.length(); i++) {
- encrypted[i] = pow(message[i], e) % n;
- }
- // Расшифрование сообщения
- string decrypted = "";
- for (int i = 0; i < message.length(); i++) {
- decrypted += pow(encrypted[i], d) % n;
- }
- cout << "The decrypted message is: " << decrypted << endl;
- return 0;
- }
