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

📄 encrypt.h

📁 对文件进行加密的小源代码,其中有在一进程中启动另一进程等
💻 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 + -