/*----------------------------------------------*/
/*---------------- 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 --------*/