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

📄 warpdll.cpp

📁 应用编码与计算机密码学program 《应用编码与计算机密码学》程序 单钥密码算法DES算法
💻 CPP
字号:
//warpdll.cpp
//Update:2001.8.19
//#include <windows.h>
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes
#include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls
#include <process.h>
#include <stdlib.h>
#include <time.h>
#include "warpdll.h"
#include "des.h"	

#define DllVersion 0x20002

#define Info0 0x420a54e2
#define Info1 0x1e5e8765
#define Info2 0x0b548de4
#define Info3 0x81ad578e
#define Info4 0x13e69d5d
#define Info5 0x481e250a
#define Info6 0xf4d8fa3c

#define TempFileName "temp0215.tmp"
#define BufferGroup 1024

BOOL WINAPI DllEntryPoint(HINSTANCE hDLL,DWORD dwReason,LPVOID Reserved)
{
	switch(dwReason)
	{
		case DLL_PROCESS_ATTACH:
        // Perform any DLL initialization here
        break;

		case DLL_PROCESS_DETACH:
        // Perform any DLL cleanup here
		break;

    }
	return TRUE;
}

EXPORTDLL long CALLBACK Encrypt(PPARAMS pparams)
{
	_beginthread(Enc_Thread,0,pparams);
	return pparams->statue;
}

EXPORTDLL long CALLBACK Decrypt(PPARAMS pparams)
{
	_beginthread(Dec_Thread,0,pparams);
	return pparams->statue;
}

EXPORTDLL long CALLBACK DES_ENC(DWORD* LData,DWORD* RData,
								DWORD* LKey,DWORD* RKey)
{
	desenc(*LData,*RData,*LKey,*RKey);
	return 0;
}

EXPORTDLL long CALLBACK DES_DEC(DWORD* LData,DWORD* RData,
								DWORD* LKey,DWORD* RKey)
{
	desdec(*LData,*RData,*LKey,*RKey);
	return 0;
}

void InitKeys(CString& KeyString,DWORD* key)
{
	int counter[8]={0,0,0,0,0,0,0,0};
	int max[8]={3,4,3,4,3,4,2,4};
	int i;
	for(i=0;i<KeyString.GetLength();i++)
	{
		if(counter[i&7]<max[i&7])
		{
			key[i&7]|=KeyString[i];
			counter[i&7]++;
			key[i&7]<<=8;
		}
	}
	for(i=0;i<6;i++)
	{
		key[i]>>=4;
		key[i]|=key[i+1]>>28;
		key[++i]>>=4;
	}
	key[6]>>=8;
	key[7]>>=8;
}

#define enc(LData,RData,cmpkey1,cmpkey2,cmpkey3) \
	fast_desenc(LData,RData,cmpkey1);\
	fast_desdec(LData,RData,cmpkey2);\
	fast_desenc(LData,RData,cmpkey3);\

#define dec(LData,RData,cmpkey1,cmpkey2,cmpkey3) \
	fast_desdec(LData,RData,cmpkey3);\
	fast_desenc(LData,RData,cmpkey2);\
	fast_desdec(LData,RData,cmpkey1);\

void __cdecl Enc_Thread(PVOID pvoid)
{
	PPARAMS pparams;
	FILEHEAD filehead;
	DWORD key[8]={0,0,0,0,0,0,0,0};
	CFile SourceFile,TargetFile;
	DWORD FBReg1,FBReg2;
	DWORD buffer[BufferGroup];
	DWORD lFilelength;
	DWORD BufferSize=sizeof(buffer);
	DWORD i,j,Blocks,Tail,TailGroup;
	CString szSourceFile;
	_int64 cmpkey1[16];
	_int64 cmpkey2[16];
	_int64 cmpkey3[16];

	pparams=(PPARAMS)pvoid;
	if(pparams->szFilename.IsEmpty())
	{
		pparams->statue=S_FILE_NAME_EMPTY;
		pparams->iCompletePercent=100;
		_endthread();
	}
	szSourceFile=pparams->szFilename;
	if(!SourceFile.Open(szSourceFile,
		CFile::modeReadWrite|CFile::shareDenyRead|
		CFile::shareDenyWrite,NULL))
	{
		pparams->statue=S_FILE_OPEN_ERROR;
		pparams->iCompletePercent=100;
		_endthread();
	}
	lFilelength=SourceFile.GetLength();
	Tail=lFilelength&(BufferSize-1);
	Blocks=lFilelength/BufferSize;
	if(!TargetFile.Open(TEXT(TempFileName),
		CFile::modeCreate|CFile::modeWrite|
		CFile::shareDenyRead|CFile::shareDenyWrite,NULL))
	{
		SourceFile.Close();
		pparams->statue=S_FILE_OPEN_ERROR;
		pparams->iCompletePercent=100;
		_endthread();
	}
	InitKeys(pparams->Key,key);
	if(isweakkey(key[0],key[1])||isweakkey(key[2],key[3])
		||isweakkey(key[4],key[5]))
	{
		SourceFile.Close();
		TargetFile.Close();
		TargetFile.Remove(TempFileName);
		pparams->statue=S_WEAK_KEY;
		pparams->iCompletePercent=100;
		_endthread();
	}
	rebuild_s_box(key[6],key[7]);
	init_enc_cmpkeys(key[0],key[1],cmpkey1);
	init_dec_cmpkeys(key[2],key[3],cmpkey2);
	init_enc_cmpkeys(key[4],key[5],cmpkey3);
	//Init filehead.
	time_t t;
	srand((unsigned)time(&t));
	filehead.Version=DllVersion;
	filehead.IV1=rand();
	filehead.IV2=rand();
	filehead.CheckInfo[0]=Info0;
	filehead.CheckInfo[1]=Info1;
	filehead.CheckInfo[2]=Info2;
	filehead.CheckInfo[3]=Info3;
	filehead.CheckInfo[4]=Info4;
	filehead.CheckInfo[5]=Info5;
	filehead.CheckInfo[6]=Info6;
	filehead.Tail=Tail;

	filehead.CheckInfo[0]^=filehead.IV1;
	filehead.CheckInfo[1]^=filehead.IV2;
	enc(filehead.CheckInfo[0],filehead.CheckInfo[1],
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[2]^=filehead.CheckInfo[0];
	filehead.CheckInfo[3]^=filehead.CheckInfo[1];
	enc(filehead.CheckInfo[2],filehead.CheckInfo[3],
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[4]^=filehead.CheckInfo[2];
	filehead.CheckInfo[5]^=filehead.CheckInfo[3];
	enc(filehead.CheckInfo[4],filehead.CheckInfo[5],
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[6]^=filehead.CheckInfo[4];
	filehead.Tail^=filehead.CheckInfo[5];
	enc(filehead.CheckInfo[6],filehead.Tail,
		cmpkey1,cmpkey2,cmpkey3);
	TargetFile.Write(&filehead,sizeof(filehead));
	//
	FBReg1=filehead.CheckInfo[6];
	FBReg2=filehead.Tail;
	for(j=0;j<Blocks;j++)
	{
		SourceFile.Read(buffer,BufferSize);
		buffer[0]^=FBReg1;
		buffer[1]^=FBReg2;
		enc(buffer[0],buffer[1],cmpkey1,cmpkey2,cmpkey3);
		for(i=2;i<BufferGroup;++i,++i)
		{
			buffer[i]^=buffer[i-2];
			buffer[i+1]^=buffer[i-1];
			enc(buffer[i],buffer[i+1],cmpkey1,cmpkey2,
				cmpkey3);
		}
		FBReg1=buffer[i-2];
		FBReg2=buffer[i-1];
		TargetFile.Write(buffer,BufferSize);
		if(pparams->bHalt)
		{
			for(i=0;i<16;i++)
			{
				cmpkey1[i]=0;
				cmpkey2[i]=0;
				cmpkey3[i]=0;
			}
			reset_s_box();
			SourceFile.Close();
			TargetFile.Close();
			TargetFile.Remove(TEXT(TempFileName));
			pparams->iCompletePercent=100;
			_endthread();
		}
		pparams->iCompletePercent=j*100/Blocks;
	}
	//Tail
	if(Tail!=0)
	{
		SourceFile.Read(buffer,BufferSize);
		buffer[0]^=FBReg1;
		buffer[1]^=FBReg2;
		enc(buffer[0],buffer[1],cmpkey1,cmpkey2,cmpkey3);
		TailGroup=((Tail>>3)+1)<<1;
		for(i=2;i<TailGroup;++i,++i)
		{
			buffer[i]^=buffer[i-2];
			buffer[i+1]^=buffer[i-1];
			enc(buffer[i],buffer[i+1],cmpkey1,cmpkey2,
				cmpkey3);
		}
		TargetFile.Write(buffer,TailGroup<<2);
	}
	//Destory SourceFile
	for(j=0;j<BufferGroup;j++)
		buffer[j]=0;
	for(j=0;j<Blocks;j++)
		SourceFile.Write(buffer,BufferSize);
	if(Tail!=0)
		SourceFile.Write(buffer,Tail);
	//
	for(i=0;i<16;i++)
	{
		cmpkey1[i]=0;
		cmpkey2[i]=0;
		cmpkey3[i]=0;
	}
	reset_s_box();
	SourceFile.Close();
	TargetFile.Close();
	SourceFile.Remove(szSourceFile);
	TargetFile.Rename(TempFileName,szSourceFile);
	pparams->statue=S_ALL_RIGHT;
	pparams->iCompletePercent=100;
	_endthread();
}

void __cdecl Dec_Thread(PVOID pvoid)
{
	PPARAMS pparams;
	FILEHEAD filehead;
	DWORD key[8]={0,0,0,0,0,0,0,0};
	CFile SourceFile,TargetFile;
	DWORD FBReg1,FBReg2,FBReg3,FBReg4;
	DWORD buffer[BufferGroup];
	DWORD lFilelength;
	DWORD BufferSize=sizeof(buffer);
	DWORD i,j,Blocks,Tail,TailGroup;
	CString szSourceFile;
	_int64 cmpkey1[16];
	_int64 cmpkey2[16];
	_int64 cmpkey3[16];

	pparams=(PPARAMS)pvoid;
	if(pparams->szFilename.IsEmpty())
	{
		pparams->statue=S_FILE_NAME_EMPTY;
		pparams->iCompletePercent=100;
		_endthread();
	}
	szSourceFile=pparams->szFilename;
	if(!SourceFile.Open(szSourceFile,
		CFile::modeReadWrite|CFile::shareDenyRead|
		CFile::shareDenyWrite,NULL))
	{
		pparams->statue=S_FILE_OPEN_ERROR;
		pparams->iCompletePercent=100;
		_endthread();
	}
	lFilelength=SourceFile.GetLength()-sizeof(filehead);
	if(lFilelength<0)
	{
		pparams->statue=S_FILE_CORRUPTED;
		pparams->iCompletePercent=100;
		_endthread();
	}
	if(!TargetFile.Open(TEXT(TempFileName),
		CFile::modeCreate|CFile::modeWrite|
		CFile::shareDenyRead|CFile::shareDenyWrite,NULL))
	{
		SourceFile.Close();
		pparams->statue=S_FILE_OPEN_ERROR;
		pparams->iCompletePercent=100;
		_endthread();
	}
	InitKeys(pparams->Key,key);
	rebuild_s_box(key[6],key[7]);
	init_dec_cmpkeys(key[0],key[1],cmpkey1);
	init_enc_cmpkeys(key[2],key[3],cmpkey2);
	init_dec_cmpkeys(key[4],key[5],cmpkey3);
	//Verify filehead.
	SourceFile.Read(&filehead,sizeof(filehead));
	if((filehead.Version)&0xffff0000!=DllVersion&0xffff0000)
	{
		for(i=0;i<16;i++)
		{
			cmpkey1[i]=0;
			cmpkey2[i]=0;
			cmpkey3[i]=0;
		}
		reset_s_box();
		SourceFile.Close();
		TargetFile.Close();
		TargetFile.Remove(TEXT(TempFileName));
		pparams->statue=S_VERSION_NOT_MATCH;
		pparams->iCompletePercent=100;
		_endthread();
	}
	FBReg1=filehead.CheckInfo[0];
	FBReg2=filehead.CheckInfo[1];
	dec(filehead.CheckInfo[0],filehead.CheckInfo[1],
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[0]^=filehead.IV1;
	filehead.CheckInfo[1]^=filehead.IV2;
	FBReg3=filehead.CheckInfo[2];
	FBReg4=filehead.CheckInfo[3];
	dec(filehead.CheckInfo[2],filehead.CheckInfo[3],
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[2]^=FBReg1;
	filehead.CheckInfo[3]^=FBReg2;
	FBReg1=FBReg3;
	FBReg2=FBReg4;
	FBReg3=filehead.CheckInfo[4];
	FBReg4=filehead.CheckInfo[5];
	dec(filehead.CheckInfo[4],filehead.CheckInfo[5],
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[4]^=FBReg1;
	filehead.CheckInfo[5]^=FBReg2;
	FBReg1=FBReg3;
	FBReg2=FBReg4;
	FBReg3=filehead.CheckInfo[6];
	FBReg4=filehead.Tail;

	dec(filehead.CheckInfo[6],filehead.Tail,
		cmpkey1,cmpkey2,cmpkey3);
	filehead.CheckInfo[6]^=FBReg1;
	filehead.Tail^=FBReg2;
	if(filehead.CheckInfo[0]!=Info0||
		filehead.CheckInfo[1]!=Info1||
		filehead.CheckInfo[2]!=Info2||
		filehead.CheckInfo[3]!=Info3||
		filehead.CheckInfo[4]!=Info4||
		filehead.CheckInfo[5]!=Info5||
		filehead.CheckInfo[6]!=Info6)
	{
		for(i=0;i<16;i++)
		{
			cmpkey1[i]=0;
			cmpkey2[i]=0;
			cmpkey3[i]=0;
		}
		reset_s_box();
		SourceFile.Close();
		TargetFile.Close();
		TargetFile.Remove(TEXT(TempFileName));
		pparams->statue=S_KEY_INCURRECT;
		pparams->iCompletePercent=100;
		_endthread();
	}
	Tail=filehead.Tail;
	Blocks=lFilelength/BufferSize;
	//
	FBReg1=FBReg3;
	FBReg2=FBReg4;
	for(j=0;j<Blocks;j++)
	{
		SourceFile.Read(buffer,BufferSize);
		FBReg3=buffer[0];
		FBReg4=buffer[1];
		dec(buffer[0],buffer[1],cmpkey1,cmpkey2,cmpkey3);
		buffer[0]^=FBReg1;
		buffer[1]^=FBReg2;
		FBReg1=FBReg3;
		FBReg2=FBReg4;
		for(i=2;i<BufferGroup;++i,++i)
		{
			FBReg3=buffer[i];
			FBReg4=buffer[i+1];
			dec(buffer[i],buffer[i+1],cmpkey1,cmpkey2,
				cmpkey3);
			buffer[i]^=FBReg1;
			buffer[i+1]^=FBReg2;
			FBReg1=FBReg3;
			FBReg2=FBReg4;
		}
		TargetFile.Write(buffer,BufferSize);
		if(pparams->bHalt)
		{
			for(i=0;i<16;i++)
			{
				cmpkey1[i]=0;
				cmpkey2[i]=0;
				cmpkey3[i]=0;
			}
			reset_s_box();
			SourceFile.Close();
			TargetFile.Close();
			TargetFile.Remove(TEXT(TempFileName));
			pparams->iCompletePercent=100;
			_endthread();
		}
		pparams->iCompletePercent=j*100/Blocks;
	}
	if(Tail!=0)
	{
		SourceFile.Read(buffer,BufferSize);
		FBReg3=buffer[0];
		FBReg4=buffer[1];
		dec(buffer[0],buffer[1],cmpkey1,cmpkey2,cmpkey3);
		buffer[0]^=FBReg1;
		buffer[1]^=FBReg2;
		FBReg1=FBReg3;
		FBReg2=FBReg4;
		TailGroup=((Tail>>3)+1)<<1;
		for(i=2;i<TailGroup;++i,++i)
		{
			FBReg3=buffer[i];
			FBReg4=buffer[i+1];
			dec(buffer[i],buffer[i+1],cmpkey1,cmpkey2,
				cmpkey3);
			buffer[i]^=FBReg1;
			buffer[i+1]^=FBReg2;
			FBReg1=FBReg3;
			FBReg2=FBReg4;
		}
		TargetFile.Write(buffer,Tail);
	}
	//Destory SourceFile
	for(j=0;j<BufferGroup;j++)
		buffer[j]=0;
	for(j=0;j<Blocks;j++)
		SourceFile.Write(buffer,BufferSize);
	if(Tail!=0)
		SourceFile.Write(buffer,BufferSize);
	//
	for(i=0;i<16;i++)
	{
		cmpkey1[i]=0;
		cmpkey2[i]=0;
		cmpkey3[i]=0;
	}
	reset_s_box();
	SourceFile.Close();
	TargetFile.Close();
	SourceFile.Remove(szSourceFile);
	TargetFile.Rename(TempFileName,szSourceFile);
	pparams->statue=S_ALL_RIGHT;
	pparams->iCompletePercent=100;
	_endthread();
}

EXPORTDLL long CALLBACK Version()
{
	return DllVersion;
}

EXPORTDLL long CALLBACK IsWeakKey(DWORD* LKey,DWORD* RKey)
{
	return isweakkey(*LKey,*RKey);
}

EXPORTDLL long CALLBACK Rebuild_S_Box(DWORD* LExKey,
									  DWORD* RExKey)
{
	rebuild_s_box(*LExKey,*RExKey);
	return 0;
}

EXPORTDLL long CALLBACK Reset_S_Box()
{
	reset_s_box();
	return 0;
}

EXPORTDLL long CALLBACK Init_ENC_Cmpkeys(DWORD* LKey,
										 DWORD* RKey,
										 _int64* Compressed_ENC_Key)
{
	init_enc_cmpkeys(*LKey,*RKey,Compressed_ENC_Key);
	return 0;
}

EXPORTDLL long CALLBACK Init_DEC_Cmpkeys(DWORD* LKey,
										 DWORD* RKey,
										 _int64* Compressed_DEC_Key)
{
	init_dec_cmpkeys(*LKey,*RKey,Compressed_DEC_Key);
	return 0;
}

EXPORTDLL long CALLBACK Fast_DES_ENC(DWORD* LData,DWORD* RData,
									 _int64* Compressed_ENC_Key)
{
	fast_desenc(*LData,*RData,Compressed_ENC_Key);
	return 0;
}
EXPORTDLL long CALLBACK Fast_DES_DEC(DWORD* LData,DWORD* RData,
									 _int64* Compressed_DEC_Key)
{
	fast_desdec(*LData,*RData,Compressed_DEC_Key);
	return 0;
}

⌨️ 快捷键说明

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