#include<stdio.h>
#include<math.h>
//对于输入的两个数进行素数判断
int Sqrt(long a)
{
int i;
double k;
k=sqrt(a);
for(i=2;i<=k;i++)
if(a%i==0)
break;
if(i>k)
return 1;
else
{
printf("illegal!");
return -1;
}
}
//验证e(从1到r中选择)和r=(p-1)*(q-1)是否互素
int **(long e,long r)
{
int a[1000],b[1000],i;
a[0]=r,a[1]=e,b[1]=r/e,a[2]=r%e;
if(a[2]==0)
return -1;
else
for(i=1;;i++)
{
a[i+1]=a[i-1]%a[i];
b[i]=a[i-1]/a[i];
if(a[i]==1)
{
return 1;
break;
}
}
}
//私钥d,(e,r)
long key(long e,long r)
{
long d=2;
while(d<r)
{
if((d*e)%r==1)
break;
else
d++;
}
return d;
}
//加解密结果,(加密指数e,解密指数d;摸n=p*q,待处理数据s)
long result(long e,long n,long s)
{
long a[100];
long i,b=0,c=1;
while(e>0)
{
a[b++]=e%2;
e=e/2;
}
for(i=0;i<b;i++)
{
if(a[i]==1)
{
c=(c*s)%n;
s=(s*s)%n;
}
else
{
c=c;
s=(s*s)%n;
}
}
return c;
}
void main()
{
long p,q,e,n,r,c,d,i,s,o;
//素数p、q,指数e,摸n,r=(p-1)*(q-1),私钥d,数据s
printf("**************************/n");
printf(" RSA算法/n");
printf("**************************/n");
printf("请输入两个四位以上的素数:");
for(i=0;;i++)
{
scanf("%ld%ld",&p,&q);
if(Sqrt(p)!=1||Sqrt(q)!=1)
printf("数据输入不合要求,请重新输入!/n");
else
break;
}
n=p*q; //摸n
r=(p-1)*(q-1);
printf("请从1到%d的范围内选择一个数e:",r);
for(i=0;;i++)
{
scanf("%ld",&e);
if(**(e,r)==1)
break;
else
printf("e不满足与%d互素的条件,请重新选择!/n",r);
}
d=key(e,r); //私钥
for(i=0;;i++)
{
printf("选择加密请输0,解密请输1,退出请输2:");
scanf("%d",&c);
if(c==0)
{
printf("请输入待加密的数据:");
scanf("%ld",&s);
o=result(e,n,s);
//(指数e,摸n,待加密数据Data)
printf("加密后为:%ld/n",o);
}
else if(c==1)
{
printf("请输入待解密的数据:");
scanf("%ld",&s);
o=result(d,n,s);
//(私钥d,摸n,待解密数据Data)
printf("解密后为:%ld/n",o);
}
else
break;
}
}