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 + -
显示快捷键?