📄 yudfgrsa.c
字号:
#include "head.h"
//#define SWAB32(X) ((((X)&0xff000000)>>24)|(((X)&0x00ff0000)>>8)|(((X)&0x0000ff00)<<8)|(((X)&0x000000ff)<<24))
/*本函数用于使用输入的RSA公钥加、解密数据*/
int rsapub_inputkey_ende()
{
extern void ER65537(),memcopy(),poke(),NN_Assign2Exp(),NN_ModMult();
extern int peek();
extern NN_DIGIT m2mp();
unsigned int dst;
int i,digits,N,status;
BIG R;
ENCODEBLOCK RSA_key_e;
N=peek(0x80008804,2); /*读出数据组数N*/
if(N>=1&&N<=32)
{
status=0x0;
}
else
{
poke(0x80008800,0x3D,2);
status=0x3D;
goto label1;
} /*若N不符合要求,则停止执行,返回相关状态码*/
memcopy(0x80008808,RSA_key_e.pq,32,2); /*准备RSA公钥模数N*/
/* dst=0x80008808;
for(i=0;i<32;i++)
{
*(unsigned volatile int *)dst=SWAB32(*(unsigned volatile int *)dst);
dst=dst+4;
}*/
RSA_key_e.Ke[0]=65537; /*准备RSA公钥Ke*/
digits=(1024+NN_DIGIT_BITS-1)/NN_DIGIT_BITS;
NN_Assign2Exp (R, digits*(NN_DIGIT_BITS/2), digits);
NN_ModMult (RSA_key_e.Rmodm, R, R, RSA_key_e.pq, digits);
RSA_key_e.mp=m2mp(RSA_key_e.pq);
RSA_key_e.bits=1024; /*为公钥加、解密准备的辅助数据*/
for(i=0;i<N;i++)
{
ER65537((unsigned int *)(0x80008804+i*128),&RSA_key_e, \
(unsigned int *)(0x80008888+i*128)); /*公钥加、解密*/
}
poke(0x80008800,0x0,2);
label1: return status;
}
/*本函数用于使用卡内的私钥加解密数据*/
int rsapri_ende()
{
extern void memcopy(),poke(),DR(),NN_Assign(),NN_Mult();
extern int peek();
int i,N,status,digits;
BIG p_1,q_1;
DECODEBLOCK RSA_key_d;
/* if(peek(0x8000BFFC,1)==0)
{
poke(0x80008800,0xa,2);
status=0xa;
goto label2; /*若权限不允许,则停止执行,返回相关状态*/
// }
/* if(peek(0x01440000,2)==0xFFFFFFFF)
{
poke(0x80008800,0x44,2);
status=0x44;
goto label2; /*若加密卡内没有RSA公钥,则停止执行,上传相关状态码*/
// }
// */
N=peek(0x80008804,2); /*读出数据组数N*/
if(N>=1&&N<=32)
{
status=0x0;
}
else
{
poke(0x80008800,0x3D,2);
status=0x3D;
goto label2;
} /*若N不符合要求,则停止执行,返回相关状态码*/
memcopy(0x8000C40C,RSA_key_d.p,16,2); /*读出本卡的私钥p*/
memcopy(0x8000C48C,RSA_key_d.q,16,2); /*读出本卡的私钥q*/
memcopy(0x8000C50C,RSA_key_d.dModp_1,32,2); /*读出本卡的私钥dModp_1*/
memcopy(0x8000C58C,RSA_key_d.dModq_1,32,2); /*读出本卡的私钥dModq_1*/
memcopy(0x8000C60c,RSA_key_d.qInv,32,2); /*读出本卡的私钥qInv*/
digits=(1024/2+NN_DIGIT_BITS_1)/NN_DIGIT_BITS;
NN_Assign(p_1,RSA_key_d.p,digits);p_1[0]&=(~1);
NN_Assign(q_1,RSA_key_d.q,digits);q_1[0]&=(~1);
NN_Mult(RSA_key_d.p1q1,p_1,q_1,digits); /*计算(p-1)*(q-1) */
RSA_key_d.bits=1024; /*RSA私钥生成完毕*/
for(i=0;i<N;i++)
{
DR((unsigned int *)(0x80008804+i*128),&RSA_key_d, \
(unsigned int *)(0x80008808+i*128)); /*私钥加、解密*/
}
poke(0x80008800,0x0,2);
label2: return status;
}
/*本函数用于使用输入的私钥解密数据*/
int rsapri_inputkey_ende()
{
extern void memcopy(),poke(),DR(),NN_Assign(),NN_Mult();
extern int peek();
int i,N,status,digits;
BIG p_1,q_1;
DECODEBLOCK RSA_key_d;
unsigned int dst;
/*读出数据组数N*/
/*若N不符合要求,则停止执行,返回相关状态码*/
memcopy(0x80008808,RSA_key_d.p,16,2);
memcopy(0x80008848,RSA_key_d.q,16,2);
memcopy(0x80008888,RSA_key_d.dModp_1,16,2);
memcopy(0x800088C8,RSA_key_d.dModq_1,16,2);
memcopy(0x80008908,RSA_key_d.qInv,16,2);
/* dst=0x80008808;
for(i=0;i<16*5;i++)
{
*(unsigned volatile int *)dst=SWAB32(*(unsigned volatile int *)dst);
dst=dst+4;
}*/
digits=(1024/2+NN_DIGIT_BITS_1)/NN_DIGIT_BITS;
NN_Assign(p_1,RSA_key_d.p,digits);p_1[0]&=(~1);
NN_Assign(q_1,RSA_key_d.q,digits);q_1[0]&=(~1);
NN_Mult(RSA_key_d.p1q1,p_1,q_1,digits); /*计算(p-1)*(q-1) */
RSA_key_d.bits=1024; /*RSA私钥生成完毕*/
DR((unsigned int *)(0x80008804),&RSA_key_d, \
(unsigned int *)(0x80008948)); /*私钥加、解密*/
poke(0x80008800,0x0,2);
label3: return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -