In C++ or C ONLY PLEASE
1.thefunctionsforRSA:
(a)Mappingfunction from todecimaldigits(SeetextbFigure9.7.(b)andformapping).willtoausedinRSAencryptionanddecryption.
(b)Keythattheinputsofprimeand,andgeneratetheparameters(n, ?(n), e, d),andtheforRSA.Thesub-routines
GCD function to find e: gcd(?(n), e) = 1; 1 < e < ?(n). Since there could be many such e values, you may use gcd to find the first five such e values.
Multiplicative inverse: d = e?1(mod ?(n)). You may use extended Euclidean algorithm to find the first five such d values corresponding to each of five e values (Note: Your multiplicative inverse value should be within [0, ?(n))).
(c)Encryptionfunctionthatofandpublic
(d)functionthatofciphertextand
(e)functionfromdecimaldigitsto
2.Experimentthecorrectnessofprogramusingtheplaintextandprimep =73andq =151:
(a)text:
(b)plaintext:
For each test of your RSA algorithm, you need to output the following information:
(a)RSAinformation:n, ?(n),thefirste,andd
(b)plaintext
(c)setsof:
Public key
Ciphertext
Private key
Plaintext
(d)fromdecimaldigitstoTheoutputfortheinputofisinFigure1.
/* * C++ Program to Implement the RSA Algorithm */ #include
#include #include #include using namespace std; long int p, q, n, t, flag, e[100], d[100], temp[100], j, m[100], en[100], i; char msg[100]; int prime(long int); void ce(); long int cd(long int); void encrypt(); void decrypt(); int prime(long int pr) { int i; j = sqrt(pr); for (i = 2; i <= j; i++) { if (pr % i == 0) return 0; } return 1; } int main() { cout << \"\ ENTER FIRST PRIME NUMBER\ \"; cin >> p; flag = prime(p); if (flag == 0) { cout << \"\ WRONG INPUT\ \"; exit(1); } cout << \"\ ENTER ANOTHER PRIME NUMBER\ \"; cin >> q; flag = prime(q); if (flag == 0 || p == q) { cout << \"\ WRONG INPUT\ \"; exit(1); } cout << \"\ ENTER MESSAGE\ \"; fflush(stdin); cin >> msg; for (i = 0; msg[i] != NULL; i++) m[i] = msg[i]; n = p * q; t = (p - 1) * (q - 1); ce(); cout << \"\ POSSIBLE VALUES OF e AND d ARE\ \"; for (i = 0; i < j - 1; i++) cout << e[i] << \"\\t\" << d[i] << \"\ \"; encrypt(); decrypt(); return 0; } void ce() { int k; k = 0; for (i = 2; i < t; i++) { if (t % i == 0) continue; flag = prime(i); if (flag == 1 && i != p && i != q) { e[k] = i; flag = cd(e[k]); if (flag > 0) { d[k] = flag; k++; } if (k == 99) break; } } } long int cd(long int x) { long int k = 1; while (1) { k = k + t; if (k % x == 0) return (k / x); } } void encrypt() { long int pt, ct, key = e[0], k, len; i = 0; len = strlen(msg); while (i != len) { pt = m[i]; pt = pt - 96; k = 1; for (j = 0; j < key; j++) { k = k * pt; k = k % n; } temp[i] = k; ct = k + 96; en[i] = ct; i++; } en[i] = -1; cout << \"\ THE ENCRYPTED MESSAGE IS\ \"; for (i = 0; en[i] != -1; i++) printf(\"%c\", en[i]); } void decrypt() { long int pt, ct, key = d[0], k; i = 0; while (en[i] != -1) { ct = temp[i]; k = 1; for (j = 0; j < key; j++) { k = k * ct; k = k % n; } pt = k + 96; m[i] = pt; i++; } m[i] = -1; cout << \"\ THE DECRYPTED MESSAGE IS\ \"; for (i = 0; m[i] != -1; i++) printf(\"%c\", m[i]); }