📄 encrypt.h
字号:
// Type—ENCRYPT:加密,DECRYPT:解密
// 输出缓冲区(Out)的长度 >= ((datalen+7)/8)*8,即比datalen大的且是8的倍数的最小正整数
// In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容
// 当keylen>8时系统自动使用3次DES加/解密,否则使用标准DES加/解密.超过16字节后只取前16字节
/*
CString str;
GetDlgItem(IDC_ENCRYPT)->GetWindowText(str);
char encrypt[50]={0};
memcpy(encrypt,str,str.GetLength());
char key[16]={0};
CEncrypt encrypt_str;
encrypt_str.Rand_key(key);随机生成密钥,16字节
encrypt_str.Des_Go(encrypt, encrypt, sizeof(encrypt), key, sizeof(key), ENCRYPT);加密
str = encrypt;
GetDlgItem(IDC_ENCRYPTED)->SetWindowText(str);
encrypt_str.Des_Go(encrypt, encrypt, sizeof(encrypt), key, sizeof(key), DECRYPT);解密
str = encrypt;
GetDlgItem(IDC_DECRYPT)->SetWindowText(str);
*/
#pragma once
enum {ENCRYPT,DECRYPT};
typedef bool (*PSubKey)[16][48];
class CEncrypt
{
public:
CEncrypt(void);
~CEncrypt(void);
bool Des_Go(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);
void Rand_key(char key[16]);
public:
void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准DES加/解密
void SetKey(const char* Key, int len);// 设置密钥
void SetSubKey(PSubKey pSubKey, const char Key[8]);// 设置子密钥
void F_func(bool In[32], const bool Ki[48]);// f 函数
void S_func(bool Out[32], const bool In[48]);// S 盒代替
void Transform(bool *Out, bool *In, const char *Table, int len);// 变换
void Xor(bool *InA, const bool *InB, int len);// 异或
void RotateL(bool *In, int len, int loop);// 循环左移
void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组
void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组
bool SubKey[2][16][48];// 16圈子密钥
bool Is3DES;// 3次DES标志
char Tmp[256], deskey[16];
char IP_Table[64];// initial permutation IP
char IPR_Table[64];// final permutation IP^-1
char E_Table[48];// expansion operation matrix
char P_Table[32];// 32-bit permutation function P used on the output of the S-boxes
char PC1_Table[56];// permuted choice table (key)
char PC2_Table[48];// permuted choice key (table)
char LOOP_Table[16];// number left rotations of pc1
bool Des_GoFile(const CString& strFilePath,char *MyKey,BOOL isEncrypt);//根据文件路径名进行加密
bool Des_GoFile(CFile& File,char *MyKey,BOOL isEncrypt); //根据文件句柄进行加密
};
// The (in)famous S-boxes
const static char S_Box[8][4][16] = {
// S1
4, 14, 13, 11, 12, 5, 1, 8, 13, 1, 6, 12, 5, 9, 10, 7,
0, 15, 7, 4, 14, 12, 13, 1, 0, 6, 12, 11, 9, 5, 13, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 12, 4, 9, 1, 7, 5, 1, 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, 3, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 14, 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, 10, 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, 11, 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, 10, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 10, 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, 10, 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, 12, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 11, 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, 14, 10, 7, 9, 15, 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, 10, 14, 9, 2,
7, 11, 4, 11, 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
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -