For coding in cryptography you are free to use openssl direct commands or any C
ID: 3826946 • Letter: F
Question
For coding in cryptography you are free to use openssl direct commands or any C or C++ program a) Write a C/C++ program to implement RSA trapdoor permutation. Your program should do the following 1. Implement a routine/function to generate RSA key pair (public key and secret key). You are free to use any method for generating the keys 2. Implement the functionality for RSA and RSA inverse operations 3. For a given plain text input, your program should execute the RSA operation with public key and output the result 4. Given the output of RSA operation (from step-c above), your program should execute the RSA inverse operation with the secret key and output the original plain text b). Enhance the C/C++ program above to add RSA signature capabilities. Your program should also do the following 1. Derive a new set of public and secret keys (you can use the key generation routine from problem 1 above to generate new set of public and secret keys for signature operations) 2. Use the functionality of RSA and RSA inverse operations (developed for problem-1 above) to perform signing and verification algorithmsExplanation / Answer
#include<iostream>
#include<math.h>
#include<string.h>
#include<stdlib.h>
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) // function to find whether the numbers are prime or not
{
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; // getting p
flag = prime(p);
if (flag == 0)
{
cout << " WRONG INPUT ";
exit(1);
}
cout << " ENTER ANOTHER PRIME NUMBER ";
cin >> q; // getting q
flag = prime(q);
if (flag == 0 || p == q)
{
cout << " WRONG INPUT ";
exit(1);
}
cout << " ENTER MESSAGE ";
cin >> msg; // getting the message
for (i = 0; msg[i] != NULL; i++)
m[i] = msg[i];
n = p * q; // calculating n
t = (p - 1) * (q - 1); // calculating t
ce();
cout << " POSSIBLE VALUES OF e AND d ARE ";
for (i = 0; i < j - 1; i++)
cout << e[i] << " " << d[i] << " ";
encrypt();
decrypt();
return 0;
}
void ce() // finding the e and d values
{
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() // encryption
{
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() // decryption
{
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]);
}
Output
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.