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

📄 yudfgrsa.c

📁 网络中交换节点的上数据的交换和下行数据分发的硬件实现
💻 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 + -