⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa.c

📁 网络中交换节点的上数据的交换和下行数据分发的硬件实现
💻 C
📖 第 1 页 / 共 2 页
字号:
   {
      *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 + -