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

📄 des1.c

📁 基于msp430优化的3des算法
💻 C
字号:
#include <msp430x13x.h>          // Standard Equations
#include  "des1.h"


/****************其它相关函数********************************************/
void IP_zhihuan(void);			//IP置换函数
void IP_1_zhihuan(void);		//IP_1置换函数
void C_D_jicun(void);			//C寄存器置换函数
void Key_zhihuan(void);			//KEYi置换函数
void S_Box_zhihuan(void);		//S盒置换函数
void des1(unsigned char Key[8],unsigned char Data[8], unsigned char Mode);
/*****************************************************************/
void des1(unsigned char Key[8],unsigned char Data[8], unsigned char Mode)
{
	unsigned char i;	
	getsptr();                    	// Get the current stack pointer - 2
	sptr-=1;
	for(i=0;i<8;i++)KEY[i]=Key[i];
	for(i=0;i<8;i++)ls1[i]=Data[i];
 	IP_zhihuan();     				//置换到ls2内,并分拆成L,R 2个寄存器数据
	C_D_jicun();      				//将KEY分拆后产生C,D寄存器
	for (i=0;i<16;i++)
	{
		lun = 15 - i;       	//解密,则从16开始
		if (Mode==1) lun=i;
		E_kuozh();      		//将R寄存器数据进行E扩张>ls2
		Key_zhihuan();
		S_Box_zhihuan();    	//S盒置换,同时完成运算及替换
	}
              
	IP_1_zhihuan();
	for(i=0;i<8;i++)Data[i]=ls1[i];
}
/***********************************************************************/
/* initsystem   系统初始化子程序*/
/***********************************************************************/
void IP_zhihuan(void)           //完成IP置换,同时产生L,R寄存器数据
{
    byte i,j,k,l;
    for ( i = 0; i<8; i++)
    {
        ls2[i]=0;
    }
    for (i=0; i<8; i++)         //作为位指针
    {
		l=bittype[DesIP_A[i]];
		for( j=0; j<8; j++)     //字节指针
		{
        	k=7-j;
        	if ( TestBit(ls1[k],l )) SetBit( ls2[i],bittype[j] );
      	}
    }
    for ( i = 0; i<4; i++)
    {
        L_jicun[i]=ls2[i];          //产生L寄存器
        R_jicun[i]=ls2[i+4];        //产生R寄存器
    }
}//IP_zhihuan

void IP_1_zhihuan(void)             //将L,R寄存器合并后,进行IP_1的置换
{
    byte i,j,k,l;
    for ( i = 0; i<4; i++)
    {
        ls2[i+4] = L_jicun[i];      //合并L,R寄存器
        ls2[ i ] = R_jicun[i];      //到ls2,8个字节
    }
    for ( i = 0; i<8; i++)
    {
        ls1[i]=0;
    }
    for (i=0; i<8; i++)       //作为位指针
    {
      l=bittype[7-i];         //位指针
      for( j=0; j<8; j++)     //位指针序
      {
        k=DesIP_1_A[j];       //指向字节
        if ( TestBit(ls2[k],l )) SetBit( ls1[i],bittype[j] );
      }
     }
}                           //IP_1_zhihuan
void C_D_jicun(void)
{
    byte i,j,k,l;
    for ( i = 0; i<4; i++)
    {
        C_jicun[i]=0;
        D_jicun[i]=0;
    }
    for (i=0; i<4; i++)         //作为位指针
    {
      l=bittype[i];             //位指针
      for( j=0; j<8; j++)     //位指针序
      {
        k=7-j;                  //指向字节
        if ( TestBit(KEY[k],l )) SetBit( C_jicun[i],bittype[j] );
      }
    }
    ClrBit(C_jicun[3],0x0f);       //取前半字节,获得C寄存器数据
    for (i=0; i<4; i++)         //作为位指针
    {
      l=bittype[6-i];           //位指针
      for( j=0; j<8; j++)       //位指针序
      {
        k=7-j;                  //指向字节
        if ( TestBit(KEY[k],l )) SetBit( D_jicun[i],bittype[j] );
      }
    }
    ClrBit(D_jicun[3],0xf0);        //取前半字节,获得D寄存器数据
    D_jicun[3]<<=4;                 //将数据移到前半字节
}                                   //C_D_jicun

void Key_zhihuan(void)
{
    byte i,j,k,l,m;
    byte KEY_I[8]=
            {0,0,0,0,0,0,0,0
            };
    L_shift();              //移动处理,产生子密钥,移动后暂存ls1
    k = 0;
    for (i=0; i<8; i++)       //作为位指针
    {
      for( j=0; j<6; j++)     //位指针序
      {
        l = CDKey[k];
        m = l;
        HoldBit( m,0x7);       //保留末3位作为位指针
        HoldBit( l,0X38);       //取高三位作为字节指针           
        l >>=3;                 //获得高三位字节指针
        if ( TestBit(ls1[l],bittype[m] )) SetBit( KEY_I[i],bittype[j+2] );
        k +=1;                  //K计序增1
      }
    }
    for (i=0; i<8; i++)       //作为位指针
    {
        TogBit(ls2[i],KEY_I[i]);        //执行Ti异或Ki操作,结果保存ls2
    }
    
}
void S_Box_zhihuan(void)
{
    byte i,j,k,l,m;
    S_Box_A();
    k = 0;
    for ( i = 0; i<4; i++)
    {
        ls1[i]=0;
    }
    for (i=0; i<4; i++)       //作为字节指针
    {
      for( j=0; j<8; j++)     //位指针序
      {
        l = DesP[k];
        m = l;
        HoldBit( m,0x7);       //保留末3位作为位指针
        HoldBit( l,0X38);       //取高三位作为字节指针           
        l >>=3;                 //获得高三位字节指针
        if ( TestBit(ls2[l],bittype[m] )) SetBit( ls1[i],bittype[j] );
        k +=1;                  //K计序增1
      }
     }//完成P置换
    for (i=0; i<4; i++)       //作为字节指针
    {
        TogBit(ls1[i],L_jicun[i]);      //得到新的Ri=Li-1//f
        L_jicun[i] = R_jicun[i];        //Li=Ri-1
        R_jicun[i] = ls1[i];
    }//获得Ri数据
     

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -