数论知识参考
算法原理
(1) 取两个随机大素数p和q (保密);
(2) 计算公开的模数 r=pq (公开);
(3) 计算欧拉函数(保密);
(4) 随机选取整数 e,满足(公开 e , 加密密钥);
(5) 计算d,满足 (保密d,解密密钥,陷门信息);
(6) 将明文 x (范围在0到r-1之间)按模为 r 自乘 e 次幂以完成加密操作,从而产生密文 y (范围在0到r-1之间):
(7) 将密文 y 按模为 r 自乘 d 次幂,完成解密操作:
代码
#include <stdio.h>
#include <stdlib.h>
int candp(int a,int b,int c)
{
int r=1;
b=b+1;
while(b!=1)
{
r=r*a;
r=r%c;
b--;
}
return r;
}
int fun(int x,int y)
{
int t;
while(y)
{
t=x;
x=y;
y=t%y;
}
if(x==1)
return 0;
else
return 1;
}
void main()
{
int p,q,e,d,m,n,t,c,r;
printf("请输入两个素数p,q:");
scanf("%d%d",&p,&q);
n=p*q;
printf("计算得n为%3d\n",n);
t=(p-1)*(q-1);
printf("计算得t为%3d\n",t);
printf("请输入公钥e:");
scanf("%d",&e);
if(e<1||e>t||fun(e,t))
{
printf("e不符合要求,请重新输入:");
scanf("%d",&e);
}
d=1;
while(((e*d)%t)!=1)
d++;
printf("经计算d为%d\n",d);
printf("1.加密\n");
printf("2.解密\n");
printf("3.退出\n");
while(1)
{
printf("选择你执行的操作:");
scanf("%d",&r);
switch(r)
{
case 1:
printf("请输入明文m:");
scanf("%d",&m);
c=candp(m,e,n);
printf("密文为%d\n",c);
break;
case 2:
printf("请输入密文c:");
scanf("%d",&c);
m=candp(c,d,n);
printf("明文为%d\n",m);
break;
case 3:
return;
default:
printf("输入错误,请重新输入:\n");
}
}
}
结果