lab10
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
long long modExp(long long b, long long e, long long m) {
long long r = 1;
while (e) {
if (e % 2) r = (r * b) % m;
b = (b * b) % m;
e /= 2;
}
return r;
}
long long modInv(long long e, long long phi) {
long long m0 = phi, x0 = 0, x1 = 1;
while (e > 1) {
long long q = e / phi, t = phi;
phi = e % phi, e = t;
t = x0, x0 = x1 - q * x0, x1 = t;
}
return x1 < 0 ? x1 + m0 : x1;
}
void genKeys(long long &n, long long &e, long long &d) {
long long p = 61, q = 53, phi;
n = p * q, phi = (p - 1) * (q - 1);
e = 17;
d = modInv(e, phi);
}
long long enc(long long m, long long e, long long n) {
return modExp(m, e, n);
}
long long dec(long long c, long long d, long long n) {
return modExp(c, d, n);
}
int main() {
long long n, e, d, msg, ct, userCt, userD, userN;
genKeys(n, e, d);
cout << "Public Key: (" << e << ", " << n << ")\n";
cout << "Private Key: (" << d << ", " << n << ")\n";
cout << "Enter message (< " << n << "): ";
cin >> msg;
ct = enc(msg, e, n);
cout << "Encrypted: " << ct << "\n";
cout << "Enter ciphertext: ";
cin >> userCt;
cout << "Enter private key (d): ";
cin >> userD;
cout << "Enter modulus (n): ";
cin >> userN;
cout << "Decrypted: " << dec(userCt, userD, userN) << endl;
return 0;
}
Comments
Post a Comment