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

📄 encrypt.cpp

📁 对文件进行加密的小源代码,其中有在一进程中启动另一进程等
💻 CPP
字号:
#include "StdAfx.h"
#include ".\encrypt.h"
#include "ThemidaSDK.h"


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

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

	E_Table[0] = 32,  E_Table[1] = 1,  E_Table[2] = 2,  E_Table[3] = 3,  E_Table[4] = 4,  E_Table[5] = 5,  E_Table[6] = 4,  E_Table[7] = 5,  E_Table[8] = 6,  E_Table[9] = 7,  E_Table[10] = 8,  E_Table[11] = 9,
	E_Table[12] = 8,  E_Table[13] = 9, E_Table[14] = 10, E_Table[15] = 11, E_Table[16] = 12, E_Table[17] = 13, E_Table[18] = 12, E_Table[19] = 13, E_Table[20] = 14, E_Table[21] = 15, E_Table[22] = 16, E_Table[23] = 17,
	E_Table[24] = 16, E_Table[25] = 17, E_Table[26] = 18, E_Table[27] = 19, E_Table[28] = 20, E_Table[29] = 21, E_Table[30] = 20, E_Table[31] = 21, E_Table[32] = 22, E_Table[33] = 23, E_Table[34] = 24, E_Table[35] = 25,
	E_Table[36] = 24, E_Table[37] = 25, E_Table[38] = 26, E_Table[39] = 27, E_Table[40] = 28, E_Table[41] = 29, E_Table[42] = 28, E_Table[43] = 29, E_Table[44] = 30, E_Table[45] = 31, E_Table[46] = 32,  E_Table[47] = 1;

	P_Table[0] =16, P_Table[1] = 7, P_Table[2] = 20, P_Table[3] = 21, P_Table[4] = 29,  P_Table[5] =12,  P_Table[6] =28,  P_Table[7] =17, P_Table[8] = 1, P_Table[9] =  15, P_Table[10] = 23, P_Table[11] = 26, P_Table[12] = 5,  P_Table[13] = 18, P_Table[14] = 31, P_Table[15] = 10,
    P_Table[16] =2,  P_Table[17] = 8, P_Table[18] = 24, P_Table[19] = 14, P_Table[20] = 32, P_Table[21] = 27, P_Table[22] = 3, P_Table[23] =  9, P_Table[24] =  19, P_Table[25] = 13, P_Table[26] = 30, P_Table[27] = 6,  P_Table[28] = 22, P_Table[29] = 11, P_Table[30] = 4,  P_Table[31] = 25;

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

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

	LOOP_Table[0] = 1,LOOP_Table[1] = 1,LOOP_Table[2] = 2,LOOP_Table[3] = 2,LOOP_Table[4] = 2,LOOP_Table[5] = 2,LOOP_Table[6] = 2,LOOP_Table[7] = 2,LOOP_Table[8] = 1,LOOP_Table[9] = 2,LOOP_Table[10] = 2,LOOP_Table[11] = 2,LOOP_Table[12] = 2,LOOP_Table[13] = 2,LOOP_Table[14] = 2,LOOP_Table[15] = 1;
    VM_END
}

CEncrypt::~CEncrypt(void)
{
}

void CEncrypt::Rand_key(char key[16])
{
	VM_START_WITHLEVEL(23)
	srand((unsigned)time(NULL));
	for(int i=0; i<16; ++i)
	{
		key[i] = rand() & 0x7F;
	}
	VM_END
}

bool CEncrypt::Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)
{
	VM_START_WITHLEVEL(20)
    if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) ) 
		return false;
	SetKey(Key, keylen);
	if( !Is3DES ) {   // 1次DES
		for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)
			DES(Out, In, &SubKey[0], Type);
	} else{   // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)
		for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {
			DES(Out, In,  &SubKey[0], Type);
			DES(Out, Out, &SubKey[1], !Type);
			DES(Out, Out, &SubKey[0], Type);
		}
	}
	VM_END
	return true;
}

void CEncrypt::SetKey(const char* Key, int len)
{
	VM_START_WITHLEVEL(19)
	memset(deskey, 0, 16);
	memcpy(deskey, Key, len>16?16:len);
	SetSubKey(&SubKey[0], &deskey[0]);
	Is3DES = len>8 ? (SetSubKey(&SubKey[1], &deskey[8]), true) : false;
	VM_END
}

void CEncrypt::DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)
{
	VM_START_WITHLEVEL(18)
    static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];
    ByteToBit(M, In, 64);
    Transform(M, M, IP_Table, 64);
    if( Type == ENCRYPT ){
        for(int i=0; i<16; ++i) {
            memcpy(tmp, Ri, 32);
            F_func(Ri, (*pSubKey)[i]);
            Xor(Ri, Li, 32);
            memcpy(Li, tmp, 32);
        }
    }else{
        for(int i=15; i>=0; --i) {
            memcpy(tmp, Li, 32);
            F_func(Li, (*pSubKey)[i]);
            Xor(Li, Ri, 32);
            memcpy(Ri, tmp, 32);
        }
	}
    Transform(M, M, IPR_Table, 64);
    BitToByte(Out, M, 64);
    VM_END
}
void CEncrypt::SetSubKey(PSubKey pSubKey, const char Key[8])
{
	VM_START_WITHLEVEL(22)
    static bool K[64], *KL=&K[0], *KR=&K[28];
    ByteToBit(K, Key, 64);
    Transform(K, K, PC1_Table, 56);
    for(int i=0; i<16; ++i)
	{
        RotateL(KL, 28, LOOP_Table[i]);
        RotateL(KR, 28, LOOP_Table[i]);
        Transform((*pSubKey)[i], K, PC2_Table, 48);
    }
	VM_END
}
void CEncrypt::F_func(bool In[32], const bool Ki[48])
{
	VM_START_WITHLEVEL(21)
    static bool MR[48];
    Transform(MR, In, E_Table, 48);
    Xor(MR, Ki, 48);
    S_func(In, MR);
    Transform(In, In, P_Table, 32);
	VM_END
}
void CEncrypt::S_func(bool Out[32], const bool In[48])
{
	VM_START_WITHLEVEL(20)
    for(char i=0,j,k; i<8; ++i,In+=6,Out+=4) 
	{
        j = (In[0]<<1) + In[5];
        k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];
		ByteToBit(Out, &S_Box[i][j][k], 4);
    }
	VM_END
}
void CEncrypt::Transform(bool *Out, bool *In, const char *Table, int len)
{
	VM_START_WITHLEVEL(19)
    for(int i=0; i<len; ++i)
        Tmp[i] = In[ Table[i]-1 ];
    memcpy(Out, Tmp, len);
	VM_END
}
void CEncrypt::Xor(bool *InA, const bool *InB, int len)
{
	VM_START_WITHLEVEL(23)
    for(int i=0; i<len; ++i)
        InA[i] ^= InB[i];
	VM_END
}
void CEncrypt::RotateL(bool *In, int len, int loop)
{
	VM_START_WITHLEVEL(30)
    memcpy(Tmp, In, loop);
    memcpy(In, In+loop, len-loop);
    memcpy(In+len-loop, Tmp, loop);
	VM_END
}
void CEncrypt::ByteToBit(bool *Out, const char *In, int bits)
{
	VM_START_WITHLEVEL(28)
    for(int i=0; i<bits; ++i)
        Out[i] = (In[i>>3]>>(i&7)) & 1;
	VM_END
}
void CEncrypt::BitToByte(char *Out, const bool *In, int bits)
{
	VM_START_WITHLEVEL(29)
    memset(Out, 0, bits>>3);
    for(int i=0; i<bits; ++i)
        Out[i>>3] |= In[i]<<(i&7);
	VM_END
}
//根据文件的路径进行加密解密
bool CEncrypt::Des_GoFile(const CString& strFilePath,char *MyKey,BOOL isEncrypt)
{
	//CFile File(strFilePath, CFile::shareDenyNone);
	CFile File;
	File.Open(strFilePath,CFile::modeReadWrite);
    Des_GoFile(File,MyKey,isEncrypt);
	return true;
}
//根据文件对象进行加密解密
bool CEncrypt::Des_GoFile(CFile& File,char *MyKey,BOOL isEncrypt)
{
	CString str="";
	CString midStr="";
	char Buffer[1000000]={0};
	try
	{
        UINT length;
		length =(UINT)File.GetLength();
		File.Read( Buffer, length);

		if(isEncrypt==0)
		{
			//Des_Go((char *)Buffer,(char *)Buffer ,length, MyKey, 16, ENCRYPT);
            for(int i=0;i<length;i++)
			{
				Buffer[i]=Buffer[i]-1;
			}
		}
		else
		{
			//Des_Go((char *)Buffer,(char *)Buffer ,length, MyKey, 16, ENCRYPT);
            for(int i=0;i<length;i++)
			{
				Buffer[i]=Buffer[i]+1;
			}
		}
        
		File.SeekToBegin();
		File.Write(Buffer,length);
		File.Close();
	}

	//report any file exceptions in debug mode only
	catch (CFileException* e )
	{
		TRACE0(" CFileException caught"); 
		throw e;
	}
}

⌨️ 快捷键说明

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