//
#include<cstdio>
#include<iostream>
using namespace std;
int bit[50];
//求1-n的素数的过程
void Su(int n)
{
printf("1-%d的素数有: \n",n);
while(n--)
{
if(n==1)
break;
else
{
if(n==2)
printf("%d\n",n);
else
{
for(int i=2;i<n;i++)
{
if(n%i==0)
break;
if(i==n-1)
printf("%d\t",n);
}
}
}
}
printf("\n");
}
//求m^e%n的过程
int fun(int e)//把e化成二进制
{
int i=0;
while(e)
{
bit[i++]=e%2;
e/=2;
}
return i;
}
int Mod(int m,int e,int n)
{
int x=fun(e)-1;
int s=1;
while(x>=0)
{
s=(s*s)%n;
if(bit[x])
s=(s*m)%n;
x--;
}
return s;
}
//求私钥的过程
int SiYue(int e,int f )
{
int i,j,d,a[500],b[500],k;
a[0]=e;b[0]=f;
//整数“k”满足:d*e-k*f=1 方程
for(i=1;e*f!=0;i++)
{
if(e>f)
e=e%f;
else
f=f%e;
a[i]=e;b[i]=f;
}
//printf("\n");
int t=i-1;
for(j=i-1;j>=0;j--)
{
if(a[t]==0)
{
if(a[j]!=0)
{
if(j%2!=0)
k=(a[j]*d-1)/b[j];
else
d=(1+b[j]*k)/a[j];
}
else
d=1;
}
else
{
if(b[j]!=0)
{
if(j%2!=0)
k=(a[j]*d-1)/b[j];
else
d=(1+b[j]*k)/a[j];
}
else
k=0;
}
}
return d;
}
int main()
{
int p,q,e,n,t,f,d,m,c;
//p、q:两个随机素数;f=(q-1)*(p-1);e:在1到f之间随机数,且它与f的最大公约数为1
//c:密文;m:明文;d:私钥;(e,n):公钥;n=p*q;t:求1-t素数的整数
printf("输入一个整数:\n");
scanf("%d",&t);
Su(t); //调用求1-t的素数的过程
printf("输入两个大素数:\n");
printf("p=");
scanf("%d",&p);
printf("q=");
scanf("%d",&q);
n=q*p;f=(q-1)*(p-1);
printf("输入1-%d的素数:\n",f);
printf("e=");
scanf("%d",&e);
printf("\n-------------------------加密-------------------------\n");
printf("公钥(%d,%d)\n",e,n);
printf("输入m<%d明文:",n);
scanf("%d",&m);
c=Mod(m,e,n);
printf("密文c=%d\n",c);
//调用求m^e%n的过程
printf("\n-------------------------解密-------------------------\n");
printf("私钥d=%d\n",SiYue(e,f));
printf("\n");
d=SiYue(e,f); //调用求私钥d的过程
printf("明文m=%d\n",Mod(c,d,n));
printf("\n");
return 0;
}