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

📄 des_test.c

📁 c语言写的des(430单片机) 用430单片机实现的DES加密系统
💻 C
字号:
/*----------------------------------------------*/
/*---------------- DES加密解密 ------------------*/
/*---------------- 2003-11-15 ------------------*/
/*---------- Design by WangQingshan ------------*/
//IAR 1.26A



#include <msp430x41x.h>
#include "desok.h"

void init_sys(void);

void init_sys(void)
{
 WDTCTL=WDTPW+WDTHOLD;		//stop WDT
 
 FLL_CTL0|=XCAP14PF;
}

/*--------------D-E-S-------------------------*/

//第一次换位选择
void PosChg1(uchar * Key)
{
 uchar j,TakeBit;
 uint BitPos,BytePos;
 int i;

 for(i=55;i>=0;i--)
 {
  BitPos=PC1[i]%8;                             //在字节中的位置
  BitPos=7-BitPos;
  BytePos=PC1[i];                              //所选择的位所在的字节
  BytePos/=8;
  TakeBit=Key[BytePos]&Position[BitPos];       //获取这一位
  for(j=0;j<BitPos;j++) TakeBit/=2;
                                //要放置到的字节
  if(i>27)
  {
   BytePos=i-28;
   BytePos/=8;
   BData[BytePos]*=2;
   BData[BytePos]|=TakeBit;
  }
  else
  {
   BytePos=i;
   BytePos/=8;
   AData[BytePos]*=2;
   AData[BytePos]|=TakeBit;
  }
 }
}

//第二次换位选择
void PosChg2(uchar * Cdata,uchar * Ddata,uchar Num)
{
 uchar j,TakeBit;
 uint BitPos,BytePos;
 int i;
 for(i=47;i>=0;i--)
 {
  BitPos=PC2[i]%8;
  BytePos=PC2[i];
  BytePos/=8;
  if(i>27)
   {
    BytePos-=4;
    TakeBit=Ddata[BytePos]&Position[BitPos];
   }
  else
   TakeBit=Cdata[BytePos]&Position[BitPos];
  for(j=0;j<BitPos;j++) TakeBit/=2;
  BytePos=i;
  BytePos/=8;
  SubKey[Num][BytePos]*=2;
  SubKey[Num][BytePos]|=TakeBit;
  //Subkey[BytePos]*=2;
  //Subkey[BytePos]|=TakeBit;
 }
}

//左移1位
//1 2 3 4 5 6 7 8   <--
void LeftShift(uchar * Sdata)
{
 uchar midchar1,midchar2;
 uchar i;
 midchar1=Sdata[0]&1;                       //最低位保存
 for(i=0;i<3;i++)
 {
  midchar2=Sdata[i+1]&1;
  Sdata[i]/=2;
  midchar2*=128;
  Sdata[i]|=midchar2;
 }
 Sdata[3]/=2;
 Sdata[i]|=midchar1*8;                      //最低位放到第28位 
}

//生成16个子密钥
void SubKeyG(uchar * KeyCode)                   //生成16个子密钥
{
 uchar i,j;
 PosChg1((uchar *)KeyCode);
 for(i=0;i<16;i++)
 {
  for(j=0;j<LShift[i];j++)
  { 
   LeftShift((uchar *)AData);
   LeftShift((uchar *)BData);
  }
  PosChg2((uchar *)AData,(uchar *)BData,i);
  //WriteI2c((6*i),(uchar *)SubKey,6);
 }
}

//位置变换
void IPChange(uchar * PlText, uchar * IPs)
{
 uchar j,TakeBit;
 uint BitPos,BytePos;
 int i;
 uchar IPText[8]={0};
 
 for(i=63;i>=0;i--)
 {
  BitPos=IPs[i]%8;
  BitPos=7-BitPos;
  BytePos=IPs[i];
  BytePos/=8;
  TakeBit=PlText[BytePos]&Position[BitPos];
  for(j=0;j<BitPos;j++) TakeBit/=2;
  BytePos=i;
  BytePos/=8;
  IPText[BytePos]*=2;
  IPText[BytePos]|=TakeBit;
 }
 
 for(i=0;i<8;i++)
  PlText[i]=IPText[i];
}

//32位到48位的扩展
void Ex32to48(uchar * In32,uchar * Out48)
{
 uchar j,TakeBit;
 uint BitPos,BytePos;
 int i;
 
 for(i=47;i>=0;i--)
 {
  BitPos=Exp[i]%8;
  BytePos=Exp[i];
  BytePos/=8;
  TakeBit=In32[BytePos]&Position[BitPos];
  for(j=0;j<BitPos;j++) TakeBit/=2;
  BytePos=i;
  BytePos/=8;
  Out48[BytePos]*=2;
  Out48[BytePos]|=TakeBit;
 }
}

//两个48位异或存入8字节
void Xor2Byte(uchar *in1,uchar *in2,uchar *out)
{
 for(i=0;i<6;i++)
   out[i]=in1[i]^in2[i];
}

void Ex6to8Byte(uchar *out)
{
 uint BitPos,BytePos;
 uchar TakeBit;
 uchar Cbyte=0;
 int i;
 
 for(i=47;i>=0;i--)
 {
  BitPos=i%8;
  BytePos=i/8;
  TakeBit=out[BytePos]&Position[BitPos];
  TakeBit/=Position[BitPos];
  Cbyte*=2;
  Cbyte|=TakeBit;
  if((i%6)==0)
  {
   BytePos=i/6;
   out[BytePos]=Cbyte;
   Cbyte=0;
  }
 }

}
//S盒运算函数
void SBox(uchar * In,uchar *Out)
{
 
 uint PosL,PosH;
 uchar Scode[2];
  
 for(i=0;i<8;i++)
 {
  if(In[i]&0x20) PosL=1;
  else PosL=0;
  if(In[i]&0x1) PosL+=2;              //S盒的行值

  if(In[i]&0x10) PosH=1;
  else PosH=0;
  if(In[i]&0x8) PosH+=2;
  if(In[i]&0x4) PosH+=4;
  if(In[i]&0x2) PosH+=8;              //S盒的列值

  PosL=PosL*16+PosH;
  Scode[i%2]=S[i][PosL];
  if((i%2)==1)
  {
   Scode[1]*=16;
   Out[i/2]=Scode[0]|Scode[1];
  }
 }
}

void S_PC(uchar * InByte)
{
 uint BitPos,BytePos;
 uchar MidCode;
 uchar spc[4];
 int i;
 
 for(i=0;i<4;i++)
 {
  spc[i]=InByte[i];
  InByte[i]=0;
 }
 for(i=31;i>=0;i--)
 {
  BitPos=SPc[i]%8;                       //所选择的位所在的字节
  BytePos=SPc[i];
  BytePos/=8;                            //在字节中的位置
  MidCode=spc[BytePos]&Position[BitPos];     //获取这一位
  MidCode/=Position[BitPos];
  BytePos=i;                                //在字节中的位置
  BytePos/=8;
  InByte[BytePos]*=2;
  InByte[BytePos]|=MidCode;
 }
}

void Des(uchar * Plant,uchar * Chipe)
{
 IPChange((uchar *)Plant,(uchar *)IP);                  //IP change
 
 for(i=0;i<4;i++)                     //to L0,R0
 {
  AData[i]=Plant[i];
  BData[i]=Plant[i+4];
 }
 
 for(DeiDaiLoop=0;DeiDaiLoop<16;DeiDaiLoop++)                    //16 times subkey encrypt
 {
  //ReadI2c((6*i),(uchar *)SubKey,6);
  Ex32to48((uchar *)BData,(uchar *)EX48bit);                //Rhalf 32bit to 48bit
  Xor2Byte((uchar *)EX48bit,(uchar *)SubKey[DeiDaiLoop],(uchar *)SBox48);   //XOR 48bit with 48bit subkey
  Ex6to8Byte((uchar *)SBox48);
  SBox((uchar *)SBox48,(uchar *)SBox32);                    //S-Box function
  S_PC((uchar *)SBox32);
  for(j=0;j<4;j++)
    SBox32[j]^=AData[j];
  for(j=0;j<4;j++)                         //L(i+1)=R(i)
   {
    AData[j]=BData[j];
    BData[j]=SBox32[j];
   }
 }
  for(i=0;i<4;i++)
 {
  Chipe[i]=AData[i];
  Chipe[i+4]=BData[i];
 }
 IPChange((uchar *)Chipe,(uchar *)ReIP);                  //IP(-1) change
}

void DeDes(uchar * Plant,uchar * Chipe)
{
 IPChange((uchar *)Plant,(uchar *)IP);                  //IP(-1) change

  for(i=0;i<4;i++)                     //to L0,R0
 {
  BData[i]=Plant[7-i];
  AData[i]=Plant[3-i];
 }
 
 for(DeiDaiLoop=15;DeiDaiLoop>=0;DeiDaiLoop--)                    //16 times subkey encrypt
 {
  //ReadI2c((6*i),(uchar *)SubKey,6);
  Ex32to48((uchar *)BData,(uchar *)EX48bit);                //Rhalf 32bit to 48bit
  Xor2Byte((uchar *)EX48bit,(uchar *)SubKey[DeiDaiLoop],(uchar *)SBox48);   //XOR 48bit with 48bit subkey
  Ex6to8Byte((uchar *)SBox48);
  SBox((uchar *)SBox48,(uchar *)SBox32);                    //S-Box function
  S_PC((uchar *)SBox32);
  for(j=0;j<4;j++)
    SBox32[j]^=AData[j];
  for(j=0;j<4;j++)                         //L(i+1)=R(i)
   {
    AData[j]=BData[j];
    BData[j]=SBox32[j];
   }
 }
  for(i=0;i<4;i++)
 {
  Chipe[7-i]=BData[i];
  Chipe[3-i]=AData[i];
 }
 IPChange((uchar *)Chipe,(uchar *)ReIP);                  //IP change
}

/*----------D-E-S---------------------*/

void main(void)
{
 init_sys();
 SubKeyG((uchar *)KeyText);
 Des((uchar *)PlantText,(uchar *)Chiper);
 DeDes((uchar *)Chiper,(uchar *)PlantText);
 LPM3;
 while(1)
  {
  nop;
  }
}
/*-------- END --------*/

⌨️ 快捷键说明

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