P,Q是质数,实际使用时最好设置得大一点
公钥是自己设置的,最好是比P和Q大的质数再mod(P-1)(Q-1)
我默认设置的1000000007去模
r=PQ,明文不能超过r,也是PQ要取大的原因
密文=明文的e次方 % r;
明文=密文的d次方 % r;
#include <stdio.h>
#include <string>
#include <iostream>
#include <time.h>
#include <math.h>
#include <sys/timeb.h>
#include <set>
#include <conio.h>
#include <vector>
#include <fstream>
using namespace std;
typedef long long ll;
void exgcd(ll, ll, ll&, ll&);
void fun1();
void fun3();
void fun4();
ll pooow(ll a, ll b, ll r);
ll P=1, Q=1, x, y;
int main()
{
int choose;
while (1)
{
printf("1计算密钥、2退出、3加密、4解密");
scanf("%d", &choose);
switch (choose)
{
case 1: {
fun1();
break;
}
case 2:return 0;
case 3:fun3(); break;
case 4:fun4(); break;
default:continue;
}
}
cout << x << y << endl;
// scanf("%lld%lld", &P, &Q);
return 0;
}
void exgcd(ll a, ll b,ll& x,ll& y)
{
if (a == 0)
{
x = 0;
y = 1;
return;
}
exgcd((b%a), a, x,y);
ll temp = y;
y = x;
x = temp - (b / a)*y;
}
void fun1()
{
printf("请输入P和Q:");
scanf("%lld%lld", &P, &Q);
ll k = 1000000007 % ((P - 1)*(Q - 1));
printf("公钥为:%lld\n",k);
exgcd(k, (P - 1)*(Q - 1), x, y);
x %= (P - 1)*(Q - 1);
if(x<0)
x += (P - 1)*(Q - 1);
printf("私钥为:%lld\n", x);
printf("d=%lld,e=%lld,r=%lld\n", x, k, P*Q);
return;
}
void fun3()
{
ll e, r, m, c;
printf("请输入e和r:");
scanf("%lld%lld", &e, &r);
printf("请输入明文:");
scanf("%lld", &m);
c = pooow(m, e, r);
printf("密文为:%lld\n", c);
return;
}
void fun4()
{
ll d, r, m, c;
printf("请输入d和r:");
scanf("%lld%lld", &d, &r);
printf("请输入密文:");
scanf("%lld", &c);
m = pooow(c, d, r);
printf("明文为:%lld\n", m);
return;
}
ll pooow(ll a, ll b, ll r)
{
ll ans = 1;
while (b)
{
if (b & 1)
{
ans = (ans*a) % r;
a = (a*a) % r;
b >>= 1;
}
else
{
a = (a * a) % r;
b >>= 1;
}
}
return ans;
}

公钥是自己设置的,最好是比P和Q大的质数再mod(P-1)(Q-1)
我默认设置的1000000007去模
r=PQ,明文不能超过r,也是PQ要取大的原因
密文=明文的e次方 % r;
明文=密文的d次方 % r;
#include <stdio.h>
#include <string>
#include <iostream>
#include <time.h>
#include <math.h>
#include <sys/timeb.h>
#include <set>
#include <conio.h>
#include <vector>
#include <fstream>
using namespace std;
typedef long long ll;
void exgcd(ll, ll, ll&, ll&);
void fun1();
void fun3();
void fun4();
ll pooow(ll a, ll b, ll r);
ll P=1, Q=1, x, y;
int main()
{
int choose;
while (1)
{
printf("1计算密钥、2退出、3加密、4解密");
scanf("%d", &choose);
switch (choose)
{
case 1: {
fun1();
break;
}
case 2:return 0;
case 3:fun3(); break;
case 4:fun4(); break;
default:continue;
}
}
cout << x << y << endl;
// scanf("%lld%lld", &P, &Q);
return 0;
}
void exgcd(ll a, ll b,ll& x,ll& y)
{
if (a == 0)
{
x = 0;
y = 1;
return;
}
exgcd((b%a), a, x,y);
ll temp = y;
y = x;
x = temp - (b / a)*y;
}
void fun1()
{
printf("请输入P和Q:");
scanf("%lld%lld", &P, &Q);
ll k = 1000000007 % ((P - 1)*(Q - 1));
printf("公钥为:%lld\n",k);
exgcd(k, (P - 1)*(Q - 1), x, y);
x %= (P - 1)*(Q - 1);
if(x<0)
x += (P - 1)*(Q - 1);
printf("私钥为:%lld\n", x);
printf("d=%lld,e=%lld,r=%lld\n", x, k, P*Q);
return;
}
void fun3()
{
ll e, r, m, c;
printf("请输入e和r:");
scanf("%lld%lld", &e, &r);
printf("请输入明文:");
scanf("%lld", &m);
c = pooow(m, e, r);
printf("密文为:%lld\n", c);
return;
}
void fun4()
{
ll d, r, m, c;
printf("请输入d和r:");
scanf("%lld%lld", &d, &r);
printf("请输入密文:");
scanf("%lld", &c);
m = pooow(c, d, r);
printf("明文为:%lld\n", m);
return;
}
ll pooow(ll a, ll b, ll r)
{
ll ans = 1;
while (b)
{
if (b & 1)
{
ans = (ans*a) % r;
a = (a*a) % r;
b >>= 1;
}
else
{
a = (a * a) % r;
b >>= 1;
}
}
return ans;
}
