#include<bits/stdc++.h>
using namespace std;
int p,q,n,e,d;//{e,n}作为公钥 {d,n}作为私钥
int fn;
int m,c,new_m;
int max_pq,min_pq;
bool isPrime(int n)//判断是否是素数 ,小素数可以 ,大一点的使用素性判断算法
{
if(n%2==0)
{
return false;
}
for(int i=3;i<=sqrt(n);i+=2)
{
if(n%i==0)
{
return false;
}
}
return true;
}
int modpow(int n,int m,int mod)//取模指数计算
{
if(m==0)
{
return 1;
}
if(m==1)
{
return n%mod;
}
if(m%2==0)
{
return modpow((n*n)%mod,m/2,mod);
}
else
{
return (modpow((n*n)%mod,m/2,mod)*n)%mod;
}
}
void RandomPQ()//随机生成PQ两个互质的数字
{
while(1)
{
p = (rand()%(max_pq-min_pq))+min_pq;
if(isPrime(p))
{
break;
}
}
while(1)
{
q = (rand()%(max_pq-min_pq))+min_pq;
if(p!=q&&isPrime(q))
{
break;
}
}
cout<<"q:"<<q<<endl;
cout<<"p:"<<p<<endl;
}
void GetN()//根据PQ生成n
{
n=q*p;
cout<<"n:"<<n<<endl;
}
void Euler()//计算欧拉函数(n)
{
fn = (q-1)*(p-1);
cout<<"fn:"<<fn<<endl;
}
void GetE()//计算e 满足gcd(欧拉函数(n),e)=1 e< 欧拉函数(n);
{
if(!isPrime(fn))
{
e=1;
}
for(int i=(fn-1);i>=1;i--)
{
if(__gcd(fn,i)==1)
{
e=i;
break;
}
}
cout<<"e:"<<e<<endl;
}
//求d 扩展欧几里得
int ex_gcd(int a,int b,int &x,int &y)//扩展欧几里得
{
if(b==0)
{
x=1;
y=0;
return a;
}
int r=ex_gcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r;
}
int mod_reverse(int a,int n)//ax=1(mod n) 求a的逆元x d*e=1mod(m)
{
int flag,x,y;
flag=ex_gcd(a,n,x,y);
if(flag==1)
return (x%n+n)%n;
else
return -1;
}
void GetD()//计算d,小数字可以,大数字不行 ,稍微大一点的使用扩展欧几里得算法
{
//e*i-1=j*fn;
/*for(int i=1;i<fn;i++)
{
if(e*i%fn==1)
{
d=i;
cout<<"d:"<<d<<endl;
return ;
}
}*/
d=mod_reverse(e,fn);
cout<<"d:"<<d<<endl;
}
void Encode()//加密
{
//c=m^e mod n;
cout<<"old m:"<<m<<endl;
c = modpow(m,e,n);
cout<<"c:"<<c<<endl;
}
void Decode()//解密
{
new_m=modpow(c,d,n);
cout<<"new m:"<<m<<endl;
}
void RSA()
{
cout<<"*********"<<endl;
RandomPQ();//随机生成PQ两个互质的数字
GetN();//根据PQ生成n
Euler();//计算欧拉函数(n)
GetE();//计算e
GetD();//计算d
cout<<"*********"<<endl<<endl;
}
int main()
{
srand(time(NULL));//设定随机种子变量
max_pq = 300;//pq的上界
min_pq = 5; //pq的下界
int sum=0;
for(int i=0;i<100;i++)//循环测试100次
{
RSA();//实际运行代码
if(e==d)
{
sum++;
}
}
cout<<sum<<endl;
return 0;
}
RSA算法的简单实现(C++)
最新推荐文章于 2024-07-23 14:18:41 发布