#include #include long long p=89, q=97; // factors for the modulus long long n=p*q; // modulus long long e=49; // encode key long long d; // decode key long long encode (long long x) { long long prod = x, accu = 1; long long expon = e; while (expon > 0) { if (expon % 2) { accu *= prod; accu %= n; } prod *= prod; prod %= n; expon /= 2; } return (long long)(accu % n); } // gets "D", the inverse of the "E" exponent used for encryption long long inverse(long long E) { for (long long D=1 ; D < n ; D++) { if (((E*D) % ((p-1)*(q-1))) == 1) return D; } return 0; } long long decode (long long x) { long long prod = x, accu = 1; long long expon = inverse(e); while (expon > 0) { if (expon % 2) { accu *= prod; accu %= n; } prod *= prod; prod %= n; expon /= 2; } return (long long)(accu % n); } int main () { long long out; cout << "Inverse:" << inverse(e) << "\n"; cout << (49*3793) << " " << ((49*3793) % (p-1)*(q-1)) << "\n"; while (1) { long long y = (long long)getchar(); cout << y << " " << (out=encode(y)) << " "; cout << decode(out) << "\n"; } }