📄 rsa.cpp
字号:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int miwen[1024];
//////判断输入的数是否为素数//////
bool pdprime(long m)
{
bool pd;
int i;
for(i = 3;i < m;i= i + 2)
if(m % i ==0)
break;
if(m == i)
pd = 1;
else
pd = 0;
return pd;
}
///// 判断两个数是否互素/////
bool pdhusu(long a,long b)
{
int t0 = 0, t = 1,s0 = 1,s = 0 , q , r ;
int temp;
bool pdhs;
q = a / b;
r = a - q * b;
while ( r > 0)
{
temp = t0 - q * t;
t0 = t;
t = temp;
temp = s0 - q * s;
s0 = s;
s = temp;
a = b;
b = r;
q = a / b;
r = a - q * b;
}
r = b;
if ( r == 1)
pdhs = 1;
else
pdhs = 0;
return pdhs;
}
/////求d 的值//////
int qiuni(long a, long b)
{
int t0 = 0, t = 1,s0 = 1,s = 0 , q , r , u , v , d;
int temp;
u = a;
v = b;
q = a / b;
r = a - q * b;
while ( r > 0)
{
temp = t0 - q * t;
t0 = t;
t = temp;
temp = s0 - q * s;
s0 = s;
s = temp;
a = b;
b = r;
q = a / b;
r = a - q * b;
}
r = b;
if ( r == 1)
{
cout << endl;
cout << "s = " << s << endl;
cout << "t = " << t << endl;
cout << "r = " << s << " * " << u << " + " ;
cout << t << " * " << v << endl << endl;
cout << u << "和"<< v << "互素,满足条件" << endl << endl;
if(t > 0)
d = t % u;
else
d = (u + t) % u;
return d;
}
else
{
cout << u << " 和 " << v << "不互素,不满足条件" << endl;
return false;
}
}
////// 加密/////
void jiami(string data,int p ,int d)
{
char c;
int u = 0;
cout << "加密后的结果为:" << endl ;
for(int i = 0;i < data.size(); i ++)
{
miwen[i] = data.at(i);
c = miwen[i];
for(int j = 1;j < d ;j ++)
miwen[i] = miwen[i] * c % p;
cout << miwen[i] << ' ';
}
}
////....解密....//////
void hjiemi(int z1,int x)
{
int c;
char g;
int jiemi[1024];
cout << "解密后的结果为:" << endl ;
for(int i = 0;i < 1024; i ++)
{
jiemi[i] = miwen[i];
c = miwen[i];
for(int j = 1;j < z1 ;j ++)
jiemi[i] = jiemi[i] * c % x;
if(jiemi[i] != 0)
{
g = jiemi[i];
cout << g;
}
}
}
int main()
{
long p , q , n , m , a = 0 , d;
char c;
string data;
cout << "请输入一段明文 :" << endl;
getline(cin, data, '\n');
cout << "请输入 p 的值 = ";
cin >> p ;
cout << "请输入 q 的值 = ";
cin >> q ;
cout << pdprime(p) << ' ' << pdprime(q) << endl;
if(pdprime(p) == 1 && pdprime(q) == 1)
{
cout << "输入的 p 和 q 满足条件" << endl << endl;
n = p * q;
m
= (p - 1) * (q - 1);
cout << "所计算φ(n) = (p - 1) * (q - 1)的值为"<<m<<endl;
cout << "请输入一个小于" <<m<< "的随机整数 e = ";
cin >> a;
cout << endl;
if(pdhusu(a , m) == 1)
{
d = qiuni(m, a);
cout << "a 的逆模 φ(n) 为 " << d << endl << endl;
jiami(data,n,a);
cout << endl << endl;
cout << "公钥为 :" << n << ' ' << a << endl;
cout << "私钥为 :" << p << ' ' << q << ' ' << d << endl << endl;
cout << "是否解密(y/n)"<< endl;
cin >> c;
if(c == 'y')
hjiemi(d,n);
else
exit(1);
}
else
cout << "输入的小于 n 的随机整数 a 和 φ(n) 不互素" << endl;
}
else
cout << " 输入的p 和 q不全为素数 " << endl;
system("pause");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -