📄 rsa.c
字号:
{
*point = C2.value[i];
point ++;
}
//send A
point = (unsigned volatile int *)0x2030300;
for(i=0;i<32;i++)
{
*point = A2.value[i];
point ++;
}
//send 指数长度寄存器a
point = (unsigned volatile int *)0x2030450;
*point = 15;
//start rsa
point = (unsigned volatile int *)0x2030410;
*point = 0x8000000D;
wait_rsa_ready1:
point = (unsigned volatile int *)0x2030420;
temp = *point & 0x04;
if( temp == 0x04)
{goto wait_rsa_ready1;}
//read M
point = (unsigned volatile int *)0x2030300;
for(i=0;i<16;i++)
{
M2.value[i] = *point ;
point ++;
}
for(i=0;i<16;i++)
{
poke(0x80008804+4*i,M1.value[i],2);
}
memcopy(0x80008804,mp,16,2);
for(i=0;i<16;i++)
{
poke(0x80008804+4*i,M2.value[i],2);
}
memcopy(0x80008804,mq,16,2);
for(i=0;i<digits;i++)mq[i+digits]=0;
if(NN_Cmp(mp,mq,digits)<0)
{
NN_Sub(t1,mq,mp,digits);
NN_Sub(mp,RSA_key_d.p,t1,digits);
}
else NN_Sub(mp,mp,mq,digits);
/* 计算((...)*qinv) mod p */
NN_Mult(m,mp,RSA_key_d.qInv,digits);
NN_Mod(mp,m,digits*2,RSA_key_d.p,digits);
/* 计算(...)*q+mq */
NN_Mult(m,mp,RSA_key_d.q,digits);
NN_Add(m,m,mq,digits*2);
memcopy(m,0x80008804,32,2);
poke(0x80008800,0x0,2);
return 0x00;
}
/*本函数用于使用输入的私钥解密数据*/
int rsapri_inputkey_ende()
{
extern void memcopy(),poke(),DR(),NN_Assign(),NN_Mult();
extern int peek();
DECODEBLOCK RSA_key_d;
unsigned volatile int *point;
BIG c,t1,t2,mp,mq,m;
MInt N1,A1,C1,M1,N2,A2,C2,M2,E1,E2;
unsigned volatile int p0,q0,N01,temp,N02,digits;
int i;
N1.length=16;
A1.length=16;
C1.length=16;
M1.length=16;
E1.length=16;
N2.length=16;
A2.length=16;
C2.length=16;
M2.length=16;
E2.length=16;
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);
memcopy(0x80008948,c,32,2);
for(i=0;i<16;i++)
{
N1.value[i] = peek(0x80008808+4*i,2);
N2.value[i] = peek(0x80008848+4*i,2);
E1.value[i] = peek(0x80008888+4*i,2);
E2.value[i] = peek(0x800088C8+4*i,2);
}
digits=(1024/2+NN_DIGIT_BITS-1)/NN_DIGIT_BITS;
/* c mod p */
NN_Mod(t1,c,digits*2,RSA_key_d.p,digits);
memcopy(t1,0x80008804,16,2);
for(i=0;i<16;i++)
{
C1.value[i] = peek(0x80008804+4*i,2);
}
/* c mod q */
NN_Mod(t2,c,digits*2,RSA_key_d.q,digits);
memcopy(t2,0x80008804,16,2);
for(i=0;i<16;i++)
{
C2.value[i] = peek(0x80008804+4*i,2);
}
Generate_A_N0(&N1,&A1,&N01);
ResetRSA();
//set rsa mode = 512
point = (unsigned volatile int *)0x2030410;
*point = 0x8000000C;
//send N0
point = (unsigned volatile int *)0x2030430;
*point = N01;
//send N
point = (unsigned volatile int *)0x2030000;
for(i=0;i<16;i++)
{
*point = N1.value[i];
delay();
point++;
}
//send E
point = (unsigned volatile int *)0x2030100;
for(i=0;i<16;i++)
{
*point = E1.value[i];
delay();
point++;
}
//send C
point = (unsigned volatile int *)0x2030200;
for(i=0;i<16;i++)
{
*point = C1.value[i];
point ++;
}
//send A
point = (unsigned volatile int *)0x2030300;
for(i=0;i<32;i++)
{
*point = A1.value[i];
point ++;
}
//send 指数长度寄存器a
point = (unsigned volatile int *)0x2030450;
*point = 15;
//start rsa
point = (unsigned volatile int *)0x2030410;
*point = 0x8000000D;
wait_rsa_ready:
point = (unsigned volatile int *)0x2030420;
temp = *point & 0x04;
if( temp == 0x04)
{goto wait_rsa_ready;}
//read M
point = (unsigned volatile int *)0x2030300;
for(i=0;i<16;i++)
{
M1.value[i] = *point ;
point ++;
}
Generate_A_N0(&N2,&A2,&N02);
ResetRSA();
//set rsa mode = 512
point = (unsigned volatile int *)0x2030410;
*point = 0x8000000C;
//send N0
point = (unsigned volatile int *)0x2030430;
*point = N02;
//send N
point = (unsigned volatile int *)0x2030000;
for(i=0;i<16;i++)
{
*point = N2.value[i];
delay();
point++;
}
//send E
point = (unsigned volatile int *)0x2030100;
for(i=0;i<16;i++)
{
*point = E2.value[i];
delay();
point++;
}
//send C
point = (unsigned volatile int *)0x2030200;
for(i=0;i<16;i++)
{
*point = C2.value[i];
point ++;
}
//send A
point = (unsigned volatile int *)0x2030300;
for(i=0;i<32;i++)
{
*point = A2.value[i];
point ++;
}
//send 指数长度寄存器a
point = (unsigned volatile int *)0x2030450;
*point = 15;
//start rsa
point = (unsigned volatile int *)0x2030410;
*point = 0x8000000D;
wait_rsa_ready1:
point = (unsigned volatile int *)0x2030420;
temp = *point & 0x04;
if( temp == 0x04)
{goto wait_rsa_ready1;}
//read M
point = (unsigned volatile int *)0x2030300;
for(i=0;i<16;i++)
{
M2.value[i] = *point ;
point ++;
}
for(i=0;i<16;i++)
{
poke(0x80008804+4*i,M1.value[i],2);
}
memcopy(0x80008804,mp,16,2);
for(i=0;i<16;i++)
{
poke(0x80008804+4*i,M2.value[i],2);
}
memcopy(0x80008804,mq,16,2);
for(i=0;i<digits;i++)mq[i+digits]=0;
/*计算mp-mq ,注意 p>q,所以可以有下列的写法 */
if(NN_Cmp(mp,mq,digits)<0)
{
NN_Sub(t1,mq,mp,digits);
NN_Sub(mp,RSA_key_d.p,t1,digits);
}
else NN_Sub(mp,mp,mq,digits);
/* 计算((...)*qinv) mod p */
NN_Mult(m,mp,RSA_key_d.qInv,digits);
NN_Mod(mp,m,digits*2,RSA_key_d.p,digits);
/* 计算(...)*q+mq */
NN_Mult(m,mp,RSA_key_d.q,digits);
NN_Add(m,m,mq,digits*2);
memcopy(m,0x80008804,32,2);
poke(0x80008800,0x0,2);
return 0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -