rsa.c

来自「1.   首先要把文件夹中的rsa.c文件拷贝到运行工具(如TURBOC2)下」· C语言 代码 · 共 599 行

C
599
字号
#include"mem.h"
#include"dos.h"
#include"conio.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"math.h"
#include"time.h"
#define DATALENGTH 100
#define MLENGTH 4
#define TESTNUM 20
#define SKLENGTH 4
#define TEXTLENGTH 20

FILE *RSASKkey;
FILE *RSAPKkey;
FILE *RSARkey;

typedef signed char byteint[DATALENGTH];
typedef signed char mtype[MLENGTH] ;
unsigned char key[DATALENGTH];
mtype Model[TESTNUM];

byteint ONEVALUE,ZEROVALUE,TWOVALUE,EIGHTVALUE;
char plaintext[10];
byteint cipertext[64];
byteint plaindata[64];

int change(byteint Temp);
int xk(int m); 
void InitInt(void);
void SetZero(byteint A);
void IntCpy(byteint A,byteint B);
int IntValid(byteint validtemp);

int Getinput1(byteint result,unsigned long input);
int Getinput(byteint result,char *input);
int PrtInt(byteint Temp);
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 GetPlaintext(void);
void PackInt(byteint A,int B);

 
/*----------------------------------------------------------------------------
功能:进行相关大数的初始化
入口参数:无
返回值:无
----------------------------------------------------------------------------*/	  
void InitInt(void)
{
 SetZero(ZEROVALUE);
 SetZero(ONEVALUE);
 ONEVALUE[DATALENGTH-1]=1;
 SetZero(TWOVALUE);
 TWOVALUE[DATALENGTH-1]=2;
 SetZero(EIGHTVALUE);
 EIGHTVALUE[DATALENGTH-1]=8;
 return;
}

/*---------------------------------------------------------------------------
功能:将一个大数A转换为相应的字符串形式
入口参数:大数A
返回值:相对应的字符串
----------------------------------------------------------------------------*/
int PrtInt(byteint Temp)
{
 register i=0;
 int m,n;
 while(i<DATALENGTH&&Temp[i]==0)
      i++;
 if(i<DATALENGTH)
      m=DATALENGTH-i;
 n=0;
 while(i<DATALENGTH)
 {
   printf("%1d",Temp[i++]);
    n++;
    if(n>65)
     {
       printf("\n  ");
        n=0;
          }
       }
  return m;
}

/*---------------------------------------------------------------------------
功能:大数A与大数B相乘,结果放入C中 A×B->C
入口参数:被乘数A和乘数B,结果C
返回值:无
----------------------------------------------------------------------------*/
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&&Bvalid<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;
    }
    return;
}


/*---------------------------------------------------------------------------
功能:将指定的自定义的大数进行0初始化
入口参数:大数A名
返回值:无
----------------------------------------------------------------------------*/
void SetZero(byteint A)
{
 memset(A,0,DATALENGTH);
}


void IntCpy(byteint A,byteint B)
{
 memcpy(A,B,DATALENGTH);
}


/*---------------------------------------------------------------------------
功能:A+B的结果送C
入口参数:大数A,B,C
返回值:无
----------------------------------------------------------------------------*/
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;
 }
}


/*---------------------------------------------------------------------------
功能:大数SA减去大数SB,结果放入SC
入口参数:被减数SA,减数SB,差SC
返回值:无
----------------------------------------------------------------------------*/
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]=buf[j]-1;
     }
    }
  X=buf[i]-SB[i];
  SC[i]=X;
 }
}


/*---------------------------------------------------------------------------
功能:比较两个大数A和B的大小
入口参数:大数A和大数B
返回值:A>B:return 1 ; A=B:return 0 ; A<B:return -1
----------------------------------------------------------------------------*/
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;
}


/*---------------------------------------------------------------------------
功能:得到一个大数的非零位数
入口参数:大数validtemp
返回值:大数中非零的位数
----------------------------------------------------------------------------*/
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);SetZero(buf1);SetZero(buf2);
 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]++;
    }
}

/*---------------------------------------------------------------------------
功能:随机地产生一个大数奇数,长度为num,最高位不是0,存放在RandomA中
入口参数:大数A,长度num
返回值:无
----------------------------------------------------------------------------*/
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;
}


/*---------------------------------------------------------------------------
功能:将质数类型B拷贝到A中,实现类型转换
入口参数:大数A,质数类型B
返回值:无
----------------------------------------------------------------------------*/
void LoadInt(byteint A,mtype B)
{
 register i,j;
 SetZero(A);
 i=DATALENGTH-1;
 j=MLENGTH-1;
 while(j>=0)
   {
     A[i--]=B[j--];
     }
}


/*---------------------------------------------------------------------------
功能:该函数用来从集合[1,b-1]中产生若干个用于检测的数,存放在Model[]中
入口参数:无
返回值:无
----------------------------------------------------------------------------*/
void Mdata(void)
{
 register i,j;
 int k=MLENGTH-2;
 memset(Model,0,TESTNUM*MLENGTH);
 srand((unsigned)time(NULL));
 for(i=0;i<TESTNUM;i++)
 {
   for(j=MLENGTH-1;j>=k;j--)
      {
        Model[i][j]=rand()%10;
       }
    if((memcmp(Model[i],ZEROVALUE,MLENGTH))==0)
			i--;
       k--;
       if(k<0)
       k=MLENGTH-2;
      
 } 

}


/*---------------------------------------------------------------------------
功能:该函数用来将十进制的大整数转换成二进制的数
入口参数:需转换的大数B,二进制结果flag[400]
返回值:无
----------------------------------------------------------------------------*/
void TransBi(byteint B,signed char flag[400])
{
 byteint buf;
 byteint result;
 byteint temp;
 register i;
 SetZero(buf);SetZero(result);SetZero(temp);
 memset(flag,0,400);
 
 i=399;
 IntCpy(buf,B);
 while(IntCmp(buf,ZEROVALUE)==1)
 {
      SetMode(buf,TWOVALUE,temp,result);
      flag[i]=temp[DATALENGTH-1];
      IntCpy(buf,result);
      i--; 
   }
  flag[i]=-1;
}


/*---------------------------------------------------------------------------
功能:该函数用来进行模幂算法,A为底数,模为c,二进制的指数B存放在数组flag中
入口参数:底数A,模C,结果D,二进制质数flag[400]
返回值:A^B=1(mod C),返回1;A^B=p-1(mod C),返回2;否则返回0
----------------------------------------------------------------------------*/
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){
      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;
}


/*---------------------------------------------------------------------------
功能:产生一个质数
入口参数:大数Prm
返回值:产生成功,返回0
----------------------------------------------------------------------------*/
int Prime(byteint Prm)
{
 int i,k,ok,cnt=0;
 char flag[400];
 byteint A,B,D,buf1,buf2;
 SetZero(A); SetZero(B); SetZero(D); SetZero(buf1); SetZero(buf2);
 while(1)
 {
   int pass=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)
     {
      ok=0;
      break;
      }
    if(k==1)
     {
       printf("\npass the %dth test---1",pass++);
       }
    if(k==2)
    {
      printf("\npass the %dth test---2",pass++);   
    } 
   }
   if(ok)
    { 
     printf("\n prime found :");
     PrtInt(Prm);
     return 0;
    }
  }
}


/*---------------------------------------------------------------------------
功能:计算公钥PK
入口参数:$(r)的值在Rvalue中,私钥SK,公钥PK
返回值:成功找到,返回1
----------------------------------------------------------------------------*/
int ComputingPK(byteint Rvalue,byteint SK,byteint PK)
{
 register i;
 byteint PA,PB,PC,buf1,temp,buf2;
 SetZero(PA); SetZero(PB); 
 SetZero(PC); SetZero(PK); 
 SetZero(buf1); SetZero(temp);
 SetZero(buf2);
 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,buf1);
  Plus(buf1,ONEVALUE,buf2);
  SetMode(buf2,PB,buf1,PK);
  if(IntCmp(buf1,ZEROVALUE)==0)
     break;
  Plus(temp,ONEVALUE,buf1);
  IntCpy(temp,buf1);
  }
  return 1;
 }

void PackInt(byteint A,int B)
{
 register i;
 SetZero(A);
 i=DATALENGTH-1;
 while(B>0)
 {
  A[i--]=B%10;
  B=B/10;
  }
 }

/*---------------------------------------------------------------------------
功能:将长整形的数转换为大数类型
入口参数:大数类型result,长整形input
返回值:成功,返回数的长度,否则返回0;
----------------------------------------------------------------------------*/
int Getinput1(byteint result,unsigned long input)
{
	int i=DATALENGTH-1,m=0;
	long j=0;
	int k=0;

	if(input)
	{
		do
		{
			j=input/10;
			k=input-j*10;
			result[i]=k;
			i--;
			m++;
			input=j;
		}while(j);
		return m;
	}
	else
		return 0;
}


/*---------------------------------------------------------------------------
功能:将大数类型转换为长整形的数
入口参数:大数类型result,长整形input
返回值:成功,返回数的长度,否则返回0;
----------------------------------------------------------------------------*/  
int change(byteint Temp)
{
 register i=0,j=0;
 int A[DATALENGTH];
 int c,k,m;
 unsigned long b[DATALENGTH];
 c=0;
 while(i<DATALENGTH&&Temp[i]==0)
      i++;
 if(i<DATALENGTH)
	 k=DATALENGTH-i;
 m=k-1;
 while(i<DATALENGTH)
 {    
   A[j]=Temp[i];
   i++;
   j++;   
     }
 for(i=0;i<k;i++)
  {
   b[i]=A[i]*(xk(m));
   m--;
    } 
 for(i=0;i<k;i++)
   c=c+b[i];
  printf("  ok   ");
return c;
}


int xk(int m)
{
 int x,i;
 x=1;
 for(i=0;i<m;i++)
  x=x*10;
 return x;
}

⌨️ 快捷键说明

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