⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa.c

📁 rsa 的C语言实现 实现加密解密和素数生成功能
💻 C
📖 第 1 页 / 共 2 页
字号:
			sub(b1,temp,b2);
			mov(t,b1);
		}
	}

			for(i=0;i<MAX;i++)
				t[i]=0;
			add(b2,g,t);
			for(i=0;i<MAX;i++)
				temp[i]=d[i]=0;
	    	divt(t,g,temp,d);
    printf("由以上的(p-1)*(q-1)和 e 计算得出的 d : ");
    for(i=0;i<d[MAX-1];i++)
	printf("%d",d[d[MAX-1]-i-1]);
    printf("\n\n");
}





/*/求解密密钥d的函数(根据Euclid算法)96403770511368768000*/
unsigned long  rsa(unsigned long p,unsigned long q,unsigned long e)  /*/求解密密钥d的函数(根据Euclid算法)*/
{
unsigned long g,k,r,n1,n2,t;
unsigned long b1=0,b2=1;

 g=(p-1)*(q-1);
 n1=g;
 n2=e;
    
    while(1)
 {
        k=n1/n2;
        r=n1-k*n2;
  if(r!=0)
  {
     n1=n2;
     n2=r;
     t=b2;
     b2=b1-k*b2;
     b1=t;
  }

  else
  {
   break;
  }

 }

    return (g+b2)%g;
}
/*/------------------------------------------导入导出公钥和私钥------------------------------------/*/
void loadpkey(int e[MAX],int n[MAX])  //导入公钥
{
	FILE *fp;
	char filename[25],str[MAX],ch;
	int i,k;
	for(i=0;i<MAX;i++)
		e[i]=n[i]=0;
	while(1)
	{
    printf("\n");
	printf("为导入(e,n),请输入加密密钥对文件路径: \n");
    scanf("%s",filename);
	 if((fp=fopen(filename,"r"))==NULL)
		 printf("输入的文件不存在,请重新输入!\n");
	 else break;
	}
	 k=0;
	 while((ch=fgetc(fp))!=EOF)
	 {	
		if(ch!=' ')
		{
		str[k]=ch;
              k++;
		}
	    else
		{
	   for(i=0;i<k;i++)
	   {
		e[i]=str[k-i-1]-48;
	   }
	    e[MAX-1]=k;
	    k=0;
		}
	}
	 	for(i=0;i<k;i++)
		n[i]=str[k-i-1]-48;
		n[MAX-1]=k;
		printf("\n加密密钥 e : ");
		for(i=0;i<e[MAX-1];i++)
		printf("%d",e[e[MAX-1]-i-1]);
		printf("\n");
		printf("\n    公钥 n : ");
		for(i=0;i<n[MAX-1];i++)
		printf("%d",n[n[MAX-1]-i-1]);
		printf("\n");
		fclose(fp);
		printf("\n导入(e,n)成功!\n");
		getchar();
}

void loadskey(int d[MAX],int n[MAX]) //导入私钥
{
	{
	FILE *fp;
	char filename[25],str[MAX],ch;
	int i,k;
	for(i=0;i<MAX;i++)
		d[i]=n[i]=0;
	while(1)
	{
	printf("为导入(d,n),请输入解密密钥对文件的路径: \n");
    scanf("%s",filename);
	 if((fp=fopen(filename,"r"))==NULL)
	 {
	   printf("输入的文件不存在,请重新输入!\n");   
	 }
	 else break;
	}
	 k=0;
	 while((ch=fgetc(fp))!=EOF)
	 {	
		if(ch!=' ')
		{
		str[k]=ch;
        k++;
		}
	    else
		{
	   for(i=0;i<k;i++)
	   {
		d[i]=str[k-i-1]-48;
	   }
	    d[MAX-1]=k;
	    k=0;
		}
	}
	 	for(i=0;i<k;i++)
	    	n[i]=str[k-i-1]-48;
		n[MAX-1]=k;
		printf("\n解密密钥 d : ");
		for(i=0;i<d[MAX-1];i++)
		    printf("%d",d[d[MAX-1]-i-1]);
		printf("\n");
		printf("\n    公钥 n : ");
		for(i=0;i<n[MAX-1];i++)
		    printf("%d",n[n[MAX-1]-i-1]);
		printf("\n");
		fclose(fp);
		printf("\n导入(d,n)成功!\n");
		getchar();
}
}

void savepkey(int e[MAX],int n[MAX])//导出公钥
{
    FILE *fp;
	 int  i; 
	char  savefile[25],ch;
	printf("导出加密密钥(e,n),存放的文件路径为: ");
    scanf("%s",savefile);
	printf("\n");
    fp=fopen(savefile,"w");
	for(i=0;i<e[MAX-1];i++)
	{
		ch=e[e[MAX-1]-i-1]+48;
		fputc(ch,fp);
	}
	ch=' ';
	fputc(ch,fp);
	for(i=0;i<n[MAX-1];i++)
	{
		ch=n[n[MAX-1]-i-1]+48;
		fputc(ch,fp);
	}
	fclose(fp);
	printf("\n保存(e,n)操作完成!\n");
}

void saveskey(int d[MAX],int n[MAX])//导出私钥
{
    FILE *fp;
	 int  i; 
	char  savefile[25],ch;
	printf("导出解密密钥(d,n),存放的文件路径为: ");
    scanf("%s",savefile);
	printf("\n");
    fp=fopen(savefile,"w");
	for(i=0;i<d[MAX-1];i++)
	{
		ch=d[d[MAX-1]-i-1]+48;
		fputc(ch,fp);
	}
	ch=' ';
	fputc(ch,fp);
	for(i=0;i<n[MAX-1];i++)
	{
		ch=n[n[MAX-1]-i-1]+48;
		fputc(ch,fp);
	}
	fclose(fp);
	printf("\n保存(d,n)操作完成!\n");


}

/*/------------------------------------------加密和解密的块------------------------------------/*/

void  printbig(struct slink *h)
{
	 struct slink *p;
	    int i;
	 p=(struct slink * )malloc(LEN);
	 p=h;
   if(h!=NULL)
	do 
	{
		for(i=0;i<p->bignum[MAX-1];i++)
        printf("%d",p->bignum[p->bignum[MAX-1]-i-1]);
        p=p->next;
	}

	while(p!=NULL);
    printf("\n\n");

 }

void  tencrypto(int e[MAX], int n[MAX])/*//对有需要的文件进行加密*/
{
   FILE *fp;
    int i,k,count,temp,c;
   char filename[25],ch,encryfile[25];
   struct slink  *p,*p1,*p2;
   struct slink  *h;
   h=p=p1=p2=(struct slink * )malloc(LEN);
   h=NULL;
   printf("\n输入需要加密的文件路径 : ");
   scanf("%s",filename);
   if((fp=fopen(filename,"r"))==NULL)
   {
	   printf("Cannot open file !\n");
	   exit(0);
   }
printf("\n文件的原文内容:\n\n");
   count=0;
   while((ch=fgetc(fp))!=EOF)
   {  
	   putchar(ch);
       c=ch;
       k=0;
	if(c<0)
	{
		c=abs(c);/*/把负数取正并且做一个标记*/
		p1->bignum[MAX-2]='0';
	}
	else
	{
		p1->bignum[MAX-2]='1';
	}

	while(c/10!=0)
	{
		temp=c%10;
		c=c/10;
		p1->bignum[k]=temp;
		k++;
	}
	p1->bignum[k]=c;
    p1->bignum[MAX-1]=k+1;
	count=count+1;
	if(count==1)
		h=p1;
	else p2->next=p1;
	p2=p1;
    p1=(struct slink * )malloc(LEN);
	}
    p2->next=NULL; 
    printf("\n");
  	 fclose(fp);

//   printf("加密后文件的保存路径 : \n");
//   scanf("%s",encryfile);
//   fp=fopen(encryfile,"w");
   fp=fopen(filename,"w");
   p=p1=(struct slink * )malloc(LEN);
   p=h;
   printf("\n加密后文件中所形成密文:\n\n");
   if(h!=NULL)
	do 
	{ 
		expmod( p->bignum , e ,n ,p1->bignum);
		ch=p1->bignum[MAX-2];
		printf("%c",ch);
	    fputc(ch,fp);
		if ((p1->bignum[MAX-1]/10) ==0)/*/判断p1->bignum[99]的是否大于十;*/
		{
			ch=0+48;
			printf("%c",ch);
			fputc(ch,fp);
			ch=p1->bignum[MAX-1]+48;
			printf("%c",ch);
			fputc(ch,fp);
		}
		else
		{
			ch=p1->bignum[MAX-1]/10+48;
            printf("%c",ch);
			fputc(ch,fp);
			ch=p1->bignum[MAX-1]%10+48;
			printf("%c",ch);
			fputc(ch,fp);
		}

     for(i=0;i<p1->bignum[MAX-1];i++)
     {
		 printf("%d",p1->bignum[i]);
         ch=p1->bignum[i]+48;
	     fputc(ch,fp);
	 }
     p=p->next;
	 p1=(struct slink * )malloc(LEN);
	}while(p!=NULL);
	printf("\n\n");
    fclose(fp);
	return;
}

void  tdecrypto(int d[MAX], int n[MAX])
{
	
	  FILE *fp;   
	struct slink *h,*p1,*p2;
	  char ch,encryfile[25],decryfile[25];
	   int i,j,k,c,count,temp;
   printf("\n输入加密过的文件路径 : ");
   scanf("%s",encryfile);
   if((fp=fopen(encryfile,"r"))==NULL)
   {
	   printf("此文件不存在!\n");
	   exit(0);
   }
   printf("\n文件中密文内容:\n\n");
   i=0;
   j=3;
   count=0;
   h=p1=p2=(struct slink * )malloc(LEN);
   
      while((ch=fgetc(fp))!=EOF)
   {  
	   putchar(ch);
       c=ch;	   
	   if(j==3)
	   {
	   p1->bignum[MAX-2]=c;
	   j--;
	   }
	   else if(j==2)
	   {
		   temp=c-48;
		   j--;
	   }
	   else if(j==1)
	   {
		   p1->bignum[MAX-1]=temp*10+c-48;
		   j--;
	   }
	   else if (j==0)
	   {
			   p1->bignum[i]=c-48;
		       i++;
		    if(i==p1->bignum[MAX-1])
		   { 
			   i=0;
			   j=3;
			   count++;
		       if (count==1)
			   h=p1;
        	   else p2->next=p1;
	           p2=p1;
               p1=(struct slink * )malloc(LEN);
		   }
	   }
	  }
	 p2->next=NULL; 
	 printf("\n");
  	 fclose(fp);

	
//	printf("解密后的明文文件保存路径 : \n");
//    scanf("%s",decryfile);
//    fp=fopen(decryfile,"w");
	   fp=fopen(encryfile,"w");
	printf("\n解密密文后文件中的明文:\n\n");
	p2=(struct slink * )malloc(LEN);
    p1=h;
	k=0;
	if(h!=NULL)/*/temp为暂存ASIIC码的int值*/
	  do
	  {
		  for(i=0;i<MAX;i++)
			  p2->bignum[i]=0;
		  expmod( p1->bignum , d ,n ,p2->bignum);		  
		  temp=p2->bignum[0]+p2->bignum[1]*10+p2->bignum[2]*100;
		if (( p2->bignum[MAX-2])=='0')
		{
			temp=0-temp;
		}/*/转化为正确的ASIIC码,如-78-96形成汉字	*/	 
		ch=temp;/*  str[k]--->ch */
		printf("%c",ch);/*  str[k]--->ch */
		fputc(ch,fp);/*/写入文件str[k]--->ch*/
		k++;
	    p1=p1->next;
		p2=(struct slink * )malloc(LEN);
		}while (p1!=NULL);
	    printf("\n\n");
        fclose(fp);
return;

}


 struct slink *input(void)/*/输入明文并且返回头指针,没有加密时候转化的数字*/
{   
  struct  slink *head;
  struct  slink *p1,*p2;
     int  i,n,c,temp;
    char  ch;
     n=0;
	p1=p2=(struct slink * )malloc(LEN);
	head=NULL;
	printf("\n请输入你所要加密的内容 : \n");
while((ch=getchar())!='\n')
   {
	i=0;
	c=ch;
	if(c<0)
	{
		c=abs(c);/*/把负数取正并且做一个标记*/
		p1->bignum[MAX-2]='0';
	}
    else
	{
		p1->bignum[MAX-2]='1';
	}
	while(c/10!=0)
	{
		temp=c%10;
		c=c/10;
		p1->bignum[i]=temp;
		i++;
	}
	p1->bignum[i]=c;
    p1->bignum[MAX-1]=i+1;
	n=n+1;
	if(n==1)
		head=p1;
	else p2->next=p1;
	p2=p1;
    p1=(struct slink * )malloc(LEN);
	}
    p2->next=NULL; 
	return(head);
}



struct slink *jiami(int  e[MAX],int  n[MAX],struct  slink *head)
{
	 struct  slink *p;
	 struct  slink *h;
     struct  slink *p1,*p2;
	    int  m=0,i;
	printf("\n");
		printf("加密后形成的密文内容:\n");
	p1=p2=(struct slink* )malloc(LEN);
	h=NULL;
    p=head;
   if(head!=NULL)
	do 
	{
      
		expmod( p->bignum , e ,n ,p1->bignum);

 for(i=0;i<p1->bignum[MAX-1];i++)
 {
  printf("%d",p1->bignum[p1->bignum[MAX-1]-1-i]);
 }

		m=m+1;
	if(m==1)
		h=p1;
	else p2->next=p1;
	p2=p1;
    p1=(struct slink * )malloc(LEN);
    p=p->next;
	}	while(p!=NULL);
	p2->next=NULL;   
     p=h;
    printf("\n");

	return(h);
    
}

void jiemi(int d[MAX],int n[MAX],struct  slink *h)
{
     int   i,j,temp;
	 struct slink *p,*p1;
	 char ch[65535];
	 p1=(struct slink* )malloc(LEN);
	 p=h;
	 j=0;
	 
	 if(h!=NULL)
		do 
	{
		for(i=0;i<MAX;i++)
            p1->bignum[i]=0;

		expmod( p->bignum , d ,n ,p1->bignum);

		temp=p1->bignum[0]+p1->bignum[1]*10+p1->bignum[2]*100;
		if (( p1->bignum[MAX-2])=='0')
		{
			temp=0-temp;
		}
		 
			ch[j]=temp;
		j++;
	    p=p->next;
	}while (p!=NULL);
	printf("\n");
	printf("解密密文后所生成的明文:\n");
	for(i=0;i<j;i++)
		printf("%c",ch[i]);
	printf("\n");
	return;
	
}


void menu()
{
    printf("\n\n\n");
	printf("\n\n\n");
	printf("               R--------产生密钥对      \n\n\n");
    printf("               S--------保存密钥对      \n\n\n");
	printf("               L--------载入密钥对      \n\n\n");
	printf("               E--------对文件加密      \n\n\n");
	printf("               D--------对文件解密      \n\n\n");
	printf("               T--------简单测试      \n\n\n");
	printf("               Q--------退出            \n\n\n");
	printf("请选择一种操作:");

}



               			




/*/-------------------------------------------------主MAIN函数-----------------------------------/*/
void main()
{
	   int  i;
	  char  c;
       int  p[MAX],q[MAX],n[MAX],d[MAX],e[MAX],m[MAX],p1[MAX],q1[MAX];
	struct slink *head,*h1,*h2;
	 for(i=0;i<MAX;i++)
     m[i]=p[i]=q[i]=n[i]=d[i]=e[i]=0;/*/简单初始化一下*/
	 
	 while (1)
	 {
		 menu();
		 c=getchar();
		 getchar();//接受回车符
	if ((c=='r') || (c=='R'))//操作r产生密钥对
	{        
		 for(i=0;i<MAX;i++)
             m[i]=p[i]=q[i]=n[i]=d[i]=e[i]=0;
		    printf("\n\n\n\n\n\n\n\n\n");
			printf("\n\n随机密钥对产生如下:\n\n");
	        prime_random(p,q);/*/随机产生两个大素数*/
	        mul(p,q,n);
			printf("由 p、q 得出 n :");
			print(n);
	        mov(p,p1);
	        p1[0]--;      
            mov(q,q1);
	        q1[0]--;      /*/q-1;*/
	        mul(p1,q1,m);//m=(p-1)*(q-1)
	        erand(e,m);
	        rsad(e,m,d);
			printf("密钥对产生完成,现在可以直接进行加解密文件!\n");
				printf("\n按任意键回主菜单…………");
			getchar();
	}
		else if((c=='l') || (c=='L'))
		{
			printf("\n\n选择导入密钥类型:加密密钥(P)还是解密密钥(S)?");
			c=getchar();
			  getchar();
			if ((c=='p')||(c=='P'))
				loadpkey(e,n);
			else if((c=='s')||(c=='S'))
				loadskey(d,n);	
			printf("\n按任意键回主菜单…………");
			getchar();
		}
    	else if ((c=='e') || (c=='E'))
		{
		     tencrypto( e,  n);
			 printf("\n加密文件操作完成!\n");
			 printf("\n按任意键回主菜单…………");
			 getchar();
			 getchar();
		}
    	else if ((c=='d') || (c=='D'))
	   {
		    tdecrypto( d, n);
			printf("\n解密文件操作完成!\n");
			printf("\n按任意键回主菜单…………");
			getchar();
			getchar();
	   }
		else if ((c=='s')||(c=='S'))
		{
			savepkey(e,n);
			 printf("\n");
			saveskey(d,n);
			printf("\n按任意键回主菜单…………");
			getchar();
			getchar();
		}
		else if((c=='T') || (c=='t'))
		{
			  head=input();
              h1=jiami(  e,  n, head);
                 jiemi(  d,  n, h1);
				 printf("\nRSA测试工作完成!\n");
			 printf("\n按任意键回主菜单…………");
			 getchar();
		}
		else if ((c=='Q') || (c=='q'))
			break;
	 }
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -