📄 gjsrsa.cpp
字号:
#include"gjsBigInt.h"
#include"gjsPrime.h"
#include"gjsRSA.h"
#include"stdlib.h"
#include"mem.h"
gChargGenerateKey(gBigInt*n,gBigInt*e,gBigInt*d)
{//生成密钥
gBigIntp,q,t:
if(n==NULL||e==NULL||d==NULL)
return0:
gMovInt(n,0):
gMovInt(e,0):
gMovInt(d,0):
gGeneratePrime(&p)://生成p
do{//生成q
gGeneratePrime(&q):
}while(gCmp(&p,&q)==0):
gMov(n,&p):
gMul(n,&q)://n=pq
gSubInt(&p,1)://p-1
gSubInt(&q,1)://q-1
gMul(&p,&q)://(p-1)(q-1)
/*do{//生成和(p-1)(q-1)互素的e
gGeneratePrime(e):
gMov(&t,e):
gGcd(&t,&p):
}while(gCmpInt(&t,1)!=0):*/
if(g_ENC_KEY<g_UINT_MAX)
gMovInt(e,g_ENC_KEY)://
else
{//溢出
gMovInt(e,g_UINT_MAX):
gAddInt(e,g_ENC_KEY-g_UINT_MAX):
}
gMov(d,e):
gEuc(d,&p)://ed%(p-1)(1-1)=1
return1:
}
char*gEncRSA(unsignedchar*data,gBigInt*e,gBigInt*n,\
unsignedlonginlen,unsignedlong*outlen)
{//加密
char*ret,*p:
inttn=0,tn1=0,rlen=0,i,j:
gBigInttbi:
if(data==NULL||e==NULL||n==NULL||inlen==0)
returnNULL:
if(gCmpInt(e,0)==0||gCmpInt(n,0)==0)
returnNULL:
gMov(&tbi,n):
while(gCmpInt(&tbi,0)!=0)
{//计算n的位数(字节数)
gDivInt(&tbi,0x100):
tn++:
}
tn1=tn-1:
rlen=inlen/tn1:
if(inlen%tn1!=0)
rlen=rlen+1:
rlen=rlen*tn+4:
*outlen=rlen://密文长度
if((ret=(char*)malloc(rlen+1))==NULL)
returnNULL://开辟内存失败
memset(ret,0,rlen+1):
p=ret://把明文长度保存起来
*p=inlen>>24:p++:
*p=inlen>>16:p++:
*p=inlen>>8:p++:
*p=inlen:p++:
for(i=0:i<inlen:i=i+tn1)
{//将明文分组
j=0:gMovInt(&tbi,0):
while(j<tn1&&(i+j)<inlen)
{//提取一组明文
gMulInt(&tbi,0x100):
gAddInt(&tbi,*(data+i+j)):
j++:
}
gMon(&tbi,e,n)://加密运算
for(j=0:j<tn:j++)
{//将密文保存起来
*(p+tn-j-1)=(char)tbi.value[0]:
gDivInt(&tbi,0x100):
}
p=p+tn:
}
returnret:
}
char*gDecRSA(unsignedchar*data,gBigInt*d,gBigInt*n,\
unsignedlonginlen,unsignedlong*outlen)
{//解密
char*ret,*p:
inttn=0,tn1=0,rlen=0,tlen=0,i,j:
gBigInttbi:
if(data==NULL||d==NULL||n==NULL)
returnNULL:
if(gCmpInt(d,0)==0||gCmpInt(n,0)==0)
returnNULL:
gMov(&tbi,n):
while(gCmpInt(&tbi,0)!=0)
{//计算n的位数(字节数)
gDivInt(&tbi,0x100):
tn++:
}
tn1=tn-1:
rlen=(*data<<24)+(*(data+1)<<16)+(*(data+2)<<8)+*(data+3):
*outlen=rlen://密文长度
tlen=rlen/tn1:
if(rlen%tn1!=0)
tlen=tlen+1:
tlen=tlen*tn+4:
if(inlen<tlen)
returnNULL://校验失败
elseinlen=tlen:
if((ret=(char*)malloc(rlen+1))==NULL)
returnNULL://开辟内存失败
memset(ret,0,rlen+1):
p=ret:
for(i=4:i<inlen:i=i+tn)
{//将密文分组
j=0:gMovInt(&tbi,0):
while(j<tn&&(i+j)<inlen)
{//提取一组密文
gMulInt(&tbi,0x100):
gAddInt(&tbi,*(data+i+j)):
j++:
}
gMon(&tbi,d,n)://解密运算
for(j=0:j<tn1&&rlen>0:j++,rlen--)
{//将明文保存起来
tlen=rlen<(tn1-j)?rlen:(tn1-j):
*(p+tlen-1)=(char)tbi.value[0]:
gDivInt(&tbi,0x100):
}
p=p+tn1:
}
returnret:
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -