《匠人手记》推荐网上购书渠道:
  互动出版网(china-pub)   >>>
  当当网(dangdang)   >>>
  卓越亚马逊网    >>>
  淘宝网(taobao)   >>>
  更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

DES算法的介绍和实现(下)
程序匠人 发表于 2005-9-12 21:49:00  阅读全文 | 回复(1) | 引用通告 | 编辑

DES算法的介绍和实现(下)
DES算法的介绍和实现(下)
作者:西安 吴真 

INT32 handle_data(ULONG32 *left , ULONG8 choice)
{
       INT32  number = 0 ,j = 0;   
       ULONG32 *right = &left[1] ;
       ULONG32 tmp = 0;       
       ULONG32 tmpbuf[2] = { 0 };             

       /*第一次调整wz_pc1[64]*/
       for ( j = 0 ; j < 64 ; j++)
       {
              if (j < 32 ) 
              {
                     if ( wz_pc1[j] > 32)/*属于right*/
                     {
                            if ( *right&wz_pc2[wz_pc1[j]-1] )
                            {
                                   tmpbuf[0] |= wz_pc2[j] ;
                            }
                     }
                     else
                     {
                            if ( *left&wz_pc2[wz_pc1[j]-1] )
                            {
                                   tmpbuf[0] |= wz_pc2[j] ;
                            }
                     }
              }
              else
              {
                     if ( wz_pc1[j] > 32)/*属于right*/
                     {
                            if ( *right&wz_pc2[wz_pc1[j]-1] )
                            {
                                   tmpbuf[1] |= wz_pc2[j] ;
                            }
                     }
                     else
                     {
                            if ( *left&wz_pc2[wz_pc1[j]-1] )
                            {
                                   tmpbuf[1] |= wz_pc2[j] ;
                            }
                     }
              }
       }
       *left  = tmpbuf[0] ;
       *right = tmpbuf[1];
       tmpbuf[0] = 0 ;
       tmpbuf[1] = 0 ;
    switch( choice )
       {
       case DESENCRY:
              for ( number = 0 ; number < 16 ; number++)
              {            
                     makedata( left , right , (ULONG32)number) ;
              }
              break;
       case DESDECRY:
                     for ( number = 15 ; number >= 0 ; number--)
                     {            
                            makedata( left , right ,(ULONG32)number) ;
                     }
              break;
       default:
              break;
       }

       /*最后一轮操作不交换左右值*/

       tmp = *left ;
       *left = *right ;
       *right = tmp ;        

       /*最后一次调整wz_pc4[64]*/

       for ( j = 0 ; j < 64 ; j++)
       {
              if (j < 32 ) 
              {
                     if ( wz_pc4[j] > 32)/*属于right*/
                     {
                            if ( *right&wz_pc2[wz_pc4[j]-1] )
                            {
                                   tmpbuf[0] |= wz_pc2[j] ;
                            }
                     }
                     else
                     {
                            if ( *left&wz_pc2[wz_pc4[j]-1] )
                            {
                                   tmpbuf[0] |= wz_pc2[j] ;
                            }
                     }
              }
              else
              {
                     if ( wz_pc4[j] > 32)/*属于right*/
                     {
                            if ( *right&wz_pc2[wz_pc4[j]-1] )
                            {
                                   tmpbuf[1] |= wz_pc2[j] ;
                            }
                     }
                     else
                     {
                            if ( *left&wz_pc2[wz_pc4[j]-1] )
                            {
                                   tmpbuf[1] |= wz_pc2[j] ;
                            }
                     }
              }
       }
  
       *left =  tmpbuf[0] ;
       *right = tmpbuf[1];

       return SUCCESS;
}


INT32 makedata(ULONG32  *left ,ULONG32  *right ,ULONG32 number) 
{
              INT32 j; 
              ULONG32 oldright = *right;         
              ULONG8 rexpbuf[8] = { 0} ;
              ULONG32 datatmp = 0;        
              ULONG32 exp[2] = { 0} ;                         
       //由32扩充至48位

       for ( j = 0 ; j < 48 ; j++)
       {
              /*两个32位,每个存放24位*/
              if ( j < 24 )
              {
                     if ( *right&wz_pc2[exptab3[j]-1] )
                     {
                            exp[0] |= wz_pc2[j] ;
                     }            
              }            
              else
              {
                     if ( *right&wz_pc2[exptab3[j]-1] )
                     {
                            exp[1] |= wz_pc2[j-24] ;
                     }
              }
       }

       for ( j = 0 ; j < 2 ; j++)
       {            
              exp[j] ^= g_outkey[number][j] ;
       }    

       /*由48->32*/      

       exp[1] >>= 8 ;
       rexpbuf[7] = (ULONG8) (exp[1]&0x0000003fL) ;
       exp[1] >>= 6 ;
       rexpbuf[6] = (ULONG8) (exp[1]&0x0000003fL) ;
       exp[1] >>= 6 ;
       rexpbuf[5] = (ULONG8) (exp[1]&0x0000003fL) ;
       exp[1] >>= 6 ;
       rexpbuf[4] = (ULONG8) (exp[1]&0x0000003fL) ;
       exp[0]  >>=  8 ;
       rexpbuf[3] = (ULONG8) (exp[0]&0x0000003fL) ;     
       exp[0] >>= 6 ;
       rexpbuf[2] = (ULONG8) (exp[0]&0x0000003fL) ;
       exp[0] >>= 6 ;
       rexpbuf[1] = (ULONG8) (exp[0]&0x0000003fL) ;
       exp[0] >>= 6 ;
       rexpbuf[0] = (ULONG8) (exp[0]&0x0000003fL) ;     
       exp[0] = 0 ;
       exp[1] = 0 ;

       /*由48-> 32*/

       *right = 0 ;
       for ( j = 0 ; j < 7 ; j++)
       {
              *right |= SP[j][rexpbuf[j]] ;
              *right <<= 4 ;
       }
       *right |= SP[j][rexpbuf[j]] ;

       /*又要换位了*/

       datatmp = 0;
       for ( j = 0 ; j < 32 ; j++)
       {
              if ( *right&wz_pc2[wz_pc3[j]-1] )
              {
                     datatmp |= wz_pc2[j] ;
              }
       }
       *right = datatmp ;

       /*一轮结束收尾操作*/                

       *right ^= *left;       
       *left = oldright;

       return SUCCESS;
}

INT32 makefirstkey( ULONG32 *keyP )
{
       ULONG32 key[2] = {0};
       ULONG32 *Pkey ;
       ULONG32 *Pbufkey ;
       INT32 j; 
       Pbufkey = (ULONG32*)g_bufkey ;
       Pkey = (ULONG32*)key;
              
       memset((ULONG8*)g_bufkey,0,sizeof(g_bufkey));    
       memcpy((ULONG8*)&key,(ULONG8*)keyP ,8) ;      
       memset((ULONG8*)g_outkey,0,sizeof(g_outkey));
       for(  j = 0 ; j < 28 ; j++)
       {
              if ( wz_keyleft[j] > 32 ) 
              {
                     if ( Pkey[1]&wz_pc2[wz_keyleft][j]-1] )
                     {
                            Pbufkey[0] |= wz_pc2[j] ;
                     }
              }
              else
              {
                     if ( Pkey[0]&wz_pc2[wz_keyleft][j]-1] )
                     {
                            Pbufkey[0] |= wz_pc2[j] ;
                     }
              }
              
              if ( wz_keyright[j] > 32 ) 
              {
                     if ( Pkey[1]&wz_pc2[wz_keyright][j]-1] )
                     {
                            Pbufkey[1] |= wz_pc2[j];
                     }
              }
              else
              {
                     if ( Pkey[0]&wz_pc2[wz_keyright][j]-1] )
                     {
                            Pbufkey[1] |= wz_pc2[j];
                     }
              }
       }
       for (j = 0 ; j < 16 ; j++)
       {
              makekey(&Pbufkey[0],&Pbufkey[1] , j ) ;
       }
       return SUCCESS;
}


INT32 makekey(  ULONG32 *keyleft,ULONG32 *keyright ,ULONG32 number)/*输入密钥的地址,一个32位的*/
{
       ULONG32 tmpkey[2] ={0};
       ULONG32 *Ptmpkey = (ULONG32*)tmpkey;     
       ULONG32 *Poutkey = (ULONG32*)&g_outkey[number]; 
       INT32 j;        
       memset((ULONG8*)tmpkey,0,sizeof(tmpkey));          
              /*要最高的一位或两位*/
              *Ptmpkey = *keyleft&wz_leftandtab[wz_lefttable][number]] ;           
              Ptmpkey[1] = *keyright&wz_leftandtab[wz_lefttable][number]] ;              
              if ( wz_lefttable[number] == 1)
              {
                     *Ptmpkey >>= 27;
                     Ptmpkey[1] >>= 27;
              }
              else
              {
                     *Ptmpkey >>= 26;
                     Ptmpkey[1] >>= 26;                    
              }
              Ptmpkey[0] &= 0xfffffff0;
              Ptmpkey[1] &= 0xfffffff0;
              /*得到高位的值*/
              *keyleft <<= wz_lefttable[number] ;
              *keyright <<= wz_lefttable[number] ;
              *keyleft |= Ptmpkey[0] ;
              *keyright |= Ptmpkey[1] ;            
              Ptmpkey[0] = 0;
              Ptmpkey[1] = 0;
    
       /*从56位中选出48位,3个16位*/
       for ( j = 0 ; j < 48 ; j++)
       {
              if ( j < 24 )
              {
              
                            if ( *keyleft&wz_pc2[wz_keychoose][j]-1])
                            {
                                   Poutkey[0] |= wz_pc2[j] ;
                            }                   
              }            
              
              else /*j>=24*/
              {                   
                            if ( *keyright&wz_pc2[(wz_keychoose][j]-28)])
                            {
                                   Poutkey[1] | = wz_pc2[j-24] ;
                            }                   
              }
       }
       return SUCCESS;
}

代码在win2000/vc6.0环境下测试通过.

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:DES算法的介绍和实现(下)
小石(游客)发表评论于2006-7-20 21:42:00  个人主页 | 引用 | 返回 | 删除 | 回复

小石(游客)

算法写的很清楚,可是怎么能编译通过呢???

明显有语法错误

if ( Pkey[1]&wz_pc2[wz_keyleft][j]-1] )
                     {
                            Pbufkey[0] |= wz_pc2[j] ;
                     }

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    推荐阅读

    往日酷贴