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

📄 des.cpp

📁 使用vc编写的加密解密程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"

#include "des.h"
#include "memory.h"

void DES::IP(int mchar[64], int mreturn[64])
{
	int mint[64];
	memset(mint, 0, sizeof(mint));

	//将int明文转化为2进制明文
	for (int i =0;i<64;i++)
	{
		if ((mchar[i] & 0x80)!=0) mint[i*8+0] =1;
		if ((mchar[i] & 0x40)!=0) mint[i*8+1] =1;
		if ((mchar[i] & 0x20)!=0) mint[i*8+2] =1;
		if ((mchar[i] & 0x10)!=0) mint[i*8+3] =1;
		if ((mchar[i] & 0x8)!=0) mint[i*8+4] =1;
		if ((mchar[i] & 0x4)!=0) mint[i*8+5] =1;
		if ((mchar[i] & 0x2)!=0) mint[i*8+6] =1;
		if ((mchar[i] & 0x1)!=0) mint[i*8+7] =1;
	}

	//置换表
	mreturn[0] = mint[57];mreturn[1] = mint[49];mreturn[2] = mint[41];
	mreturn[3] = mint[33];mreturn[4] = mint[25];mreturn[5] = mint[17];
	mreturn[6] = mint[9]; mreturn[7] = mint[1]; mreturn[8] = mint[59];
	mreturn[9] = mint[51];mreturn[10] = mint[43];mreturn[11] = mint[35];
	mreturn[12] = mint[27];mreturn[13] = mint[19];mreturn[14] = mint[11];
	mreturn[15] = mint[3];mreturn[16] = mint[61];mreturn[17] = mint[53];
	mreturn[18] = mint[45];mreturn[19] = mint[37];mreturn[20] = mint[29];
	mreturn[21] = mint[21];mreturn[22] = mint[13];mreturn[23] = mint[5];
	mreturn[24] = mint[63];mreturn[25] = mint[55];mreturn[26] = mint[47];
	mreturn[27] = mint[39];mreturn[28] = mint[31];mreturn[29] = mint[23];
	mreturn[30] = mint[15];mreturn[31] = mint[7];mreturn[32] = mint[56];
	mreturn[33] = mint[48];mreturn[34] = mint[40];mreturn[35] = mint[32];
	mreturn[36] = mint[24];mreturn[37] = mint[16];mreturn[38] = mint[8];
	mreturn[39] = mint[0];mreturn[40] = mint[58];mreturn[41] = mint[50];
	mreturn[42] = mint[42];mreturn[43] = mint[34];mreturn[44] = mint[26];
	mreturn[45] = mint[18];mreturn[46] = mint[10];mreturn[47] = mint[2];
	mreturn[48] = mint[60];mreturn[49] = mint[52];mreturn[50] = mint[44];
	mreturn[51] = mint[36];mreturn[52] = mint[28];mreturn[53] = mint[20];
	mreturn[54] = mint[12];mreturn[55] = mint[4];mreturn[56] = mint[62];
	mreturn[57] = mint[54];mreturn[58] = mint[46];mreturn[59] = mint[38];
	mreturn[60] = mint[30];mreturn[61] = mint[22];mreturn[62] = mint[14];
	mreturn[63] = mint[6];
}


//FP置换
void DES::FP(int mchar[64], int fpreturn[64])
{
	//置换表
	fpreturn[0] = mchar[39];fpreturn[1] = mchar[7];fpreturn[2] = mchar[47];fpreturn[3] = mchar[15];
	fpreturn[4] = mchar[55];fpreturn[5] = mchar[23];fpreturn[6] = mchar[63];fpreturn[7] = mchar[31];
	fpreturn[8] = mchar[38];fpreturn[9] = mchar[6];fpreturn[10] = mchar[46];fpreturn[11] = mchar[14];
	fpreturn[12] = mchar[54];fpreturn[13] = mchar[22];fpreturn[14] = mchar[62];fpreturn[15] = mchar[30];
	fpreturn[16] = mchar[37];fpreturn[17] = mchar[5];fpreturn[18] = mchar[45];fpreturn[19] = mchar[13];
	fpreturn[20] = mchar[53];fpreturn[21] = mchar[21];fpreturn[22] = mchar[61];fpreturn[23] = mchar[29];
	fpreturn[24] = mchar[36];fpreturn[25] = mchar[4];fpreturn[26] = mchar[44];fpreturn[27] = mchar[12];
	fpreturn[28] = mchar[52];fpreturn[29] = mchar[20];fpreturn[30] = mchar[60];fpreturn[31] = mchar[28];
	fpreturn[32] = mchar[35];fpreturn[33] = mchar[3];fpreturn[34] = mchar[43];fpreturn[35] = mchar[11];
	fpreturn[36] = mchar[51];fpreturn[37] = mchar[19];fpreturn[38] = mchar[59];fpreturn[39] = mchar[27];
	fpreturn[40] = mchar[34];fpreturn[41] = mchar[2];fpreturn[42] = mchar[42];fpreturn[43] = mchar[10];
	fpreturn[44] = mchar[50];fpreturn[45] = mchar[18];fpreturn[46] = mchar[58];fpreturn[47] = mchar[26];
	fpreturn[48] = mchar[33];fpreturn[49] = mchar[1];fpreturn[50] = mchar[41];fpreturn[51] = mchar[9];
	fpreturn[52] = mchar[49];fpreturn[53] = mchar[17];fpreturn[54] = mchar[57];fpreturn[55] = mchar[25];
	fpreturn[56] = mchar[32];fpreturn[57] = mchar[0];fpreturn[58] = mchar[40];fpreturn[59] = mchar[8];
	fpreturn[60] = mchar[48];fpreturn[61] = mchar[16];fpreturn[62] = mchar[56];fpreturn[63] = mchar[24];
}

//由64位原始密钥计算16个48位密钥
void DES::makekey(int kchar[48])
{
	//16位数组存放16个输出密钥

	int temp[64];
	int kint[56];
	int c0[28]; int d0[28];
	int c16[28]; int d1[28];
	int c1[28]; int d2[28];
	int c2[28]; int d3[28];
	int c3[28]; int d4[28];
	int c4[28]; int d5[28];
	int c5[28]; int d6[28];
	int c6[28]; int d7[28];
	int c7[28]; int d8[28];
	int c8[28]; int d9[28];
	int c9[28]; int d10[28];
	int c10[28]; int d11[28];
	int c11[28]; int d12[28];
	int c12[28]; int d13[28];
	int c13[28]; int d14[28];
	int c14[28]; int d15[28];
	int c15[28]; int d16[28];
	int k1[48]; int k2[48]; int k3[48];
	int k4[48]; int k5[48]; int k6[48];
	int k7[48]; int k8[48]; int k9[48];
	int k10[48]; int k11[48]; int k12[48];
	int k13[48]; int k14[48]; int k15[48];
	int k16[48];

	//获得原始密钥2进制形式
	for (int i=0;i<48;i++)
	{
		if ((kchar[i] & 0x80)!=0) temp[i*8 +0] =1;
		if ((kchar[i] & 0x40)!=0) temp[i*8 +1] =1;
		if ((kchar[i] & 0x20)!=0) temp[i*8 +2] =1;
		if ((kchar[i] & 0x10)!=0) temp[i*8 +3] =1;
		if ((kchar[i] & 0x8)!=0) temp[i*8 +4] =1;
		if ((kchar[i] & 0x4)!=0) temp[i*8 +5] =1;
		if ((kchar[i] & 0x2)!=0) temp[i*8 +6] =1;
		if ((kchar[i] & 0x1)!=0) temp[i*8 +7] =1;
	}

	//去掉7。。15。。。。。63的奇校检位并打乱
	kint[0] = temp[56];
	kint[1] = temp[48];
	kint[2] = temp[40];
	kint[3] = temp[32];
	kint[4] = temp[24];
	kint[5] = temp[16];
	kint[6] = temp[8];
	kint[7] = temp[0];
	kint[8] = temp[57];
	kint[9] = temp[49];
	kint[10] = temp[41];
	kint[11] = temp[33];
	kint[12] = temp[25];
	kint[13] = temp[17];
	kint[14] = temp[9];
	kint[15] = temp[1];
	kint[16] = temp[58];
	kint[17] = temp[50];
	kint[18] = temp[42];
	kint[19] = temp[34];
	kint[20] = temp[26];
	kint[21] = temp[18];
	kint[22] = temp[10];
	kint[23] = temp[2];
	kint[24] = temp[59];
	kint[25] = temp[51];
	kint[26] = temp[43];
	kint[27] = temp[35];
	kint[28] = temp[62];
	kint[29] = temp[54];
	kint[30] = temp[46];
	kint[31] = temp[38];
	kint[32] = temp[30];
	kint[33] = temp[22];
	kint[34] = temp[14];
	kint[35] = temp[6];
	kint[36] = temp[61];
	kint[37] = temp[53];
	kint[38] = temp[45];
	kint[39] = temp[37];
	kint[40] = temp[29];
	kint[41] = temp[21];
	kint[42] = temp[13];
	kint[43] = temp[5];
	kint[44] = temp[60];
	kint[45] = temp[52];
	kint[46] = temp[44];
	kint[47] = temp[36];
	kint[48] = temp[28];
	kint[49] = temp[20];
	kint[50] = temp[12];
	kint[51] = temp[4];
	kint[52] = temp[27];
	kint[53] = temp[19];
	kint[54] = temp[11];
	kint[55] = temp[3];

	//分组56位密钥为2部分
	for (i=0;i<28;i++)
	{
		c0[i] = kint[i];
		d0[i] = kint[i+28];
	}

	//循环左移1位
	for (i = 1; i < 28; i++)
	{
		c1[i - 1] = c0[i];
		d1[i - 1] = d0[i];
	}
	c1[27] = c0[0];
	d1[27] = d0[0];

	//循环左移1位
	for (i = 1; i < 28; i++)
	{
		c2[i - 1] = c1[i];
		d2[i - 1] = d1[i];
	}
	c2[27] = c1[0];
	d2[27] = d1[0];

	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c3[i - 2] = c2[i];
		d3[i - 2] = d2[i];
	}
	c3[26] = c2[0];
	c3[27] = c2[1];

	d3[26] = d2[0];
	d3[27] = d2[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c4[i - 2] = c3[i];
	}
	c4[26] = c3[0];
	c4[27] = c3[1];
	for (i = 2; i < 28; i++)
	{
		d4[i - 2] = d3[i];
	}
	d4[26] = d3[0];
	d4[27] = d3[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c5[i - 2] = c4[i];
	}
	c5[26] = c4[0];
	c5[27] = c4[1];
	for (i = 2; i < 28; i++)
	{
		d5[i - 2] = d4[i];
	}
	d5[26] = d4[0];
	d5[27] = d4[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c6[i - 2] = c5[i];
	}
	c6[26] = c5[0];
	c6[27] = c5[1];
	for (i = 2; i < 28; i++)
	{
		d6[i - 2] = d5[i];
	}
	d6[26] = d5[0];
	d6[27] = d5[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c7[i - 2] = c6[i];
	}
	c7[26] = c6[0];
	c7[27] = c6[1];
	for (i = 2; i < 28; i++)
	{
		d7[i - 2] = d6[i];
	}
	d7[26] = d6[0];
	d7[27] = d6[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c8[i - 2] = c7[i];
	}
	c8[26] = c7[0];
	c8[27] = c7[1];
	for (i = 2; i < 28; i++)
	{
		d8[i - 2] = d7[i];
	}
	d8[26] = d7[0];
	d8[27] = d7[1];
	//循环左移1位
	for (i = 1; i < 28; i++)
	{
		c9[i - 1] = c8[i];
	}
	c9[27] = c8[0];
	for (i = 1; i < 28; i++)
	{
		d9[i - 1] = d8[i];
	}
	d9[27] = d8[0];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c10[i - 2] = c9[i];
	}
	c10[26] = c9[0];
	c10[27] = c9[1];
	for (i = 2; i < 28; i++)
	{
		d10[i - 2] = d9[i];
	}
	d10[26] = d9[0];
	d10[27] = d9[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c11[i - 2] = c10[i];
	}
	c11[26] = c10[0];
	c11[27] = c10[1];
	for (i = 2; i < 28; i++)
	{
		d11[i - 2] = d10[i];
	}
	d11[26] = d10[0];
	d11[27] = d10[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c12[i - 2] = c11[i];
	}
	c12[26] = c11[0];
	c12[27] = c11[1];
	for (i = 2; i < 28; i++)
	{
		d12[i - 2] = d11[i];
	}
	d12[26] = d11[0];
	d12[27] = d11[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c13[i - 2] = c12[i];
	}
	c13[26] = c12[0];
	c13[27] = c12[1];
	for (i = 2; i < 28; i++)
	{
		d13[i - 2] = d12[i];
	}
	d13[26] = d12[0];
	d13[27] = d12[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c14[i - 2] = c13[i];
	}
	c14[26] = c13[0];
	c14[27] = c13[1];
	for (i = 2; i < 28; i++)
	{
		d14[i - 2] = d13[i];
	}
	d14[26] = d13[0];
	d14[27] = d13[1];
	//循环左移2位
	for (i = 2; i < 28; i++)
	{
		c15[i - 2] = c14[i];
	}
	c15[26] = c14[0];
	c15[27] = c14[1];
	for (i = 2; i < 28; i++)
	{
		d15[i - 2] = d14[i];
	}
	d15[26] = d14[0];
	d15[27] = d14[1];
	//循环左移1位
	for (i = 1; i < 28; i++)
	{
		c16[i - 1] = c15[i];
	}
	c16[27] = c15[0];
	for (i = 1; i < 28; i++)
	{
		d16[i - 1] = d15[i];
	}
	d16[27] = d15[0];

	//合并Ci,Di并由PC2置换计算最终16个密钥
	PC2(c1, d1, k1);
	PC2(c2, d2, k2);
	PC2(c3, d3, k3);
	PC2(c4, d4, k4);
	PC2(c5, d5, k5);
	PC2(c6, d6, k6);
	PC2(c7, d7, k7);
	PC2(c8, d8, k8);
	PC2(c9, d9, k9);
	PC2(c10, d10, k10);
	PC2(c11, d11, k11);
	PC2(c12, d12, k12);
	PC2(c13, d13, k13);
	PC2(c14, d14, k14);
	PC2(c15, d15, k15);
	PC2(c16, d16, k16);

	memcpy(keyreturn[0], k1, sizeof(k1));
	memcpy(keyreturn[1], k2, sizeof(k1));
	memcpy(keyreturn[2], k3, sizeof(k1));	
	memcpy(keyreturn[3], k4, sizeof(k1));
	memcpy(keyreturn[4], k5, sizeof(k1));
	memcpy(keyreturn[5], k6, sizeof(k1));	
	memcpy(keyreturn[6], k7, sizeof(k1));
	memcpy(keyreturn[7], k8, sizeof(k1));
	memcpy(keyreturn[8], k9, sizeof(k1));
	memcpy(keyreturn[9], k10, sizeof(k1));
	memcpy(keyreturn[10], k11, sizeof(k1));	
	memcpy(keyreturn[11], k12, sizeof(k1));
	memcpy(keyreturn[12], k13, sizeof(k1));
	memcpy(keyreturn[13], k14, sizeof(k1));	
	memcpy(keyreturn[14], k15, sizeof(k1));
	memcpy(keyreturn[15], k16, sizeof(k1));
}

//PC2置换
void DES::PC2(int c[28], int d[28], int k[48])
{
	int temp[56];

	//合并Ci和Di
	for (int i = 0; i < 28; i++)
	{
		temp[i] = c[i];
		temp[i + 28] = d[i];
	}

	//置换表
	k[0] = temp[13];
	k[1] = temp[16];
	k[2] = temp[10];
	k[3] = temp[23];
	k[4] = temp[0];
	k[5] = temp[4];
	k[6] = temp[2];
	k[7] = temp[27];
	k[8] = temp[14];
	k[9] = temp[5];
	k[10] = temp[20];
	k[11] = temp[9];
	k[12] = temp[22];
	k[13] = temp[18];
	k[14] = temp[11];
	k[15] = temp[3];
	k[16] = temp[25];
	k[17] = temp[7];
	k[18] = temp[15];
	k[19] = temp[6];
	k[20] = temp[26];
	k[21] = temp[19];
	k[22] = temp[12];
	k[23] = temp[1];
	k[24] = temp[40];
	k[25] = temp[51];
	k[26] = temp[30];
	k[27] = temp[36];
	k[28] = temp[46];
	k[29] = temp[54];
	k[30] = temp[29];
	k[31] = temp[39];
	k[32] = temp[50];
	k[33] = temp[44];
	k[34] = temp[32];
	k[35] = temp[47];
	k[36] = temp[43];
	k[37] = temp[48];
	k[38] = temp[38];
	k[39] = temp[55];
	k[40] = temp[33];
	k[41] = temp[52];
	k[42] = temp[45];
	k[43] = temp[41];
	k[44] = temp[49];
	k[45] = temp[35];
	k[46] = temp[28];
	k[47] = temp[31];
}

void DES::E(int r[], int AfterE[48])
{
	int i;

	AfterE[0] = r[31];
	for (i = 1; i <= 5; i++)
	{
		AfterE[i] = r[i - 1];
	}
	for (i = 6; i <= 11; i++)
	{
		AfterE[i] = r[i - 3];
	}
	for (i = 12; i <= 17; i++)
	{
		AfterE[i] = r[i - 5];
	}
	for (i = 18; i <= 23; i++)
	{
		AfterE[i] = r[i - 7];
	}
	for (i = 24; i <= 29; i++)
	{
		AfterE[i] = r[i - 9];
	}
	for (i = 30; i <= 35; i++)
	{
		AfterE[i] = r[i - 11];
	}
	for (i = 36; i <= 41; i++)
	{
		AfterE[i] = r[i - 13];
	}
	for (i = 42; i <= 46; i++)
	{
		AfterE[i] = r[i - 15];
	}
	AfterE[47] = r[0];
}

//f函数
void DES::f(int r[], int k[], int greturn[32])
{
	int afterE[48];
	E(r, afterE);//将明文进行E拓展

	//E拓展后明文分6组的初始化
	int m1[6]; int m4[6]; int m7[6];
	int m2[6]; int m5[6]; int m8[6];
	int m3[6]; int m6[6];
	//明文经过S盒后存放数组初始化

⌨️ 快捷键说明

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