📄 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 + -