des c语言程序,DES完整代码 c语言版

#includeint 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值