📄 des.c
字号:
*/
void Data_32_To_48(unsigned char Plain_32[],unsigned char Plain_48[]){
unsigned char i,j,deal_data;
unsigned char index=0;
unsigned char NewKey_index,NewKey_data;
for (i=0;i<6;i++) /* 6个字节作为输出*/
Plain_48[i]=0;
for (i=0;i<4;i++) { /* 总共4字节, 4*8=32 */
deal_data=Plain_32[i]; /* 取第i个字节 */
for (j=0;j<8;j++) {
if ((deal_data & 0x80)==0x80) {
NewKey_index=Data_32_To_48_Tab[index][0];
NewKey_data=Data_32_To_48_Tab[index][1];
Plain_48[NewKey_index] |= NewKey_data;
NewKey_index=Data_32_To_48_Tab[index][2];
NewKey_data=Data_32_To_48_Tab[index][3];
Plain_48[NewKey_index] |= NewKey_data;
}
index++;
deal_data <<= 1;
}
}
}
/*
// 0 16 07 20 21 29 12 28 17
// 1 01 15 23 26 05 18 31 10
// 2 02 08 24 14 32 27 03 09
// 3 19 13 30 06 22 11 04 25
*/
static unsigned char PBox_Replace_Tab[32][2]={
{0x01,0x80}, /* 1 */
{0x02,0x80}, /* 2 */
{0x02,0x02}, /* 3 */
{0x03,0x02}, /* 4 */
{0x01,0x08}, /* 5 */
{0x03,0x10}, /* 6 */
{0x00,0x40}, /* 7 */
{0x02,0x40}, /* 8 */
{0x02,0x01}, /* 9 */
{0x01,0x01}, /* 10 */
{0x03,0x04}, /* 11 */
{0x00,0x04}, /* 12 */
{0x03,0x40}, /* 13 */
{0x02,0x10}, /* 14 */
{0x01,0x40}, /* 15 */
{0x00,0x80}, /* 16 */
{0x00,0x01}, /* 17 */
{0x01,0x04}, /* 18 */
{0x03,0x80}, /* 19 */
{0x00,0x20}, /* 20 */
{0x00,0x10}, /* 21 */
{0x03,0x08}, /* 22 */
{0x01,0x20}, /* 23 */
{0x02,0x20}, /* 24 */
{0x03,0x01}, /* 25 */
{0x01,0x10}, /* 26 */
{0x02,0x04}, /* 27 */
{0x00,0x02}, /* 28 */
{0x00,0x08}, /* 29 */
{0x03,0x20}, /* 30 */
{0x01,0x02}, /* 31 */
{0x02,0x08} /* 32 */
};
/*
* P-Box 置换 32-bits ==> 32-bits
* 转换结果由in_data[]数组继续带回去
*/
void Data_P_Box_Replace(unsigned char in_data[]) {
unsigned char temp_data[4];
unsigned char i,j,deal_data;
unsigned char index=0;
unsigned char NewKey_index,NewKey_data;
for (i=0;i<4;i++)
temp_data[i]=0;
for (i=0;i<4;i++) { /* 总共4字节, 4*8=32 */
deal_data=in_data[i]; /* 取第i个字节 */
for (j=0;j<8;j++) {
if ((deal_data & 0x80)==0x80) {
NewKey_index=PBox_Replace_Tab[index][0];
NewKey_data=PBox_Replace_Tab[index][1];
temp_data[NewKey_index] |= NewKey_data;
}
index++;
deal_data <<= 1;
}
}
for (i=0;i<4;i++)
in_data[i]=temp_data[i];
}
/*
* 将数组Source1[]与Source2[]异或,结果放于Source1[]中,共操作count个字节
*/
void Xor_Data(unsigned char Source1[],unsigned char Source2[],unsigned char count) {
unsigned char i;
for (i=0;i<count;i++)
Source1[i]=Source1[i] ^ Source2[i];
}
/*
// 0 58 50 42 34 26 18 10 02
// 1 60 52 44 36 28 20 12 04
// 2 62 54 46 38 30 22 14 06
// 3 64 56 48 40 32 24 16 08
// 4 57 49 41 33 25 17 09 01
// 5 59 51 43 35 27 19 11 03
// 6 61 53 45 37 29 21 13 05
// 7 63 55 47 39 31 23 15 07
* 明文最开始的置换,即进入十六次循环之前的置换
*/
static unsigned char Data_Init_Replace_Tab[64][2]={
{0x04,0x01}, /* 1 */
{0x00,0x01}, /* 2 */
{0x05,0x01}, /* 3 */
{0x01,0x01}, /* 4 */
{0x06,0x01}, /* 5 */
{0x02,0x01}, /* 6 */
{0x07,0x01}, /* 7 */
{0x03,0x01}, /* 8 */
{0x04,0x02}, /* 9 */
{0x00,0x02}, /* 10 */
{0x05,0x02}, /* 11 */
{0x01,0x02}, /* 12 */
{0x06,0x02}, /* 13 */
{0x02,0x02}, /* 14 */
{0x07,0x02}, /* 15 */
{0x03,0x02}, /* 16 */
{0x04,0x04}, /* 17 */
{0x00,0x04}, /* 18 */
{0x05,0x04}, /* 19 */
{0x01,0x04}, /* 20 */
{0x06,0x04}, /* 21 */
{0x02,0x04}, /* 22 */
{0x07,0x04}, /* 23 */
{0x03,0x04}, /* 24 */
{0x04,0x08}, /* 25 */
{0x00,0x08}, /* 26 */
{0x05,0x08}, /* 27 */
{0x01,0x08}, /* 28 */
{0x06,0x08}, /* 29 */
{0x02,0x08}, /* 30 */
{0x07,0x08}, /* 31 */
{0x03,0x08}, /* 32 */
{0x04,0x10}, /* 33 */
{0x00,0x10}, /* 34 */
{0x05,0x10}, /* 35 */
{0x01,0x10}, /* 36 */
{0x06,0x10}, /* 37 */
{0x02,0x10}, /* 38 */
{0x07,0x10}, /* 39 */
{0x03,0x10}, /* 40 */
{0x04,0x20}, /* 41 */
{0x00,0x20}, /* 42 */
{0x05,0x20}, /* 43 */
{0x01,0x20}, /* 44 */
{0x06,0x20}, /* 45 */
{0x02,0x20}, /* 46 */
{0x07,0x20}, /* 47 */
{0x03,0x20}, /* 48 */
{0x04,0x40}, /* 49 */
{0x00,0x40}, /* 50 */
{0x05,0x40}, /* 51 */
{0x01,0x40}, /* 52 */
{0x06,0x40}, /* 53 */
{0x02,0x40}, /* 54 */
{0x07,0x40}, /* 55 */
{0x03,0x40}, /* 56 */
{0x04,0x80}, /* 57 */
{0x00,0x80}, /* 58 */
{0x05,0x80}, /* 59 */
{0x01,0x80}, /* 60 */
{0x06,0x80}, /* 61 */
{0x02,0x80}, /* 62 */
{0x07,0x80}, /* 63 */
{0x03,0x80}, /* 64 */
};
/*
* 待转换的数据(明文)最开始的置换 64-bits ==> 64-bits
* 转换结果由in_data[]数组继续带回去
*/
void Data_Init_Replace(unsigned char in_data[]) {
unsigned char temp_data[8];
unsigned char i,j,deal_data;
unsigned char index=0;
unsigned char NewKey_index,NewKey_data;
for (i=0;i<8;i++)
temp_data[i]=0;
for (i=0;i<8;i++) { /* 总共8字节(64-bits) */
deal_data=in_data[i]; /* 取第i个字节 */
for (j=0;j<8;j++) {
if ((deal_data & 0x80)==0x80) {
NewKey_index=Data_Init_Replace_Tab[index][0];
NewKey_data=Data_Init_Replace_Tab[index][1];
temp_data[NewKey_index] |= NewKey_data;
}
index++;
deal_data <<= 1;
}
}
for (i=0;i<8;i++)
in_data[i]=temp_data[i];
}
/*
// 0 40 08 48 16 56 24 64 32
// 1 39 07 47 15 55 23 63 31
// 2 38 06 46 14 54 22 62 30
// 3 37 05 45 13 53 21 61 29
// 4 36 04 44 12 52 20 60 28
// 5 35 03 43 11 51 19 59 27
// 6 34 02 42 10 50 18 58 26
// 7 33 01 41 09 49 17 57 25
* 最后形成密文前的置换
*/
static unsigned char Data_End_Replace_Tab[64][2]={
{0x07,0x40}, /* 1 */
{0x06,0x40}, /* 2 */
{0x05,0x40}, /* 3 */
{0x04,0x40}, /* 4 */
{0x03,0x40}, /* 5 */
{0x02,0x40}, /* 6 */
{0x01,0x40}, /* 7 */
{0x00,0x40}, /* 8 */
{0x07,0x10}, /* 9 */
{0x06,0x10}, /* 10 */
{0x05,0x10}, /* 11 */
{0x04,0x10}, /* 12 */
{0x03,0x10}, /* 13 */
{0x02,0x10}, /* 14 */
{0x01,0x10}, /* 15 */
{0x00,0x10}, /* 16 */
{0x07,0x04}, /* 17 */
{0x06,0x04}, /* 18 */
{0x05,0x04}, /* 19 */
{0x04,0x04}, /* 20 */
{0x03,0x04}, /* 21 */
{0x02,0x04}, /* 22 */
{0x01,0x04}, /* 23 */
{0x00,0x04}, /* 24 */
{0x07,0x01}, /* 25 */
{0x06,0x01}, /* 26 */
{0x05,0x01}, /* 27 */
{0x04,0x01}, /* 28 */
{0x03,0x01}, /* 29 */
{0x02,0x01}, /* 30 */
{0x01,0x01}, /* 31 */
{0x00,0x01}, /* 32 */
{0x07,0x80}, /* 33 */
{0x06,0x80}, /* 34 */
{0x05,0x80}, /* 35 */
{0x04,0x80}, /* 36 */
{0x03,0x80}, /* 37 */
{0x02,0x80}, /* 38 */
{0x01,0x80}, /* 39 */
{0x00,0x80}, /* 40 */
{0x07,0x20}, /* 41 */
{0x06,0x20}, /* 42 */
{0x05,0x20}, /* 43 */
{0x04,0x20}, /* 44 */
{0x03,0x20}, /* 45 */
{0x02,0x20}, /* 46 */
{0x01,0x20}, /* 47 */
{0x00,0x20}, /* 48 */
{0x07,0x08}, /* 49 */
{0x06,0x08}, /* 50 */
{0x05,0x08}, /* 51 */
{0x04,0x08}, /* 52 */
{0x03,0x08}, /* 53 */
{0x02,0x08}, /* 54 */
{0x01,0x08}, /* 55 */
{0x00,0x08}, /* 56 */
{0x07,0x02}, /* 57 */
{0x06,0x02}, /* 58 */
{0x05,0x02}, /* 59 */
{0x04,0x02}, /* 60 */
{0x03,0x02}, /* 61 */
{0x02,0x02}, /* 62 */
{0x01,0x02}, /* 63 */
{0x00,0x02}, /* 64 */
};
/*
* 经过下面的转换后,密文最后形成 64-bits ==> 64-bits
* 转换结果由in_data[]数组继续带回去
*/
void Data_End_Replace(unsigned char in_data[]) {
unsigned char temp_data[8];
unsigned char i,j,deal_data;
unsigned char index=0;
unsigned char NewKey_index,NewKey_data;
for (i=0;i<8;i++)
temp_data[i]=0;
for (i=0;i<8;i++) { /* 总共8字节(64-bits) */
deal_data=in_data[i]; /* 取第i个字节 */
for (j=0;j<8;j++) {
if ((deal_data & 0x80)==0x80) {
NewKey_index=Data_End_Replace_Tab[index][0];
NewKey_data=Data_End_Replace_Tab[index][1];
temp_data[NewKey_index] |= NewKey_data;
}
index++;
deal_data <<= 1;
}
}
for (i=0;i<8;i++)
in_data[i]=temp_data[i];
}
/*
* 加密时每次循环密码向左移动位数表
*/
static unsigned char EncrypKeyRotateTimesTab[]={
1,1,2,2,2,2,2,2,
1,2,2,2,2,2,2,1
};
/*
* 加密程序
*/
extern void Encryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
unsigned char Key_56[7],Key_48[6];
unsigned char temp[8];
char i,j;
Key64_To_56(Key_64,Key_56); /* 得到真正的56-bits密码 */
Data_Init_Replace(PlainTxt); // 最开始一次置换
for (i=0;i<16;i++) {
for (j=0;j<4;j++) /* 上层的右半部分直接作为下层的左半部 */
CipherTxt[j]=PlainTxt[4+j]; /* L(i)=L(i-1) */
Data_32_To_48(PlainTxt+4,temp); /* 数据从32-bits扩展到48-bits */
KeyRotate(Key_56,EncrypKeyRotateTimesTab[i],0); /* rotate left */
Key_56_To_48(Key_56,Key_48); /* 密码压缩置换 */
Xor_Data(temp,Key_48,6); /* 异或6个字节 */
S_Box_Replace(temp); /* 48-bits ==> 32-bits */
Data_P_Box_Replace(temp); /* P盒置换 */
Xor_Data(temp,PlainTxt,4); /* 异或4个字节 */
if (i==15) { /* 最后一次左右不交换 */
for (j=0;j<4;j++)
PlainTxt[4+j]=CipherTxt[j];
for (j=0;j<4;j++)
PlainTxt[j]=temp[j];
}
else {
for (j=0;j<4;j++)
PlainTxt[4+j]=temp[j];
for (j=0;j<4;j++)
PlainTxt[j]=CipherTxt[j];
}
}
for (i=0;i<8;i++)
CipherTxt[i]=PlainTxt[i];
Data_End_Replace(CipherTxt); // 最后一次置换
}
/*
* 解密时每次循环密码向右移动位数表
*/
static unsigned char DecrypKeyRotateTimesTab[]={
0,1,2,2,2,2,2,2,
1,2,2,2,2,2,2,1
};
/*
* 解密程序
*/
extern void Decryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
unsigned char Key_56[7],Key_48[6];
unsigned char temp[8];
char i,j;
Key64_To_56(Key_64,Key_56); /* 得到真正的56-bits密码 */
Data_Init_Replace(PlainTxt); /* 最开始一次置换 */
for (i=0;i<16;i++) {
for (j=0;j<4;j++) /* 上层的右半部分直接作为下层的左半部 */
CipherTxt[j]=PlainTxt[4+j]; /* L(i)=L(i-1) */
Data_32_To_48(PlainTxt+4,temp); /* 数据从32-bits扩展到48-bits */
KeyRotate(Key_56,DecrypKeyRotateTimesTab[i],1); /* rotate right */
Key_56_To_48(Key_56,Key_48); /* 密码压缩置换 */
Xor_Data(temp,Key_48,6); /* 异或6个字节 */
S_Box_Replace(temp); /* 48-bits ==> 32-bits */
Data_P_Box_Replace(temp); /* P盒置换 */
Xor_Data(temp,PlainTxt,4); /* 异或4个字节 */
if (i==15) { /* 最后一次左右不交换 */
for (j=0;j<4;j++)
PlainTxt[4+j]=CipherTxt[j];
for (j=0;j<4;j++)
PlainTxt[j]=temp[j];
}
else {
for (j=0;j<4;j++)
PlainTxt[4+j]=temp[j];
for (j=0;j<4;j++)
PlainTxt[j]=CipherTxt[j];
}
}
for (i=0;i<8;i++)
CipherTxt[i]=PlainTxt[i];
Data_End_Replace(CipherTxt); // 最后一次置换
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -