📄 destest.c
字号:
l=2;
else
l=0;
if((Des_Temp[i]&0x04)!=0)
l++;
//Column
j=(Des_Temp[i]>>3)&0x0f;
//S Box out
//根据i,j从替代盒中找出相应的数,进行8*6到8*4的变换.
switch( i )
{ //将数据移到高四位
case 0: Des_Temp[0]=S_Box_0[l][j]<<4;break;//移位是将CODE中的低四位,变为高四位
case 1: Des_Temp[1]=S_Box_1[l][j]<<4;break;
case 2: Des_Temp[2]=S_Box_2[l][j]<<4;break;
case 3: Des_Temp[3]=S_Box_3[l][j]<<4;break;
case 4: Des_Temp[4]=S_Box_4[l][j]<<4;break;
case 5: Des_Temp[5]=S_Box_5[l][j]<<4;break;
case 6: Des_Temp[6]=S_Box_6[l][j]<<4;break;
case 7: Des_Temp[7]=S_Box_7[l][j]<<4;break;
}
}
//SETP 6 进行原文的左右边交换,即PlainText_Left<>PlainText_Right
for(i=0;i<8;i++) //Left swap Right
{
j=PlainText_Left[i];
PlainText_Left[i]=PlainText_Right[i];
PlainText_Right[i]=j;
}
//SETP 7 按换位函数P对替代盒中输出的数据 Des_Temp[0-7]数据进行一次置换
//将置换后所得的数据与现在的右边进或操作,作为新的右边的数据PlainText_Right[0-7].
for(i=0;i<8;i++)
{
l=0;
for(j=0;j<4;j++)
{
bit_point=Permutation_Function_P[i*4+j];
byte_point=bit_point/4;
bit_point=bit_point%4;
if((Des_Temp[byte_point]&des_bit_map[bit_point])!=0)
l=l|des_bit_map[j];
}
PlainText_Right[i]=PlainText_Right[i]^l;
}
}//end of for(Circle_Number=0;Circle_Number<16;Circle_Number++)
//完成16次的迭代
//SETP 8 对左右边两个8*4的数据再进行合并,形成一个8*8的新的数据
//完成后放在Des_Temp[0-7]当中
for(i=0,j=0;i<4;i++)
{
Des_Temp[i]=(PlainText_Right[j]&0xf0)+(PlainText_Right[j+1]>>4);
Des_Temp[i+4]=(PlainText_Left[j]&0xf0)+(PlainText_Left[j+1]>>4);
j=j+2;
}
//SETP 9 按逆初使置换表进行第二次的变换,变换后的数据为即为DES的输出密文
//完成后存入 PlainText[0-7].
for(i=0;i<8;i++)
{
PlainText[i]=0;
for(j=0;j<8;j++)
{
bit_point=Initial_Permutation_Reverse[i*8+j];
byte_point=bit_point/8;
bit_point=bit_point%8;
if((Des_Temp[byte_point]&des_bit_map[bit_point])!=0)
PlainText[i]=PlainText[i]|des_bit_map[j];
}
}
//密文返回,放在数组 *plain 当中
plain=plain-8;
for(i=0;i<8;i++)
*plain++=PlainText[i];
}
void Des_Decrypt(uchar *decrypt,uchar *key)
//入口: 密文放在 *decrypt N=8, 密钥放在 *key N=8
//出口: 返回明文在 *decrypt N=8.
{
uchar i,j,l,Circle_Number;
uchar byte_point,bit_point;
uchar DecryptText[8]; //密文
uchar SecretKey[8]; //密鈅
uchar DecryptText_Right[8],DecryptText_Left[8];//左右两个密文
uchar Des_Temp[8];
#define RollKey DecryptText //密文在完成左右变换以后,密文已不再使用.
for(i=0;i<8;i++)
{//保存数据
DecryptText[i]=*decrypt++;
SecretKey[i]=*key++;
}
//SETP 1 按逆初使换位表IP(-1)进行第一次的变换,变换后的数据为 Des_Temp[0-7]
for(i=0;i<8;i++)
{
Des_Temp[i]=0;
for(j=0;j<8;j++)
{
bit_point=Initial_Permutation[i*8+j];
byte_point=bit_point/8;
bit_point=bit_point%8;
if((DecryptText[byte_point]&des_bit_map[bit_point])!=0)
Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
}
}
//SETP 2
//将 Des_Temp[0-7]当中 8*8 的数据变换为左右两个 8*4 ,
//放在 DecryptText_Right[0-7] 与 DecryptText_Left [0-7]当中
for(i=0,j=0;i<8;i++) //8个四位二进制
{
DecryptText_Left[i]=Des_Temp[j];
i++;
DecryptText_Left[i]=Des_Temp[j]<<4;
j++;
}
for(i=0,j=4;i<8;i++)
{
DecryptText_Right[i]=Des_Temp[j];
i++;
DecryptText_Right[i]=Des_Temp[j]<<4;
j++;
}
//KEY-SETP 1 Initial key
//按换位选择表 1 对密钥进行变换,舍去BIT8的奇偶校验位.有效位为bit1-7
//完成后存于 Des_Temp[0-7] 当中,然后再回写入 SecretKey[0-7]当中
for(i=0;i<8;i++)
{
Des_Temp[i]=0;
for(j=0;j<7;j++)
{
bit_point=Key_Select_Permutation_1[i*7+j];
byte_point=bit_point/8;
bit_point=bit_point%8;
if((SecretKey[byte_point]&des_bit_map[bit_point])!=0)
Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
}
}
for(i=0;i<8;i++)
SecretKey[i]=Des_Temp[i];
//进行十六次的循环迭代
for(Circle_Number=0;Circle_Number<16;Circle_Number++)
{
//密钥在进行右循环移位时位的次数
if(Circle_Number==0)
l=0;
else if ((Circle_Number==1)||(Circle_Number==8)||(Circle_Number==15))
l=1;
else
l=2;
//KEY-SETP 2 对密钥时行右循环移位,最后存在 SecretKey[0-7]当中,总长只有7位
//在进行右循环移位时分为两组分别进行,即 SecretKey[0-3],SecretKey[4-7]
for(i=0;i<l;i++)
{
for(j=0;j<4;j++)
{
SecretKey[j]=SecretKey[j]>>1;
SecretKey[j+4]=SecretKey[j+4]>>1;
}
for(j=1;j<4;j++)
{
if((SecretKey[j-1]&0x01)!=0)
SecretKey[j]=SecretKey[j]|0x80;
else
SecretKey[j]=SecretKey[j]&0x7f;
if((SecretKey[j+3]&0x01)!=0)
SecretKey[j+4]=SecretKey[j+4]|0x80;
else
SecretKey[j+4]=SecretKey[j+4]&0x7f;
}
if((SecretKey[3]&0x01)!=0)
SecretKey[0]=SecretKey[0]|0x80;
else
SecretKey[0]=SecretKey[0]&0x7f;
if((SecretKey[7]&0x01)!=0)
SecretKey[4]=SecretKey[4]|0x80;
else
SecretKey[4]=SecretKey[4]&0x7f;
}
//KEY-SETP 3 按初使化置换表 2 对密钥进行变换,完成后存于 RollKey[0-7]当中
//其有效数位为 8*6
for(i=0;i<8;i++)
{
RollKey[i]=0;
for(j=0;j<6;j++)
{
bit_point=Key_Select_Permutation_2[i*6+j];
byte_point=bit_point/7;
bit_point=bit_point%7;
if((SecretKey[byte_point]&des_bit_map[bit_point])!=0)
RollKey[i]=RollKey[i]|des_bit_map[j];
}
}
//SETP 3 按扩充函数,对原文的右边 DecryptText_Right[0-7]的8*4数据进行扩充,
// 变为8*6放在 Des_Temp[0-7]当中
for(i=0;i<8;i++)
{
Des_Temp[i]=0;
for(j=0;j<6;j++)
{
bit_point=Extend_Function_E[i*6+j];
byte_point=bit_point/4;
bit_point=bit_point%4;
if((DecryptText_Right[byte_point]&des_bit_map[bit_point])!=0)
Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
}
}
//SETP 4 变换后的原文的右边 Des_Temp[0-7](8*6) 与活动密钥 RollKey[0-7] 进行位或操作
for(i=0;i<8;i++)
Des_Temp[i]=Des_Temp[i]^RollKey[i];
//SETP 5 使用替代盒将8*6的数据 Des_Temp[0-7] 还原成8*4,仍存于 Des_Temp[0-7]
//原数据为高6位,完成以后时高4位,替换盒中的两个维是[Bit8-3,Bit7-6-5-4]
for(i=0;i<8;i++)
{
//ROW
if((Des_Temp[i]&0x80)!=0)
l=2;
else
l=0;
if((Des_Temp[i]&0x04)!=0)
l++;
//Column
j=(Des_Temp[i]>>3)&0x0f;
//S Box out
//根据i,j从替代盒中找出相应的数,进行8*6到8*4的变换.
Des_Temp[i]=S_Box[i][l][j]<<4;;//移位是将CODE中的低四位,变为高四位
}
//SETP 6 进行原文的左右边交换,即PlainText_Left<>PlainText_Right
for(i=0;i<8;i++) //Left swap Right
{
j=DecryptText_Left[i];
DecryptText_Left[i]=DecryptText_Right[i];
DecryptText_Right[i]=j;
}
//SETP 7 按换位函数P对替代盒中输出的数据 Des_Temp[0-7]数据进行一次置换
//将置换后所得的数据与现在的右边进或操作,作为新的右边的数据PlainText_Right[0-7].
for(i=0;i<8;i++)
{
l=0;
for(j=0;j<4;j++)
{
bit_point=Permutation_Function_P[i*4+j];
byte_point=bit_point/4;
bit_point=bit_point%4;
if((Des_Temp[byte_point]&des_bit_map[bit_point])!=0)
l=l|des_bit_map[j];
}
DecryptText_Right[i]=DecryptText_Right[i]^l;
}
}//end of for(Circle_Number=0;Circle_Number<16;Circle_Number++)
//完成16次的迭代
//SETP 8 对左右边两个8*4的数据再进行合并,形成一个8*8的新的数据
//完成后放在Des_Temp[0-7]当中
for(i=0,j=0;i<4;i++)
{
Des_Temp[i]=(DecryptText_Right[j]&0xf0)+(DecryptText_Right[j+1]>>4);
Des_Temp[i+4]=(DecryptText_Left[j]&0xf0)+(DecryptText_Left[j+1]>>4);
j=j+2;
}
//SETP 9 按逆初使置换表进行第二次的变换,变换后的数据为即为DES的输出密文
//完成后存入 PlainText[0-7].
for(i=0;i<8;i++)
{
DecryptText[i]=0;
for(j=0;j<8;j++)
{
bit_point=Initial_Permutation_Reverse[i*8+j];
byte_point=bit_point/8;
bit_point=bit_point%8;
if((Des_Temp[byte_point]&des_bit_map[bit_point])!=0)
DecryptText[i]=DecryptText[i]|des_bit_map[j];
}
}
//密文返回,放在数组 *plain 当中
decrypt=decrypt-8;
for(i=0;i<8;i++)
*decrypt++=DecryptText[i];
}
#define Encrypt 0
#define Decrypt 1
void Des_Encrypt_Decrypt(uchar *Input,uchar *key,uchar mode)//DES算法
//入口: 明文放在 *Input N=8, 密钥放在 *key N=8
// Mode=1 解密 Mode=0加密
//出口: 返回密文在 *Input N=8.
{
uchar i,j,l,Circle_Number;
uchar byte_point,bit_point;
uchar InputText[8];//明文
uchar SecretKey[8];//密鈅
uchar InputText_Right[8],InputText_Left[8];//左右两个明文
uchar Des_Temp[8];
//#define Roll_key InputText //明文在完成左右变换以后,原文已不再使用
uchar Roll_key[8];
for(i=0;i<8;i++)
{//保存数据
InputText[i]=*Input++;
SecretKey[i]=*key++;
}
//SETP 1 按初使置换表进行第一次的变换,变换后的数据为 Des_Temp[0-7]
for(i=0;i<8;i++)
{
Des_Temp[i]=0;
for(j=0;j<8;j++)
{
bit_point=Initial_Permutation[i*8+j];
byte_point=bit_point/8;
bit_point=bit_point%8;
if((InputText[byte_point]&des_bit_map[bit_point])!=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -