www.gusucode.com > VC2003开发的文件捆绑机-源码程序 > VC2003开发的文件捆绑机-源码程序\code\VC6\Studio\AESEncryption.cpp

    //Download by http://www.NewXing.com
#include "stdafx.h"
#include "Rijndael.h"
#include ".\AESEncryption.h"

CAESEncryption::CAESEncryption(void)
{
	memset(KeyData, 0, 16);
	memcpy(KeyData,"1234567890123456", 16);
/*	调试
	char In[32];
	char Out[32];
	memcpy(In,"a\0aaaaaaaaaaaaaba\0aaaaaaaaaaaaab",32);
	DWORD nSize = 32;
	Encryption(In,32,Out,&nSize);	
	memset(In, 0, 32);
	Decryption(Out, 32, In);
*/
}

CAESEncryption::~CAESEncryption(void)
{
}

//加密函数
bool CAESEncryption::Encryption(IN LPVOID lpData, IN DWORD nByte, OUT LPVOID lpOutData, IN OUT DWORD* nSize)
{
	CRijndael aes;
	char* lpInData = NULL;
	char lpInBlock[16] = {0};
	char lpOutBlock[16] = {0};
	DWORD nInBufferSize = nByte % 16;
	DWORD nBlockCount = 0;
	char* lpOutPointer = NULL;

	//计算大小,开辟16的倍数的内存
	if (nInBufferSize != 0) {
		nInBufferSize = ((nByte / 16) + 1) * 16;
	} else {
		nInBufferSize = nByte;
	}

	nBlockCount = nInBufferSize / 16;

	//计算输出缓冲区是否够大
	if (*nSize < nInBufferSize) {
		*nSize = nInBufferSize;
		return false;
	}

	*nSize = nInBufferSize;

	//拷贝需要加密的数据
	lpInData = new char[nInBufferSize];
	memset(lpInData, 0, nInBufferSize);
	memcpy(lpInData, lpData, nByte);

	memset(lpOutData, 0, *nSize);
	lpOutPointer = (char*)lpOutData;

	//设置加密密钥
	aes.MakeKey(KeyData, CRijndael::sm_chain0);

	//分块加密
	for (DWORD i = 0; i < nBlockCount; i++)
	{
		memset(lpInBlock, 0, 16);
		memset(lpOutBlock, 0, 16);
		memcpy(lpInBlock, lpInData + i * 16, 16);
		aes.EncryptBlock(lpInBlock, lpOutBlock);
		
		//拷贝到输出缓冲区
		memcpy(lpOutPointer, lpOutBlock, 16);

		//移动指针
		lpOutPointer += 16;
	}

	return true;
}

//解密函数
bool CAESEncryption::Decryption(IN LPVOID lpData, IN DWORD nByte, OUT LPVOID lpOutData)
{
	CRijndael aes;
	DWORD n = nByte % 16;
	char cInBlock[16];
	char cOutBlock[16];
	char* lpOutPointer = NULL;
	
	//判断缓冲区长度是否符合 16 的倍数
	if (n != 0) {
		return false;
	}

	//计算块的数量
	DWORD nBlockCount = nByte / 16;

	//输出指针
	lpOutPointer = (char*)lpOutData;

	//设置加密密钥
	aes.MakeKey(KeyData, CRijndael::sm_chain0);

	//分块解密
	for (DWORD i = 0; i < nBlockCount ; i++)
	{
		memset(cInBlock, 0, 16);
		memset(cOutBlock, 0, 16);

		memcpy(cInBlock, (LPBYTE)lpData + i * 16, 16);
		aes.DecryptBlock(cInBlock, cOutBlock);

		memcpy(lpOutPointer, cOutBlock, 16);
		lpOutPointer += 16;
	}

	return true;
}