⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.cpp

📁 使用vc编写的加密解密程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	S7[0][10] = 9;
	S7[0][11] = 7;
	S7[0][12] = 5;
	S7[0][13] = 10;
	S7[0][14] = 6;
	S7[0][15] = 1;
	S7[1][0] = 13;
	S7[1][1] = 0;
	S7[1][2] = 11;
	S7[1][3] = 7;
	S7[1][4] = 4;
	S7[1][5] = 9;
	S7[1][6] = 1;
	S7[1][7] = 10;
	S7[1][8] = 14;
	S7[1][9] = 3;
	S7[1][10] = 5;
	S7[1][11] = 12;
	S7[1][12] = 2;
	S7[1][13] = 15;
	S7[1][14] = 8;
	S7[1][15] = 6;
	S7[2][0] = 1;
	S7[2][1] = 4;
	S7[2][2] = 11;
	S7[2][3] = 13;
	S7[2][4] = 12;
	S7[2][5] = 3;
	S7[2][6] = 7;
	S7[2][7] = 14;
	S7[2][8] = 10;
	S7[2][9] = 15;
	S7[2][10] = 6;
	S7[2][11] = 8;
	S7[2][12] = 0;
	S7[2][13] = 5;
	S7[2][14] = 9;
	S7[2][15] = 2;
	S7[3][0] = 6;
	S7[3][1] = 11;
	S7[3][2] = 13;
	S7[3][3] = 8;
	S7[3][4] = 1;
	S7[3][5] = 4;
	S7[3][6] = 10;
	S7[3][7] = 7;
	S7[3][8] = 9;
	S7[3][9] = 5;
	S7[3][10] = 0;
	S7[3][11] = 15;
	S7[3][12] = 14;
	S7[3][13] = 2;
	S7[3][14] = 3;
	S7[3][15] = 12;

	S8[0][0] = 13;
	S8[0][1] = 2;
	S8[0][2] = 8;
	S8[0][3] = 4;
	S8[0][4] = 6;
	S8[0][5] = 15;
	S8[0][6] = 11;
	S8[0][7] = 1;
	S8[0][8] = 10;
	S8[0][9] = 9;
	S8[0][10] = 3;
	S8[0][11] = 14;
	S8[0][12] = 5;
	S8[0][13] = 0;
	S8[0][14] = 12;
	S8[0][15] = 7;
	S8[1][0] = 1;
	S8[1][1] = 15;
	S8[1][2] = 13;
	S8[1][3] = 8;
	S8[1][4] = 10;
	S8[1][5] = 3;
	S8[1][6] = 7;
	S8[1][7] = 4;
	S8[1][8] = 12;
	S8[1][9] = 5;
	S8[1][10] = 6;
	S8[1][11] = 11;
	S8[1][12] = 0;
	S8[1][13] = 14;
	S8[1][14] = 9;
	S8[1][15] = 2;
	S8[2][0] = 7;
	S8[2][1] = 11;
	S8[2][2] = 4;
	S8[2][3] = 1;
	S8[2][4] = 9;
	S8[2][5] = 12;
	S8[2][6] = 14;
	S8[2][7] = 2;
	S8[2][8] = 0;
	S8[2][9] = 6;
	S8[2][10] = 10;
	S8[2][11] = 13;
	S8[2][12] = 15;
	S8[2][13] = 3;
	S8[2][14] = 5;
	S8[2][15] = 8;
	S8[3][0] = 2;
	S8[3][1] = 1;
	S8[3][2] = 14;
	S8[3][3] = 7;
	S8[3][4] = 4;
	S8[3][5] = 10;
	S8[3][6] = 8;
	S8[3][7] = 13;
	S8[3][8] = 15;
	S8[3][9] = 12;
	S8[3][10] = 9;
	S8[3][11] = 0;
	S8[3][12] = 3;
	S8[3][13] = 5;
	S8[3][14] = 6;
	S8[3][15] = 11;

	//从明文的输入获得经过S盒的值
	j = Mi[0] * 2 + Mi[5];
	k = Mi[1] * 8 + Mi[2] * 4 + Mi[3] * 2 + Mi[4];
	output[0] = S1[j][k];
	output[1] = S2[j][k];
	output[2] = S3[j][k];
	output[3] = S4[j][k];
	output[4] = S5[j][k];
	output[5] = S6[j][k];
	output[6] = S7[j][k];
	output[7] = S8[j][k];
	return output[i - 1];
}

//输入16个密钥和明文计算DES
void DES::DES_jiami(int r[64], int out[64])
{
	//2进制明文分组Li bufyi
	int buf0[32]; int bufy0[32];
	int buf1[32]; int bufy1[32];
	int buf2[32]; int bufy2[32];
	int buf3[32]; int bufy3[32];
	int buf4[32]; int bufy4[32];
	int buf5[32]; int bufy5[32];
	int buf6[32]; int bufy6[32];
	int buf7[32]; int bufy7[32];
	int buf8[32]; int bufy8[32];
	int buf9[32]; int bufy9[32];
	int buf10[32]; int bufy10[32];
	int buf11[32]; int bufy11[32];
	int buf12[32]; int bufy12[32];
	int buf13[32]; int bufy13[32];
	int buf14[32]; int bufy14[32];
	int buf15[32]; int bufy15[32];
	int buf16[32]; int bufy16[32];

    int *L0 = buf0;     int *R0 = bufy0;  
    int *L1 = buf1;     int *R1 = bufy1;  
    int *L2 = buf2;     int *R2 = bufy2;  
    int *L3 = buf3;     int *R3 = bufy3;  
    int *L4 = buf4;     int *R4 = bufy4;  
    int *L5 = buf5;     int *R5 = bufy5;  
    int *L6 = buf6;     int *R6 = bufy6;  
    int *L7 = buf7;     int *R7 = bufy7;  
    int *L8 = buf8;     int *R8 = bufy8;  
    int *L9 = buf9;     int *R9 = bufy9;  
    int *L10 = buf10;   int *R10 = bufy10;
    int *L11 = buf11;   int *R11 = bufy11;
    int *L12 = buf12;   int *R12 = bufy12;
    int *L13 = buf13;   int *R13 = bufy13;
    int *L14 = buf14;   int *R14 = bufy14;
    int *L15 = buf15;   int *R15 = bufy15;
    int *L16 = buf16;   int *R16 = bufy16;
    
	int afterG[32];

	//获得2进制明文经过IP置换后结果
	int afterIP[64];
	IP(r, afterIP);
	int temp[64];
	//获得L0 R0
	for (int i = 0; i < 32; i++)
	{
		L0[i] = afterIP[i];
		R0[i] = afterIP[i + 32];
	}

	//用R0和第一个密钥进行f函数

	f(R0, keyreturn[0], afterG);
	for (i=0;i<32;i++)
	{
		if (L0[i]!=afterG[i]) R1[i]=1;//L0与R1异或
	}
	L1 = R0;
	//第一重
	f(R1, keyreturn[1], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L1[i] != afterG[i]) R2[i] = 1;
	}
	L2 = R1;
	//第二重
	f(R2, keyreturn[2], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L2[i] != afterG[i]) R3[i] = 1;
	}
	L3 = R2;
	//第3重
	f(R3, keyreturn[3], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L3[i] != afterG[i]) R4[i] = 1;
	}
	L4 = R3;
	//第4重
	f(R4, keyreturn[4], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L4[i] != afterG[i]) R5[i] = 1;
	}
	L5 = R4;
	//第5重
	f(R5, keyreturn[5], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L5[i] != afterG[i]) R6[i] = 1;
	}
	L6 = R5;
	//第6重
	f(R6, keyreturn[6], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L6[i] != afterG[i]) R7[i] = 1;
	}
	L7 = R6;
	//第7重
	f(R7, keyreturn[7], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L7[i] != afterG[i]) R8[i] = 1;
	}
	L8 = R7;
	//第8重
	f(R8, keyreturn[8], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L8[i] != afterG[i]) R9[i] = 1;
	}
	L9 = R8;
	//第9重
	f(R9, keyreturn[9], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L9[i] != afterG[i]) R10[i] = 1;
	}
	L10 = R9;
	//第10重
	f(R10, keyreturn[10], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L10[i] != afterG[i]) R11[i] = 1;
	}
	L11 = R10;
	//第11重
	f(R11, keyreturn[11], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L11[i] != afterG[i]) R12[i] = 1;
	}
	L12 = R11;
	//第12重
	f(R12, keyreturn[12], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L12[i] != afterG[i]) R13[i] = 1;
	}
	L13 = R12;
	//第13重
	f(R13, keyreturn[13], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L13[i] != afterG[i]) R14[i] = 1;
	}
	L14 = R13;
	//第14重
	f(R14, keyreturn[14], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L14[i] != afterG[i]) R15[i] = 1;
	}
	L15 = R14;
	//第15重
	f(R15, keyreturn[15], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L15[i] != afterG[i]) R16[i] = 1;
	}
	L16 = R15;
	//第16重


	//合并L16和R16
	for (i = 0; i < 32; i++)
	{
		temp[i] = R16[i];
		temp[i + 32] = L16[i];
	}
	//明文经过IP-1置换输出
	FP(temp, out);
}

//16个密钥倒向输入计算DES反函数,原理大致与DES相同
void DES::DES_jiemi(int r[64], int out[64])
{
	int buf0[32]; int bufy0[32];
	int buf1[32]; int bufy1[32];
	int buf2[32]; int bufy2[32];
	int buf3[32]; int bufy3[32];
	int buf4[32]; int bufy4[32];
	int buf5[32]; int bufy5[32];
	int buf6[32]; int bufy6[32];
	int buf7[32]; int bufy7[32];
	int buf8[32]; int bufy8[32];
	int buf9[32]; int bufy9[32];
	int buf10[32]; int bufy10[32];
	int buf11[32]; int bufy11[32];
	int buf12[32]; int bufy12[32];
	int buf13[32]; int bufy13[32];
	int buf14[32]; int bufy14[32];
	int buf15[32]; int bufy15[32];
	int buf16[32]; int bufy16[32];

    int *L0 = buf0;     int *R0 = bufy0;  
    int *L1 = buf1;     int *R1 = bufy1;  
    int *L2 = buf2;     int *R2 = bufy2;  
    int *L3 = buf3;     int *R3 = bufy3;  
    int *L4 = buf4;     int *R4 = bufy4;  
    int *L5 = buf5;     int *R5 = bufy5;  
    int *L6 = buf6;     int *R6 = bufy6;  
    int *L7 = buf7;     int *R7 = bufy7;  
    int *L8 = buf8;     int *R8 = bufy8;  
    int *L9 = buf9;     int *R9 = bufy9;  
    int *L10 = buf10;   int *R10 = bufy10;
    int *L11 = buf11;   int *R11 = bufy11;
    int *L12 = buf12;   int *R12 = bufy12;
    int *L13 = buf13;   int *R13 = bufy13;
    int *L14 = buf14;   int *R14 = bufy14;
    int *L15 = buf15;   int *R15 = bufy15;
    int *L16 = buf16;   int *R16 = bufy16;

	int afterG[32];
	int afterIP[64];
	IP(r, afterIP);
	int temp[64];

	for (int i = 0; i < 32; i++)
	{
		L0[i] = afterIP[i];
		R0[i] = afterIP[i + 32];
	}


	f(R0, keyreturn[15], afterG);
	for (i=0;i<32;i++)
	{
		if (L0[i]!=afterG[i]) R1[i]=1;
	}
	L1 = R0;

	//第一重
	f(R1, keyreturn[14], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L1[i] != afterG[i]) R2[i] = 1;
	}
	L2 = R1;
	//第二重
	f(R2, keyreturn[13], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L2[i] != afterG[i]) R3[i] = 1;
	}
	L3 = R2;
	//第3重
	f(R3, keyreturn[12], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L3[i] != afterG[i]) R4[i] = 1;
	}
	L4 = R3;
	//第4重
	f(R4, keyreturn[11], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L4[i] != afterG[i]) R5[i] = 1;
	}
	L5 = R4;
	//第5重
	f(R5, keyreturn[10], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L5[i] != afterG[i]) R6[i] = 1;
	}
	L6 = R5;
	//第6重
	f(R6, keyreturn[9], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L6[i] != afterG[i]) R7[i] = 1;
	}
	L7 = R6;
	//第7重
	f(R7, keyreturn[8], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L7[i] != afterG[i]) R8[i] = 1;
	}
	L8 = R7;
	//第8重
	f(R8, keyreturn[7], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L8[i] != afterG[i]) R9[i] = 1;
	}
	L9 = R8;
	//第9重
	f(R9, keyreturn[6], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L9[i] != afterG[i]) R10[i] = 1;
	}
	L10 = R9;
	//第10重
	f(R10, keyreturn[5], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L10[i] != afterG[i]) R11[i] = 1;
	}
	L11 = R10;
	//第11重
	f(R11, keyreturn[4], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L11[i] != afterG[i]) R12[i] = 1;
	}
	L12 = R11;
	//第12重
	f(R12, keyreturn[3], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L12[i] != afterG[i]) R13[i] = 1;
	}
	L13 = R12;
	//第13重
	f(R13, keyreturn[2], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L13[i] != afterG[i]) R14[i] = 1;
	}
	L14 = R13;
	//第14重
	f(R14, keyreturn[1], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L14[i] != afterG[i]) R15[i] = 1;
	}
	L15 = R14;
	//第15重
	f(R15, keyreturn[0], afterG);
	for (i = 0; i < 32; i++)
	{
		if (L15[i] != afterG[i]) R16[i] = 1;
	}
	L16 = R15;
	//第16重


	for (i = 0; i < 32; i++)
	{
		temp[i] = R16[i];
		temp[i + 32] = L16[i];
	}
	FP(temp, out);
}

// #include <stdio.h>

// main()
// {
// 	key[56];
//     crypt[64];

// 	plain[64] = {1, 0, 1, 0, 1, 0, 1, 0};
// 	memset(key, 0, sizeof(key));
// 	//memset(plain, 0, sizeof(plain));
// 	memset(crypt, 0, sizeof(crypt));
// 	DES a;
// 	a.makekey(key);
// 	//a.DES_jiami(plain, crypt);

// 	//for (i = 0; i < 64; i++) {
//  //       if (i % 8 == 0) printf("\n");
// 	//	printf("%01d ", crypt[i]);
//  //   }
// 	for (i = 0; i < 64; i++) {
//         if (i % 8 == 0) printf("\n");
// 		printf("%01d ", plain[i]);
//     }
// 	printf("\n");

// 	a.DES_jiemi(plain, plain);

// 	for (i = 0; i < 64; i++) {
//         if (i % 8 == 0) printf("\n");
// 		printf("%01d ", plain[i]);
//     }

// 	return 0;
// }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -