Q6 Digital Signature With RSA
Q6 Digital Signature With RSA
h>
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <random>
int randomNumber(){
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, (int)1e9);
return dis(gen);
}
ZZ mypow(ZZ a, ZZ b){
ZZ result = ZZ(1);
ZZ multi = ZZ(a);
while(b > 0){
if(b % 2 == 1){
result *= multi;
}
multi *= multi;
b >>= 1;
}
return result;
}
ZZ generate_large_number(int bits){
ZZ value = ZZ(1);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 1);
return value;
}
ZZ myPowModN(ZZ a, ZZ b, ZZ mod){
ZZ result = ZZ(1);
ZZ multi = ZZ(a);
while(b > 0){
if(b%2 == 1){
result *= multi;
result %= mod;
}
multi *= multi;
multi %= mod;
b = b>>1;
}
return result%mod;
}
ZZ d = number - 1;
ZZ s = ZZ(0);
while(d % 2 == 0){
s++;
d /= 2;
}
ZZ random_between_two_and_n_minus_2 = number/randomNumber();
ZZ x_a_power_d_mod_n =
myPowModN(random_between_two_and_n_minus_2, d, number);
ZZ generate_prime(int bits){
ZZ prime;
// generate large number
int tries = 0;
ZZ number = generate_large_number(bits);
while(!myProbPrime(number)){
number = generate_large_number(bits);
cout<<number<<endl;
tries++;
}
cout<<"Number of tries: "<<tries<<endl;
return number;
ZZ x1, y1;
ZZ gcd = extended_gcd(b%a, a, x1, y1);
x = y1 - (b/a) * x1;
y = x1;
return gcd;
}
ZZ modInv(ZZ e, ZZ d){
// e * d = 1 (d)
ZZ x, y;
ZZ gcd = extended_gcd(e, d, x, y);
if(gcd != 1){
return ZZ(-1);
}else{
return x%d;
}
}
int main() {
// Step 1: Generate RSA keys
ZZ p, q, n, phi, e, d;
long keySize = 1024; // Minimum key size for RSA
p = generate_prime( keySize / 2);
q = generate_prime( keySize / 2);
n = p * q;
phi = (p - 1) * (q - 1);
if (m >= n) {
cerr << "Error: Message size too large for the chosen key
size." << endl;
return 1;
}
return 0;
}