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

📄 des.h

📁 DES查分攻击源代码
💻 H
字号:
///////////////////////////////////////////////////////////////////////
//File       :Des.h
//Author     :郭瑞杰
//Description:DES加密解密
//Data       :2004.4.1
//Mail       :guonanm@mails.gscas.ac.cn
//你可以任意修改复制传播此源码,但不得用于商业用途。如果你修改了此源码,
//请给我发一份。谢谢!
///////////////////////////////////////////////////////////////////////
#pragma once

static const char ETable[][6] =
{
	{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}
};

static const char IPTable[][8] = 
{
	{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}	
};
static const char IPInvertTable[][8] = 
{
	{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}	
};
static const char PTable[][4] =
{
	{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}
};

static const char SBOXTable[8][4][16] = 
{
	// 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}
	}
};

static const char PC1Table[][7]=
{	
	{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}
};
static const char PC2Table[][8] = 
{
	{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 const char I_ShiftTable[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};


class CDes
{
public:
	CDes(void);
	CDes(int nRound);
	~CDes(void);

public:
	bool Encrypt(char *pDest,char *pSrc,const int nLen,char* pKey,const int nKeyLen);
	bool Decode(char *pDest,char *pSrc,const int nLen,char* pKey,const int nKeyLen);

	bool Encrypt(bool bCryptograph[64],const bool bPlaintext[64],const bool bKey[64]);
protected:			

	bool Encrypt(char cry[8],const char plaintext[8],const char key[8]);

	bool Decode(bool bPlaintext[64],const bool bCryptograph[64],const bool bKey[64]);
	bool Decode(char plaintext[8],const char cry[8],const char key[8]);
protected:
	//IP置换
	void IP(bool bDest[64],const bool bSrc[64]);
	//IP逆置换
	void IPInvert(bool bDest[64],const bool bSrc[64]);

	//复杂函数
	void Fk(bool bDest[32],const bool bSrc[32],const bool bKey[48]);
	//扩展
	void Expansion(bool bDest[48],const bool bSrc[32]);
	void S_BOX(bool bDest[32],bool bSrc[48]);
	//P置换
	void P(bool bDest[32],const bool bSrc[32]);
	
	//密钥置换1
	void PC1(bool bDest[56],const bool bSrc[64]);
	//密钥置换2
	void PC2(bool bDest[48],const bool bSrc[56]);

	void GetSubKey(bool bSubKey[48],const int nRound);
	//生成子密钥
	bool ProduceKey(const bool bKey[64]);
public:
	//字节到位
	void ByteToBit(bool *Out, const char *In, int bits);
	//位到字节
	void BitToByte(char *Out, const bool *In, int bits);
	//循环左移
	void RotateL(bool *In, int len, int loop);

	//异或
	void Xor(bool *pbDest, const bool *pbSrc, int len);
protected:	
	bool m_SubKey[16][48];         //16轮48位子密钥
	int  m_nRound;                 //轮
};

⌨️ 快捷键说明

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