#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
char s[100],*c;
int n,e,d,i,C,j,k=0,len;
int str[100],b[30];
unsigned gcd(unsigned a,unsigned b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
void Egcd(int a,int b,int &x,int &y)
{
if(b==0||a==0)
{
x=1;y=0;
return ;
}
if(a<b)
{
Egcd(a,b%a,x,y);
x=(int)(b*y+1)/a;
}
else{
Egcd(a%b,b,x,y);
y=(int)(a*x-1)/b;
}
}
void RSA()
{
int p,q,N,Y;
printf("请输入素数p和q:");
scanf("%d,%d,&p,&q");
n=q*p;
N=(p-1)*(q-1);
printf("n=%d N=%d\n",n,N);
srand((unsigned)time(NULL));//初始化随机数
while(1)
{
e=rand()%N;
printf("e==%d\n",e);
if(e==0)
continue;
if(gcd(N,e)==1)
{
break;
}
}
printf("e=%d\n",e);
Egcd(e,N,d,Y);
printf("公钥PU={e=%d,n=%d}\n",e,n) ;
printf("私钥PR={d=%d,n=%d}\n",e,n);
}
void encrypt()//加密函数
{
len=strlen(s);
// hgprintf("len=%d\n",len);
for(i=0;i<len;i++)//去掉s【100】中的空格
{
if(s[i]<97||s[i]>122)
{
b[k]=i;
k++;
for(j=i;j<len-1;j++)
{
s[j]=s[j+1];
}
len--;
}
}
s[len]='\0';//结束符
printf("密文是: ") ;
for(i=0;i<len;i++)
{
C=1;
printf("shi ji=%d\n",s[i]-97);
for(int j=0;j<e;j++)
{
C=(C*(s[i]-97))%n;
printf("C=%ld\n",C);
}
str[i]=C;
printf("%d ",str[i]);
}
printf("\n");
}
void decrypt() //解密函数
{
c=(char*)malloc(len*sizeof(int));
for(i=0;i<len;i++)//实现解密
{
C=1;
for(int j=0;j<d;j++)
{
C=(C*(str[i]))%n;
printf("C=%ld\n",C);
}
printf("C=%d\n",C);
c[i]=C+97;
}
c[i]='\0';
puts(c);
int z;
for( z=0;z<k;z++)
{
for(i=0;i<len;i++)
{
if(i==b[z])
{
for(j=len;j>i;j--)
{
c[j]=c[j-1];
}
c[i]=' ';
len++;
b[z+1]=b[z+1]+(z+1);
break;
}
}
}
c[len]='\0';
printf("明文: ");
puts(c);
}
int function()//系统功能选择界面
{
int choice;
printf("=========================================\n");
printf(" 欢迎进入RSA算法 \n");
printf(" 1--加密 \n");
printf(" 2--解密 \n");
printf(" 3--退出 \n");
printf("=========================================\n");
printf("请输入所选择的功能号是:");
scanf("%d",&choice);
return choice;
}
int main()
{
int function();
int fc;
printf("请输入初始明文(小写):");
gets(s);
//puts(s)
RSA();
while(1)
{
fc=function();
if(fc==1)
encrypt();
else if(fc==2)
decrypt();
else if(fc==3)
break;
else
printf("输入有误,冲重新输入!\n");
}
return 0;
}
实验四【实验二的第一小节】公钥密码学
猜你喜欢
转载自blog.csdn.net/qq_40270751/article/details/82848072
今日推荐
周排行