#include
#include
int S_Box[8][4][16] =
{ //8个S盒 三维数组 // S1
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
// S2
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
// S3
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
// S4
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
// S5
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
// S6
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
// S7
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
// S8
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
};
int IP_Table[64] =
{ //IP置换矩阵
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
};
int E_Table[48] =
{ //扩展矩阵
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
};
int P_Table[32] =
{ // P 盒
16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
};
int IPR_Table[64] =
{ //逆IP置换矩阵
40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
};
int PC1_Table[56] =
{ //密钥第一次置换矩阵
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
};
int PC2_Table[48] =
{ // 密钥第二次置换矩阵
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
};
static void CharToBit(const char input[], int output[], int bits)//把CHAR转换为INT
{
int i, j;
for (j = 0; j<8; j++)
{
for (i = 0; i<8; i++)
{
output[7 * (j + 1) - i + j] = (input[j] >> i) & 1;
}
}
};
static void BitToChar(const int intput[], char output[], int bits)//把INT转换为CHAR
{
int i, j;
for (j = 0; j<8; j++)
{
for (i = 0; i<8; i++)
{
output[j] = output[j] * 2 + intput[i + 8 * j];
}
}
};
/*开始*/
static void IP(const int input[64], int output[64], int table[64])//初始IP置换
{
int i;
for (i = 0; i<64; i++)
{
output[i] = input[table[i] - 1];//减1操作不可少!!
}
};
static void E(const int input[32], int output[48], int table[48])//E扩展 每一轮中32-48
{
int i;
for (i = 0; i<48; i++)
{
output[i] = input[table[i] - 1];
}
};
static void Xor(int *INA, int *INB, int len)//异或操作 两个整形数组的指针
{
int i;
for (i = 0; i> i) & 1;
}
}
};
static void P(const int input[32], int output[32], int table[32])//P置换
{
int i;
for (i = 0; i<32; i++)
{
output[i] = input[table[i] - 1];
}
};
/*密钥部分*/
static void IP_In(const int input[64], int output[64], int table[64])//逆IP
{
int i;
for (i = 0; i<64; i++)
{
output[i] = input[table[i] - 1];
}
};
static void PC_1(const int input[64], int output[56], int table[56])//PC_1 64-56
{
int i;
for (i = 0; i<56; i++)
{
output[i] = input[table[i] - 1];
}
};
static void RotateL(const int input[28], int output[28], int leftCount)//秘钥循环左移 output拿去置换 和 下一轮
{
int i;
int len = 28;
for (i = 0; i=0;v--)
{
printf("\n 第%d轮子密钥为:",4-v);
for(int m=0;m<48;m++)
printf("%d",subkeys[v][m]);
}
/* printf("\n 加密第4轮结果:");
for(x=0;x<64;x++)
{
if(x==32)
printf(" ");
printf("%d",output_1[x]);
}
*/
IP_In(output_1, output, IPR_Table); //查表逆ip ,结果为output
};
static void DES_Dfun(int input[64], char key_in[8], char output[8])
{
int Ip[64] = { 0 };//存储初始置换后的矩阵
int output_1[64] = { 0 };
int output_2[64] = { 0 };
int subkeys[4][48];
int chartobit[64] = { 0 };
int key[64];
int x;
int l[5][32], r[5][32];
IP(input, Ip, IP_Table); //置换后为ip
CharToBit(key_in, key, 8);
subKey_fun(key, subkeys);
for (int i = 0; i<32; i++)
{
l[0][i] = Ip[i];
r[0][i] = Ip[32 + i]; //把置换后的放进0轮左右
}
for (int j = 1; j<4; j++)//前3轮的操作
{
for (int k = 0; k<32; k++)
{
l[j][k] = r[j - 1][k];
}
F_func(r[j - 1], r[j], subkeys[4 - j]);
Xor(r[j], l[j - 1], 32);
printf("\n 解密第%d轮结果:",j); //输出变换后的结果
for(x=0;x<32;x++)
printf("%d",r[j-1][x]);
printf(" ");
for(x=0;x<32;x++)
printf("%d",r[j][x]);
}
int t = 0;
for (t = 0; t<32; t++)//最后一轮的操作
{
r[4][t] = r[3][t];
}
F_func(r[3], l[4], subkeys[0]);
Xor(l[4], l[3], 32);
printf("\n 解密第4轮结果:"); //输出变换后的结果
for(x=0;x<32;x++)
printf("%d",r[3][x]);
printf(" ");
for(x=0;x<32;x++)
printf("%d",r[4][x]);
for (t = 0; t<32; t++)
{
output_1[t] = l[4][t];
output_1[32 + t] = r[4][t];
}
for(int v=3;v>=0;v--)
{
printf("\n 第%d轮子密钥为:",4-v);
for(int m=0;m<48;m++)
printf("%d",subkeys[v][m]);
}
/* printf("\n 解密第4轮结果:");
for(x=0;x<64;x++)
{
if(x==32)
printf(" ");
printf("%d",output_1[x]);
}
*/
IP_In(output_1, output_2, IPR_Table);
BitToChar(output_2, output, 8);
};
int main()
{
int output[64] = { 0 };
char C[9] = { 0 };
char M[9] = { 0 };
printf("\n\n\t-------------------------四轮DES加解密----------------------------------\n\n");
printf("\t\t\t8字节明文:");
gets(C);
printf("\t\t\t8字节密钥:");
gets(M);
DES_Efun(C, M, output);
printf("\n\n 加密得密文为:");
for (int i = 0; i<64; i++)
{
printf("%d", output[i]);
if ((i + 1) % 4 == 0)
printf(" ");
}
printf("\n");
DES_Dfun(output, M, C);
printf("\n\n 解密出明文为:");
for (int i = 0; i<8; i++)
{
printf("%c", C[i]);
}
printf("\n\n");
return 0;
}