📄 des1.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 + -