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

📄 key.c

📁 RSA数据加密代码
💻 C
字号:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <string.h>

void main()
{
	unsigned long p,q;
	unsigned long sk;
	unsigned long y,c,d=1,h=0,j=0;
	int *m,*x;
	int i;
	 static char pki[20];
	 char ni[20];
	static int s[20]={1};
	int n[]={8,0,8,5,7,7,4,5,8,6,3,0,2,7,3,3,2,2,9,0};
	static int n1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0};
	 int *pk;
	FILE *sfp,*pfp;
	char pkfile[100];
	char skfile[100];
	void perr(char *);
	unsigned long shu();
	int *add();
	int *multi();  
	int *tz();
    int *sub();
	unsigned long chu();
	int *di();
	unsigned long mod();

	unsigned long mu();
	int cmp();
	srand((unsigned)(time(NULL)));
	do
	{
		p=shu();
		q=shu();printf("\np=%u\nq=%uk",p,q);	
		x=multi(p,q);printf("x=");
		for(i=0;i<20;i++){n[i]=x[i];
		printf("%d",x[i]);}
		
	}while(cmp(n,n1));
	sk=shu();
    m=multi(p-1,q-1);
printf("m=");
	for(i=0;i<20;i++)
		printf("%d",m[i]);
		
		printf("\nsk=u%u",sk);printf("n=");
		for(i=0;i<20;i++)
		{	n1[i]=m[i];
		printf("%d",n[i]);}		c=chu(n1,sk);
         printf("c=%u",c);
          y=mod(n1,sk);
           printf("y=%u",y);
	while (d)
		{
	       h++;
			j+=(y+d)/sk;
		d=(y+d)%sk;
			
		}printf("h=%u,j=%u\n",h,j);
	
		pk=multi(h,c);
		
		add(pk,di(j));for(i=0;i<20;i++)printf("%d",pk[i]);for(i=0;i<20;i++){ni[i]=(char)(n[i]+48);pki[i]=(char)(pk[i]+48);}
		printf("n=%s;",ni);printf("pk=%s",pki);
		printf("\nEnter  pkfile name(*.pk): ");
		gets(pkfile);
		printf("\nEnter  skfile name(*.sk): ");
		gets(skfile);
		if((sfp=fopen(skfile,"wb+"))==NULL)perr("Can't creat new file!");
		if((pfp=fopen(pkfile,"wb+"))==NULL) perr("Can't creat new file!");
		
fprintf(sfp,"n=%s;sk=%u",ni,sk);
		fprintf(pfp,"n=%s;pk=%s",ni,pki);
	
		
		fclose(sfp);
		fclose(pfp);
	
}
	unsigned long shu()                   /*产生素数++*/
{int g=1;
	unsigned long x1=0,y,i,x2=4294967295;
	while((x2>1000000000)||(x2<65536)||g)
	{
		x2=(unsigned long)(rand()*2-1);
		x1=(unsigned )rand();
	
		x1=(x1/10)<<16;
		x2=x1|x2;	

		y=x2/2;printf("y=%u",y);
		for(i=2;i<=y;i++)
		if((x2%i)==0) break;
		if(i>=y){g=0;	printf("\ni=%u,x2=%u",i,x2);return (x2);}
	}
	
}

void perr(s)
char *s;
{
	printf("\n%s",s); exit(1);
}



unsigned long chu(int *m,unsigned long sk )  /*求除*/
{ int x[20];
int s;
static int y[20]={5,9,2,7,6,9,4,9,2,4};

	unsigned long v,u,h,k=0,t=0;
	int i,a;
	int b;
	printf("sk=%u",sk);
printf("\nm=");	for(i=0;i<20;i++)printf("%d",m[i]);
    u=4294967295%sk;
    h=4294967295/sk;
	for(a=0;a<20;a++)
		x[a]=0;
	for (a=19;a>=0;a--)
	{for(b=0;b<10;b++)
		{s=x[0];x[0]=x[b+1];
		x[b+1]=s;
		}printf("\nx=");
	x[0]=m[a];
		for(i=0;i<20;i++)printf("%d",x[i]);
          while(cmp(x,y)>0)
          {
		  add((sub(x,y)),di(u));
          t=t+h; }
		  k=mu(x);
		 	t=(t+k/sk)*10; 
			k=k%sk;		printf("k=%u,t=%u",k,t);		
		   v=k;
		 for(b=0;b<10;b++)
		 {
		   x[b]=v%10;
		   v=v/10;
		 }
	}
	return(t/10);
}
unsigned long mod(int *m,unsigned long sk )  /*求yu*/
{ int x[20];
int s;
static int y[20]={5,9,2,7,6,9,4,9,2,4};

	unsigned long v,u,h,k=0,t=0;
	int a;
	int b;
    u=4294967295%sk;
    h=4294967295/sk;
	for(a=0;a<20;a++)
		x[a]=0;
	for (a=19;a>=0;a--)
	{for(b=0;b<10;b++)
		{s=x[0];x[0]=x[b+1];
		x[b+1]=s;
		}
	x[0]=m[a];
		
          while(cmp(x,y)>0)
          {
		  add((sub(x,y)),di(u));
           }
		  k=mu(x);
		 	
			k=k%sk;				
		   v=k;
		 for(b=0;b<10;b++)
		 {
		   x[b]=v%10;
		   v=v/10;
		 }
	}
	return(k);
}
 	 int *sub(int c[20],int q[20])   /*减法++*/
 {
 int i,a;
 for(i=0;i<20;i++)
 {if(c[i]>=q[i])
 c[i]=c[i]-q[i];
 else {a=1;
 c[i]=c[i]+10-q[i];
 while(c[i+a]==0)
 {c[i+a]=9;
a++; }
 c[i+a]--;
 }
 }
 return(c);}
int cmp(int *n,int *m)                           /*比较 */
{

	int i=19;

	while(n[i]==m[i])
	{
		i--;
	}
	if(n[i]>m[i])
		return 1 ;
	else 
		return 0 ;
}
 
int *di(unsigned long w)/*替换成数组++*/

{static int h[20];
	int i;
	i=0;
	while(w)
	{
		h[i]=w%10;
		w=w/10;
		i++;
	}
	return(h);
}

 unsigned long mu(int m[20])/*替换成整数*/
{
	unsigned long v=0;
	int a=10;
	while(a){a--;
		v=v*10+m[a];
		}
	return(v);
}

int *tz(int *mut)        /*调整数组++*/   
{
	int a,b,bi,i;

	for(a=0;a<20;a++)
	{
		i=0;
		b=mut[a];
		mut[a]=mut[a]%10;
		while(b)
		{
			i++;
			b=b/10;
			bi=b%10;
			mut[a+i]+=bi;
		}
	}
	return(mut);
}


int *multi(unsigned long p,unsigned long q)    /*乘法++*/
{
	 int m[10][20];
	 int mul[20];
	 
	int a,b,c,d,t;
	unsigned long u;
	for (a=0;a<20;a++)mul[a]=0;
	a=0;
	while(p)
	{
		c=p%10;
		p=p/10;
		u=q;
		b=0;
		while(u)
		{
			d=u%10;
			u=u/10;
			t=c*d;
			m[a][a+b]=t;
			mul[a+b]+=m[a][a+b];
			b++;
		}
	a++;}
	tz(mul);
	return(mul);

}
int *add(int *m,int *n)   /*加法++*/
{
	int a;
	for(a=0;a<20;a++){m[a]=m[a]+n[a];
	}tz(m);

	return(m);
}

⌨️ 快捷键说明

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