#include <stdio.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) //公钥e与t的互素判断
{
int t;
while(y)
{
t=x;
x=y;
y=t%y;
}
if(x == 1)
return 0; //x与y互素时返回0
else
return 1; //x与y不互素时返回1
}
int e,n;
void main()
{
int p,q,m,d,t,c,r,m1,m2,c1,c2,M,C;
printf("请输入两个素数 p,q: ");
scanf("%d%d",&p,&q);
n=p*q;
printf("计算得 n 为 %3d\n",n);
t=(p-1)*(q-1); //求n的欧拉数
printf("计算得 t 为 %3d\n",t);
printf("请输入公钥 e (1<e<t&e与t互素) : ");
scanf("%d",&e);
while(1)
{
if(r==5)
{
printf("请输入公钥 e (1<e<t&e与t互素) : ");
scanf("%d",&e);
if(e<1||e>t||fun(e,t))
{
printf("公钥e 不合要求,请重新输入: "); //e<1或e>t或e与t不互素时,重新输入
scanf("%d",&e);
}
}
if(e<1||e>t||fun(e,t))
{
printf("公钥e 不合要求,请重新输入: "); //e<1或e>t或e与t不互素时,重新输入
scanf("%d",&e);
}
if((e<1||e>t||fun(e,t))==0)
{
d=1;
while(((e*d)%t)!=1)
d++; //由公钥e求出私钥d
printf("私钥 d 为 %d\n",d);
printf("\n");
printf("加密请输入 1\n"); //加密、解密、乘积选择
printf("解密请输入 2\n");
printf("计算明文乘积请输入 3\n");
printf("计算密文乘积请输入 4\n");
printf("重新输入公钥请输入 5\n");
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: printf("请输入两个明文m1,m2: ");
scanf("%d%d",&m1,&m2);
M=m1*m2;
printf("计算得 M 为 %3d\n",M);break ;
case 4: printf("请输入两个密文c1,c2: ");
scanf("%d%d",&c1,&c2);
C=c1*c2;
printf("计算得 C 为 %3d\n",C);break;
}
}
}
}
评论0