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

📄 rsa.c

📁 站长96年写的一个Internet上用的股票行情、分析、交易、资讯程序源码
💻 C
字号:
#include <windows.h>#include <malloc.h>#include <dos.h>#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>#define	DATALENGTH	350#define	MLENGTH		26#define	TESTNUM		20#define	SKLENGTH	4#define TEXTLENGTH	20typedef signed char byteint[DATALENGTH]; //-128 ->127typedef signed char mtype[MLENGTH];mtype	*Model;byteint ONEVALUE,ZEROVALUE,TWOVALUE,EIGHTVALUE;//byteint *plaintext;//byteint *cipertext;void InitInt(void);void SetZero(byteint A);void IntCpy(byteint A,byteint B);int IntValid(byteint validtemp);int IntCmp(byteint A,byteint B);void Plus(byteint A,byteint B,byteint C);void Substract(byteint SA,byteint SB,byteint SC);void Multiply(byteint A,byteint B,byteint C);void SetMode(byteint A,byteint B,byteint C,byteint D);void IntRandom(byteint RandomA,int num);void LoadInt(byteint A,mtype B);void Mdata(void);void TransBi(byteint B,signed char flag[400]);int PowerMode(byteint A,byteint C,byteint D,signed char flag[400]);int Prime(byteint Prm);int ComputingPK(byteint Rvalue,byteint SK,byteint PK);int StrToByt(char *str,byteint byt);void BytToStr(byteint byt,char *str);void PackInt(byteint A,int B);byteint R,SK,PK,RsaKey; int RsaOk =0;extern int UDPBlockingHook(void);extern char szDataPath[128];int RsaPrepare(byteint sk,byteint pk,byteint r){ 	byteint p,q,Rvalue,buf1,buf2;		Model =(mtype *)_fmalloc(TESTNUM*DATALENGTH);	Mdata();	InitInt();	Prime(p);	Prime(q);		Multiply(p,q,r);	Substract(p,ONEVALUE,buf1);	Substract(q,ONEVALUE,buf2);	Multiply(buf1,buf2,Rvalue);	ComputingPK(Rvalue,sk,pk); 		_ffree(Model);	return TRUE;}int ReadRsaPk(int no,byteint r,byteint pk){	char file[80],item[10],temp[100+1];	sprintf(file,"%s\\sysinfo.dat",szDataPath);	sprintf(item,"QS%d",no);		if(GetPrivateProfileString("ZQS_RSA_R", item, "", temp,100, file)!=0)		StrToByt(temp,r);		else		return FALSE;	if(GetPrivateProfileString("ZQS_RSA_PK", item, "", temp, 100, file)!=0)		StrToByt(temp,pk);	else		return FALSE;	return TRUE;		}int WriteRsaPk(int no,byteint r,byteint pk){	char file[80],item[10],temp[100+1];	sprintf(file,"%s\\sysinfo.dat",szDataPath);	sprintf(item,"QS%d",no);		memset(temp,0,100+1);	BytToStr(r,temp);	if(WritePrivateProfileString("ZQS_RSA_R", item, temp, file)==0)		return FALSE;	memset(temp,0,100+1);	BytToStr(pk,temp);		if(WritePrivateProfileString("ZQS_RSA_PK", item, temp,file)==0)		return FALSE;	return TRUE;		}int ReadRsaCiper(int no,byteint ciper,char *deskey){  	char file[80],item[10],temp[100+1];     sprintf(file,"%s\\sysinfo.dat",szDataPath);    sprintf(item,"QS%d",no);	if(GetPrivateProfileString("ZQS_DES_KEY", item, "", deskey, 100, file)==0)		return FALSE;	if(GetPrivateProfileString("ZQS_DES_RSA", item, "", temp, 100, file)==0)		return FALSE;	StrToByt(temp,ciper);    return TRUE;}int WriteRsaCiper(int no,byteint ciper,char *deskey){  	char file[80],item[10],temp[100+1];     sprintf(file,"%s\\sysinfo.dat",szDataPath);    sprintf(item,"QS%d",no);	if(WritePrivateProfileString("ZQS_DES_KEY", item, deskey, file)==0)		return FALSE;	memset(temp,0,100+1);		BytToStr(ciper,temp);	if(WritePrivateProfileString("ZQS_DES_RSA", item, temp, file)==0)		return FALSE;    return TRUE;}int EncipherDesKey(char *deskey,byteint r,byteint pk,byteint rsakey){	signed char flag[400];    byteint buf1;	Model =(mtype *)_fmalloc(TESTNUM*DATALENGTH);		Mdata();	InitInt();		//if(deskey[0] ==0)			IntRandom(buf1,8);    //else    //    StrToByt(deskey,buf1);	TransBi(pk,flag);	PowerMode(buf1,r,rsakey,flag);				memset(deskey,0,9);    BytToStr(buf1,deskey);    		_ffree(Model);	return 0;}int DecipherDesKey(byteint rsakey,byteint r,byteint sk,char *deskey){	byteint buf1;	signed char flag[400];	Model =(mtype *)_fmalloc(TESTNUM*DATALENGTH);			Mdata();	InitInt();	TransBi(PK,flag);	PowerMode(rsakey,r,buf1,flag);	memset(deskey,0,9);    BytToStr(buf1,deskey);    	_ffree(Model);		return 0;}void InitInt(void){	SetZero(ONEVALUE);	ONEVALUE[DATALENGTH-1]=1;	SetZero(ZEROVALUE);	SetZero(TWOVALUE);	TWOVALUE[DATALENGTH-1]=2;	SetZero(EIGHTVALUE);	EIGHTVALUE[DATALENGTH-1]=8;	//randomize();	srand((unsigned)time(NULL));}void Multiply(byteint A,byteint B,byteint C){	register i,j,w;	int X,Y,Z;	int Avalid=0;	int Bvalid=0;	while(A[Avalid]==0 &&Avalid <DATALENGTH)		Avalid++;	while(B[Bvalid]==0 &&Bvalid <DATALENGTH)		Bvalid++;	SetZero(C);	for(i=DATALENGTH -1;i>=Avalid;i--)	{		for(j=DATALENGTH-1;j>=Bvalid;j--)		{			X=A[i]*B[j];			Y=X/10;			Z=X-10*Y;			w=i+j-(DATALENGTH-1);			C[w]=C[w]+Z;			C[w-1]=C[w-1]+(C[w]/10)+Y;			C[w]=C[w]-(C[w]/10)*10;		}	}}void SetZero(byteint A){	memset(A,0,DATALENGTH);}void IntCpy(byteint A,byteint B){	memcpy(A,B,DATALENGTH);}void Plus(byteint A,byteint B,byteint C){	register i;	int X,Y,Z,m,n,valid;	m=IntValid(A);	n=IntValid(B);	valid=(m>n) ? m+1:n+1;	SetZero(C);	for(i=DATALENGTH -1;i>=DATALENGTH -valid;i--)	{		X=A[i] +B[i];		Y=X/10;		Z=X-10*Y;		C[i]=C[i]+Z;		C[i-1]=C[i-1]+Y;	}}void Substract(byteint SA,byteint SB,byteint SC){	byteint buf;	register i,j;	int X;	IntCpy(buf,SA);	SetZero(SC);	for(i=DATALENGTH-1;i>=0;i--)	{		if(buf[i]<SB[i]){			buf[i]+=10;			if(buf[i-1]>0)				(buf[i-1])--;			else {				j=i-1;				while (buf[j]==0)					buf[j--]=9;				buf[j]--;			}		}		X=buf[i]-SB[i];		SC[i]=X;	}}int IntCmp(byteint A,byteint B){	int stat;	stat =memcmp(A,B,DATALENGTH);	if(stat ==0)		return 0;	if(stat>0)		return 1;	return -1;}int IntValid(byteint validtemp){	register i=0;	while (validtemp[i]==0 && i<DATALENGTH)		i++;	return DATALENGTH-i;}void SetMode(byteint A,byteint B,byteint C,byteint D){	register i,j,k;	int valid_1,valid_2,valid,sbits,cmpval;	byteint buf1,buf2;	SetZero(D);	IntCpy(C,A);	valid_2=IntValid(B);	while((cmpval =IntCmp(C,B))>0){		valid_1 =IntValid(C);		valid =valid_1-valid_2;		if(valid>0){			i=DATALENGTH -valid_1;			j=DATALENGTH -valid_2;			sbits=0;			for(k=j;k<DATALENGTH;k++){				if(C[i]>B[j])					break;				if(C[i]<B[j]){					sbits=1;					break;				}				i++;j++;			}			valid=valid -sbits;			SetZero(buf1);			for(i=valid;i<DATALENGTH;i++){				j=i-valid;				buf1[j]=B[i];			}		}		else			IntCpy(buf1,B);		D[DATALENGTH-1-valid]++;		Substract(C,buf1,buf2);		IntCpy(C,buf2);	}	if(cmpval==0){		SetZero(C);		D[DATALENGTH-1]++;	}}void IntRandom(byteint RandomA,int num){	int i;	SetZero(RandomA);	while(!(RandomA[DATALENGTH-1] % 2))		RandomA[DATALENGTH-1]=rand() % 10;	while(!RandomA[DATALENGTH-num])		RandomA[DATALENGTH-num] =rand() % 10;	i=DATALENGTH -2;	while(i>=DATALENGTH -num +1)		RandomA[i--]=rand() % 10;}void LoadInt(byteint A,mtype B){	register i,j;	SetZero(A);	i=DATALENGTH -1;	j=MLENGTH -1;	while(j>=0)		A[i--]=B[j--];}void Mdata(void){	register i,j;	int k=MLENGTH -2;	memset(Model,0,TESTNUM*MLENGTH);	for(i=0;i<TESTNUM;i++){		for(j=MLENGTH-1;j>=k;j--)			Model[i][j]=rand()%10;		k-=1;	}}void TransBi(byteint B,signed char flag[400]){	byteint buf;	byteint result;	byteint temp;	register i;	memset(flag,0,400);	i=399;	IntCpy(buf,B);	while(IntCmp(buf,ZEROVALUE)==1){		UDPBlockingHook();		SetMode(buf,TWOVALUE,temp,result);		flag[i]=temp[DATALENGTH -1];		IntCpy(buf,result);		i--;	}	flag[i] =-1;}int PowerMode(byteint A,byteint C,byteint D,signed char flag[400]){	byteint buf;	byteint result;	byteint temp,P;	register i;	IntCpy(temp,A);	if(flag[399]==1)		IntCpy(result,A);	else		IntCpy(result,ONEVALUE);	i=398;	while(flag[i]!=-1){		UDPBlockingHook();		Multiply(temp,temp,buf);		SetMode(buf,C,temp,P);		if(flag[i]!=0){			Multiply(temp,result,buf);			SetMode(buf,C,result,P);		}		i--;	}	IntCpy(buf,C);	IntCpy(D,result);	Substract(buf,ONEVALUE,temp);	if(IntCmp(result,ONEVALUE)==0)		return 1;	if(IntCmp(result,temp)==0)		return 2;	return 0;}int Prime(byteint Prm){	int i,k,ok,cnt=0;	signed char flag[400];	byteint A,B,D,buf1,buf2;	while(1){		int pass=0,pass_2=0;		cnt++;		IntRandom(B,MLENGTH);		IntCpy(Prm,B);		Substract(B,ONEVALUE,buf1);		SetMode(buf1,TWOVALUE,buf2,B);		TransBi(B,flag);		ok=1;		for(i=0;i<TESTNUM;i++){			LoadInt(A,Model[i]);			k=PowerMode(A,Prm,D,flag);			if(k!=1&&k!=2)				break;			if(k==2){				pass_2=1;			}		}		if(ok && pass_2 ){			return 0;		}	}}int ComputingPK(byteint Rvalue,byteint SK,byteint PK){	register i;	byteint PA,PB,PC,buf,temp,buf2;	SetZero(PK);	while(1)	{		IntRandom(SK,SKLENGTH);		IntCpy(PB,SK);		IntCpy(PA,Rvalue);		while(1) {			SetMode(PA,PB,PC,PK);			i=IntCmp(PC,ONEVALUE);			if(i==0)				break;			i=IntCmp(PC,ZEROVALUE);			if(i==0){				i=-1;				break;			}			IntCpy(PA,PB);			IntCpy(PB,PC);		}		if(i==0)			break;	}	IntCpy(temp,ONEVALUE);	IntCpy(PA,Rvalue);	IntCpy(PB,SK);	while (1){		Multiply(PA,temp,buf);		Plus(buf,ONEVALUE,buf2);		SetMode(buf2,PB,buf,PK);		if(IntCmp(buf,ZEROVALUE)==0)			break;		Plus(temp,ONEVALUE,buf);		IntCpy(temp,buf);	}	return 1;}void PackInt(byteint A,int B){	register i=DATALENGTH-1;	SetZero(A);	while(B>0){		A[i--]=B % 10;		B=B/10;	}}int StrToByt(char *str,byteint byt){	unsigned int m;		SetZero(byt);	for(m=0;m<strlen(str);m++)		byt[DATALENGTH-1-m]=str[strlen(str)-m-1]-'0';	return 1;}void BytToStr(byteint byt,char *str){ 	unsigned  int i=0,j=0; 	while(i<DATALENGTH&&byt[i]==0) i++; 	for(;i<DATALENGTH;i++,j++) 	{ 		str[j] =byt[i]+'0'; 	}}

⌨️ 快捷键说明

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