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

📄 dmsecurity.cpp

📁 加密解密组建支持RC4
💻 CPP
字号:
// DMSecurity.cpp : 定义 DLL 的初始化例程。
//nstorm at 2007-3-26

#include "stdafx.h"
#include "DMSecurity.h"
#include ".\dmsecurity.h"
#include "stdio.h"
//
//#ifdef _DEBUG
//#define new DEBUG_NEW
//#endif


//
//	注意!
//
//		如果此 DLL 动态链接到 MFC
//		DLL,从此 DLL 导出并
//		调入 MFC 的任何函数在函数的最前面
//		都必须添加 AFX_MANAGE_STATE 宏。
//
//		例如:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// 此处为普通函数体
//		}
//
//		此宏先于任何 MFC 调用
//		出现在每个函数中十分重要。这意味着
//		它必须作为函数中的第一个语句
//		出现,甚至先于所有对象变量声明,
//		这是因为它们的构造函数可能生成 MFC
//		DLL 调用。
//
//		有关其他详细信息,
//		请参阅 MFC 技术说明 33 和 58。
//

// CDMSecurityApp
//
//BEGIN_MESSAGE_MAP(CDMSecurity, CWinApp)
//END_MESSAGE_MAP()


// CDMSecurityApp 构造

CDMSecurity::CDMSecurity()
{
	// TODO: 在此处添加构造代码,
	// 将所有重要的初始化放置在 InitInstance 中
}

CDMSecurity::~CDMSecurity()
{
	// TODO: 在此处添加构造代码,
	// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CDMSecurity对象

//CDMSecurity theApp;


// CDMSecurityApp 初始化

//BOOL CDMSecurity::InitInstance()
//{
//	CWinApp::InitInstance();
//	return TRUE;
//}


bool CDMSecurity::EncryptRC4File(LPCTSTR resourceFile, LPCTSTR outFile, char* pwd)
{
	//try
	//{
		if(resourceFile==""||outFile=="")
			return false;
		CFileFind ff;
		BOOL bContinue = ff.FindFile(resourceFile);
		if(!bContinue)
		{
			return false;
		}
		int endlen=10;
		int j=0,i=0;
		char *End;
		long filelen;
		int t,keylen;
		BYTE Y;
		char *keys;
		BYTE s[256];
		CFile* fs;
		keys=GetKey(pwd);
		for(i=0;i<256;i++)
		{
			s[i]=i;
		}
		fs=new CFile(resourceFile,CFile::modeRead|CFile::typeBinary);
		filelen=fs->GetLength();
		End=new char[endlen];
		BYTE *inputByteArray;
		inputByteArray =new BYTE[filelen+endlen];
		fs->Read(inputByteArray,filelen);
		fs->Close();
		delete fs;
		if(filelen>endlen)
		{
			for(i=0;i<endlen;i++)
			{
				End[i]=inputByteArray[filelen-endlen+i];
			}
			CString str=CString(End);
			if(str.Left(endlen)==":nstormencrypt")
			{
				CopyFile(resourceFile,outFile,true);
				delete End;
				delete inputByteArray;
				delete keys;
				return true;
			}
		}
		keylen=strlen(keys);
		for(i=0;i<255;i++)
		{
			j=(j+s[i]+keys[i%keylen])%256;
			Swap(s[i],s[j]);
		}
		j=0;
		i=0;
		for(int x=0;x<filelen;x++)
		{
			i = (i + 1) % 256;
			j = (j + s[i]) % 256 ;
			Swap(s[i],s[j]);
			t = (s[i] + (s[j] % 256))% 256 ;
			Y = s[t]; 
			inputByteArray[x]=(BYTE)(inputByteArray[x]^Y);
		}
		End=":nstormencrypt";
		for(i=0;i<strlen(End);i++)
		{
			inputByteArray[filelen+i]=End[i];
		}
		fs=new CFile(outFile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
		fs->Write(inputByteArray,filelen+endlen);
		fs->Close();
		delete fs;
		delete End;
		delete inputByteArray;
		return true;
	//}
	//catch(...)
	//{
	//	return false;
	//}
}


bool CDMSecurity::DecryptRC4File(LPCTSTR resourceFile, LPCTSTR outFile, char* pwd)
{
	//try
	//{
		if(resourceFile==""||outFile=="")
			return false;
		CFileFind ff;
		BOOL bContinue = ff.FindFile(resourceFile);
		if(!bContinue)
		{
			return false;
		}
		int endlen=10;
		int j=0,i=0;
		char *End;
		long filelen;
		int t,keylen;
		BYTE Y;
		char *keys;
		BYTE s[256];
		CFile* fs;
		keys=GetKey(pwd);
		for(i=0;i<256;i++)
		{
			s[i]=i;
		}
		fs=new CFile(resourceFile,CFile::modeRead|CFile::typeBinary);
		filelen=fs->GetLength();
		End=new char[endlen];
		BYTE *inputByteArray;
		inputByteArray =new BYTE[filelen];
		fs->Read(inputByteArray,filelen);
		fs->Close();
		delete fs;
		if(filelen>endlen)
		{
			for(i=0;i<endlen;i++)
			{
				End[i]=inputByteArray[filelen-endlen+i];
			}
			CString str=CString(End);
			if(str.Left(endlen)!=":nstormencrypt")
			{
				CopyFile(resourceFile,outFile,true);
				delete End;
				delete inputByteArray;
				return true;
			}
		}
		keylen=strlen(keys);
		for(i=0;i<255;i++)
		{
			j=(j+s[i]+keys[i%keylen])%256;
			Swap(s[i],s[j]);
		}
		j=0;
		i=0;
		for(int x=0;x<filelen-endlen;x++)
		{
			i = (i + 1) % 256;
			j = (j + s[i]) % 256 ;
			Swap(s[i],s[j]);
			t = (s[i] + (s[j] % 256))% 256 ;
			Y = s[t]; 
			inputByteArray[x]=(BYTE)(inputByteArray[x]^Y);
		}
		fs=new CFile(outFile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
		fs->Write(inputByteArray,filelen-endlen);
		fs->Close();
		delete fs;
		delete End;
		delete inputByteArray;
		return true;
	//}
	//catch(...)
	//{
	//	return false;
	//}
}


void CDMSecurity::Swap(BYTE b1, BYTE b2)
{
	BYTE temp;
	temp=b1;
	b1=b2;
	b2=temp;
}


char *CDMSecurity::GetKey(char *pwd)
{
	if(pwd==NULL||pwd=="")
		pwd="nstorm2#password$";
	return pwd;
}

char * CDMSecurity::DecryptRC4String(char * inputString, char * pwd)
{
	int j=0,i=0;
	long instrlen;
	int t,keylen;
	BYTE Y;
	char *keys;
	BYTE s[256];
	keys=GetKey(pwd);
	keylen=strlen(keys);
	for(i=0;i<255;i++)
	{
		j=(j+s[i]+keys[i%keylen])%256;
		Swap(s[i],s[j]);
	}
	j=0;
	i=0;
	instrlen=(CString(inputString)).GetLength();
	for(int x=0;x<instrlen;x++)
	{
		i = (i + 1) % 256;
		j = (j + s[i]) % 256 ;
		Swap(s[i],s[j]);
		t = (s[i] + (s[j] % 256))% 256 ;
		Y = s[t]; 
		inputString[x]=(BYTE)(inputString[x]^Y);
	}
	delete keys;
	return inputString;
}

char * CDMSecurity::EncryptRC4String(char * inputString, char * pwd)
{
	return DecryptRC4String(inputString,pwd);
}

int CDMSecurity::FileIsEncrypted(LPCTSTR filePath)
{
	//try
	//{
		if(filePath==""||filePath=="")
			return false;
		CFileFind ff;
		BOOL bContinue = ff.FindFile(filePath);
		if(!bContinue)
		{
			return false;
		}
		char * End;
		int endlen=10;
		long filelen;
		CFile* fs;
		int i;
		fs=new CFile(filePath,CFile::modeRead|CFile::typeBinary);
		filelen=fs->GetLength();
		End=new char[endlen];
		BYTE *inputByteArray;
		inputByteArray =new BYTE[filelen];
		fs->Read(inputByteArray,filelen);
		fs->Close();
		delete fs;
		if(filelen>endlen)
		{
			for(i=0;i<endlen;i++)
			{
				End[i]=inputByteArray[filelen-endlen+i];
			}
			CString str=CString(End);
			if(str.Left(endlen)==":nstormencrypt")
			{
				delete End;
				delete inputByteArray;
				return true;
			}
		}
		delete End;
		delete inputByteArray;
		return false;
	//}
	//catch(...)
	//{
	//	return false;
	//}
}

⌨️ 快捷键说明

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