📄 destest.c
字号:
Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
}
}
//SETP 2
//将 Des_Temp[0-7]当中 8*8 的数据变换为左右两个 8*4 ,
//放在 InputText_Right[0-7] 与 InputText_Left [0-7]当中
for(i=0,j=0;i<8;i++) //8个四位二进制
{
InputText_Left[i]=Des_Temp[j];
i++;
InputText_Left[i]=Des_Temp[j]<<4;
j++;
}
for(i=0,j=4;i<8;i++)
{
InputText_Right[i]=Des_Temp[j];
i++;
InputText_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(mode==Encrypt)
{ //加密过程
//密钥在进行左循环移位时位的次数
if ((Circle_Number==0)||(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++)
{
//前四个SecretKey[0-3]
if((SecretKey[0]&0x80)!=0)
SecretKey[3]=SecretKey[3]|0x1;
else
SecretKey[3]=SecretKey[3]&0xfe;
for(j=0;j<3;j++)
{
SecretKey[j]=SecretKey[j]<<1;
if((SecretKey[j+1]&0x80)!=0)
SecretKey[j]=SecretKey[j]|0x2;
else
SecretKey[j]=SecretKey[j]&0xfc;
}
SecretKey[3]=SecretKey[3]<<1;
//后四个SecretKey[4-7]
if((SecretKey[4]&0x80)!=0)
SecretKey[7]=SecretKey[7]|0x1;
else
SecretKey[7]=SecretKey[7]&0xfe;
for(j=4;j<7;j++)
{
SecretKey[j]=SecretKey[j]<<1;
if((SecretKey[j+1]&0x80)!=00)
SecretKey[j]=SecretKey[j]|0x2;
else
SecretKey[j]=SecretKey[j]&0xfc;
}
SecretKey[7]=SecretKey[7]<<1;
}
}
else
{ //解密过程
//密钥在进行右循环移位时位的次数
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 对密钥进行变换,完成后存于 Roll_key[0-7]当中
//其有效数位为 8*6
for(i=0;i<8;i++)
{
Roll_key[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)
Roll_key[i]=Roll_key[i]|des_bit_map[j];
}
}
//SETP 3 按扩充函数,对原文的右边 InputText_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((InputText_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) 与活动密钥 Roll_key[0-7] 进行位或操作
for(i=0;i<8;i++)
Des_Temp[i]=Des_Temp[i]^Roll_key[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 进行原文的左右边交换,即InputText_Left<>InputText_Right
for(i=0;i<8;i++) //Left swap Right
{
j=InputText_Left[i];
InputText_Left[i]=InputText_Right[i];
InputText_Right[i]=j;
}
//SETP 7 按换位函数P对替代盒中输出的数据 Des_Temp[0-7]数据进行一次置换
//将置换后所得的数据与现在的右边进或操作,作为新的右边的数据InputText_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];
}
InputText_Right[i]=InputText_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]=(InputText_Right[j]&0xf0)+(InputText_Right[j+1]>>4);
Des_Temp[i+4]=(InputText_Left[j]&0xf0)+(InputText_Left[j+1]>>4);
j=j+2;
}
//SETP 9 按逆初使置换表进行第二次的变换,变换后的数据为即为DES的输出密文
//完成后存入 InputText[0-7].
for(i=0;i<8;i++)
{
InputText[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)
InputText[i]=InputText[i]|des_bit_map[j];
}
}
//密文返回,放在数组 *Input 当中
Input=Input-8;
for(i=0;i<8;i++)
*Input++=InputText[i];
}
void Des_Third_Encrypt(uchar *plain,uchar *key1,uchar *key2)
{ //三重DES算法加密
Des_Encrypt_Decrypt(plain,key1,Encrypt);
Des_Encrypt_Decrypt(plain,key2,Decrypt);
Des_Encrypt_Decrypt(plain,key1,Encrypt);
}
void Des_Third_Decrypt(uchar *decrypt,uchar *key1,uchar *key2)
{ //三重DES算法解密
Des_Encrypt_Decrypt(decrypt,key1,Decrypt);
Des_Encrypt_Decrypt(decrypt,key2,Encrypt);
Des_Encrypt_Decrypt(decrypt,key1,Decrypt);
}
//IC卡话机在呼叫网管中心后对下次话机密码重新生成,将12个时间字符串进行扩充,
//变为一个8*8的数据,作为DES运算的密钥.
void C12_TO_B64(uchar *ptr)//通信密码中的时间串扩展
//入口: 时间串.长度为12个字节,年-秒,年只有两位
//出口:放在*Ptr所指向的原来的串当中
//变换方式为先按BCD压缩为6个BYTE,然后在高端补上一个8bit的0和8bit的奇校验位,格式如下:
//原来:[Yh][Yl][Mh][Ml][Dh][Dl][Hh][Hl][mh][ml][Sh][Sl],如
//变换:[00][YY][MM][DD][HH][mm][SS][CC]
//如:输入:"010313125524" 2001年03月13日,12时55分24秒
// 输出:0x00,0x01,0x03,0x13,0x12,0x55,0x24,0x72
{
uchar i,j;
uchar turn_key[8];
turn_key[0]=0;
for(i=1,j=0;i<7;i++)
{
turn_key[i]=((*ptr++)<<4)+((*ptr++)&0x0f);
j=j^turn_key[i];
}
turn_key[7]=j;
ptr=ptr-12;
for(i=0;i<8;i++,ptr++)
*ptr=turn_key[i];
}
//
//main()
//{
// uchar time[15];
// uchar Plain_Text[9],Key[9],Cipher_Text[9],Key2[9];
// strcpy(time,"010313125524");//2001年03月13日,12时55分24秒
// C12_TO_B64(time);
// //加密
// strcpy(Plain_Text,"\x10\x11\x12\x13\x14\x15\x16\x17");
// strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
// //Des_Encrypt(Plain_Text,Key);
// Des_Encrypt_Decrypt(Plain_Text,Key,Encrypt);
//
// //解密
// //strcpy(Cipher_Text,Plain_Text);
// strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
// Des_Encrypt_Decrypt(Plain_Text,Key,Decrypt);
// //Des_Decrypt(Cipher_Text,Key);
//
// //加密
// strcpy(Plain_Text,"\x12\x34\x56\x78\xab\xcd\xef\x01");
// strcpy(Key,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
// Des_Encrypt(Plain_Text,Key);
// //解密
// strcpy(Cipher_Text,Plain_Text);
// strcpy(Key,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
// Des_Decrypt(Cipher_Text,Key);
//
// //三重DES算法
// strcpy(Plain_Text,"\x10\x11\x12\x13\x14\x15\x16\x17");
// strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
// strcpy(Key2,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
// Des_Third_Encrypt(Plain_Text,Key,Key2);
//
// strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
// strcpy(Key2,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
// Des_Third_Decrypt(Plain_Text,Key,Key2);
//
// while(1);
//}
/* === 测试用的数据 ===
明文:{0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17}
密钥:{0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f}
密文:{0x9a,0xf9,0xfa,0xf0,0x59,0x9c,0x04,0xf0}
明文:{0x12,0x34,0x56,0x78,0xab,0xcd,0xef,0x01}
密钥:{0x1a,0x2b,0x3c,0x4d,0x5e,0x6f,0x70,0x81}
密文:{0xF8,0x2B,0x1A,0x92,0xF4,0xDA,0xD5,0xE4}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -