验证RSA加密算法,用到几点:
1,快速幂取整.2.米勒-拉宾算法判断大素数3.欧拉定理
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
__int64 quick_pow(__int64 a,__int64 b,__int64 m)//快速幂取整
{
__int64 d=1,t=a;
while(b>0)
{
if (b%2)
d=(d*t)%m;
b>>=1;
t=(t*t)%m;
}
return d;
}
int millerrabin(__int64 n,int alpha)
{
__int64 i;
for (i=1;i<=alpha*log(n);i++)
{
a=rand()%(n-1)+1;//随机出基数
// printf("%d %d %d\n",a,n-1,n);
if (modular(a,n-1,n))
return 0;
}
return 1;
}
int modular(__int64 a,__int64 b,__int64 c)//快速幂取模(a的b次方取余c)
{
__int64 ans=1,t=a;
a=a%c;
while(b>0)
{
if ((b&1)==1)//如果是奇数
ans=(ans*a)%c;//先将这个数乘进去
b>>=1;//b=b/2;
t=a;
a=(a*a)%c;
if ((a==1)&&(t!=1)&&(t!=c-1))
return 1;
}
// printf ("%d\n",ans);
if (ans==1)
return 0;
return 1;
}
__int64 gcd(__int64 a,__int64 b)
{
if (b==0)
return a;
else
return gcd(b,a%b);
}
__int64 ans_gcd(__int64 a,__int64 b,__int64 *x,__int64 *y)
{
if (b==0)
{
*x=1;
*y=0;
return a;
}
__int64 ans=ans_gcd(b,a%b,x,y);
__int64 temp=*x;
*x=*y;
*y=temp-a/b*(*y);
return ans;
}
__int64 calculate(__int64 a,__int64 b)
{
__int64 x,y,ans;
__int64 gcd=ans_gcd(a,b,&x,&y);
if (1%gcd!=0)//如果a与b不互质则没有乘法逆元
return -1;
x=x*(1/gcd);
b=abs(b);
ans=x%b;
if (ans<=0)
ans=ans+b;
return ans;
}
int main()
{
__int64 p,q,e,x,d,t,ans,n;
printf("请输入两个不相等的质数\n");
srand(time(NULL));
scanf("%I64d%I64d",&p,&q);
n=p*q;
while((millerrabin(p,3)==0)||(millerrabin(q,3)==0)||p==q)//如果两个有一个没有通过米勒拉宾测试,即有合数
{
printf("请重新输入!\n");
scanf("%I64d%I64d",&p,&q);
}
x=(p-1)*(q-1);
printf("欧拉函数为%I64d\n",x);
printf("请随机选取一个与欧拉函数互质的整数\n");
scanf("%I64d",&e);
while(gcd(x,e)!=1)
{
printf("请重新输入\n");
scanf("%I64d",&e);
}
d=calculate(e,x);
printf("公钥为:(%I64d %I64d)\n",e,n);
printf("私钥为:(%I64d %I64d)\n",d,n);
printf("请输入需要传输的内容\n");
scanf("%I64d",&t);
ans=quick_pow(t,e,n);
printf("传输的密文为:%I64d\n",ans);
ans=quick_pow(ans,d,n);
printf("最终解码密文为:%I64d\n",ans);
return 0;
}