ip2
unknown
plain_text
a month ago
2.5 kB
3
Indexable
#include <iostream> #include <cmath> #include <random> using namespace std; // Вычисление НОД (алгоритм Евклида) int gcdCalc(int x, int y) { return (y == 0) ? x : gcdCalc(y, x % y); } // Быстрое возведение в степень по модулю (алгоритм "быстрого" возведения) long long modPow(long long base, long long exp, long long m) { long long result = 1; while (exp > 0) { if (exp % 2 == 1) { result = (result * base) % m; } base = (base * base) % m; exp /= 2; } return result; } // Проверка числа на простоту (проверка делителями до корня) bool isPrime(int num) { if (num <= 1) return false; for (int i = 2; i <= sqrt(num); ++i) { if (num % i == 0) return false; } return true; } // Генерация ключей RSA (случайный выбор двух простых, вычисление n, e, d) void makeRsaKeys(int& n, int& e, int& d) { random_device rd; mt19937 gen(rd()); uniform_int_distribution<> dist(50, 100); int p, q; do { p = dist(gen); } while (!isPrime(p)); do { q = dist(gen); } while (!isPrime(q) || q == p); n = p * q; int phi = (p - 1) * (q - 1); do { e = dist(gen) % phi + 2; } while (gcdCalc(e, phi) != 1); int k = 1; while ((1 + k * phi) % e != 0) { ++k; } d = (1 + k * phi) / e; } // Шифрование числа: message^e mod n long long encryptValue(int message, int e, int n) { return modPow(message, e, n); } // Расшифровка числа: cipher^d mod n long long decryptValue(long long cipher, int d, int n) { return modPow(cipher, d, n); } int main() { int n, e, d; makeRsaKeys(n, e, d); cout << "Public key: (" << e << ", " << n << ")" << endl; cout << "Private key: (" << d << ", " << n << ")" << endl; // Зашиваем исходное сообщение в код int originalMsg = 123; cout << "Original message: " << originalMsg << endl; // Шифрование long long encMsg = encryptValue(originalMsg, e, n); cout << "Encrypted message: " << encMsg << endl; // Расшифровка long long decMsg = decryptValue(encMsg, d, n); cout << "Decrypted message: " << decMsg << endl; return 0; }
Editor is loading...
Leave a Comment