#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int Is_Prime(int m) //判断是否为素数
{
int k,i;
k=(int)sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i>k)
return 1;
else
return 0;
}
void legal(int* tp,int* tq) //输入两个素数并检测合法性
{
while(1)
{
printf("输入两个素数并用空格隔开:\n");
scanf("%d%d",tq,tp);
if(Is_Prime(*tq))
if(Is_Prime(*tp))
break;
else
{
system("CLS");
printf("%d不是素数请重新输入,",*tp);
}
else
{
system("CLS");
printf("%d不是素数请重新输入,",*tq);
}
}
}
int MYHF(int tk,int tl) //秘钥合法性检测
{
int temp;
while(tk!=0)
{
temp=tl%tk;
tl=tk;
tk=temp;
}
if(tl==1)
return 1;
else
return 0;
}
void miyao(int * tsk,int ol) //输入秘钥
{
while(1)
{
printf("输入秘钥,秘钥与%d互质\nsk=",ol);
scanf("%d",tsk);
if(MYHF(*tsk,ol))
break;
else
printf("秘钥要与%d为互质数:",ol);
}
}
int GY(int tsk,int tr) // 公钥
{
int b1,b2,s,ys,tmp; //s 商,ys 余数 tmp 临时存数
b1=0,b2=1;
while(tsk!=1)
{
s=tr/tsk;
ys=tr%tsk;
tmp=b2;
b2=b1-b2*s;
b1=tmp;
tr=tsk;
tsk=ys;
}
return b2;
}
int jiami(int sk,int m,int r) // 加密
{
int i;
double t1;
double c,tc;
c=1,t1=1,i=0;
char string[30];
itoa(sk,string,2); //将10进制转换为2进制
i=strlen(string)-1; //获得二进制位数
for(int j=0;j<=i;j++)
{
c=fmod(c*c,r);
if(string[j]=='1')
{
tc=c;
c=fmod(c*m,r);
}
}
t1=(int)ceil(c);
return t1;
}
int main(void)
{
int q,p,r,ol,sk,pk,mw,pm,gy; //r 公开模函数,ol 欧拉函数,sk 秘钥,pk 公钥
legal(&q,&p);
r=q*p;
ol=(p-1)*(q-1);
printf("q=%d,p=%d,r=%d,ol=%d \n",q,p,r,ol);
miyao(&sk,ol);
pk=GY(sk,ol);
printf("pk=%d \n",pk);
printf("输入需要加密的内容:");
scanf("%d",&pm);
system("CLS");
printf("明文为=%d\n",pm);
pm=jiami(sk,pm,r);
printf("密文为=%d\n",pm);
printf("输入公钥解密加密的内容:");
scanf("%d",&gy);
printf("解密内容为:%d\n",jiami(gy,pm,r));
}
RSA加密算法的实现
最新推荐文章于 2022-11-26 23:17:56 发布