运行截图
代码
#include<iostream>
#include<cmath>
using namespace std;
/*这个算法使用int类型,最大值21亿。
可能出现的最大值是 n* n。
所以n要小于根号21亿,大致是45000。*/
int gcd(int a, int b) { //最大公约数
int temp;
//比较两个数的大小,值大的数为a,值小的数为b
if (a < b) {
temp = a;
a = b;
b = temp;
}
//求余
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
int lcm(int a, int b) { //最小公倍数
return a * b / gcd(a, b);
}
int main() {
int p, q; //俩质数 p*q<45000
cout << "输入p、q (p、q为质数,不支持过大)" << endl;
cin >> p >> q;
int n = p * q;
int l = lcm(p - 1, q - 1);
int e;
cout << "输入e (e与" << l << "互质) 且 1<e<" << l << endl;
cin >> e;
int d;
for (d = 1;; d++) {
if (d * e % l == 1)
break;
}
cout << endl << endl;
cout << "{ " << e << "," << n << " }" << "为公钥" << endl;
cout << "{ " << d << "," << n << " }" << "为私钥" << endl;
cout << endl << endl;
cout << "/***********加密*************/" << endl;
long long m;
cout << "输入明文,且明文小于" << n << endl;
cin >> m;
cout << endl;
cout << "密文为" << endl;
long long c;
c = m % n;
for (int i = 1; i < e; i++)
{
c = (c * m) % n;
}
cout << c << endl << endl;
cout << "/***********解密*************/" << endl;
cout << "密文为" << endl;
cin >> c;
cout << "明文为" << endl;
m = c % n;
for (int i = 1; i < d; i++)
{
m = (m * c) % n;
}
cout << m << endl << endl;
return 0;
}
参考博文链接
https://blog.csdn.net/dbs1215/article/details/48953589
https://blog.csdn.net/u014044812/article/details/80866759