9,506
社区成员
发帖
与我相关
我的任务
分享
// 初始化
BOOL CAESAlg::Init(PBYTE pbPassword, DWORD dwLen, DWORD dwBlockSize)
{
if (pbPassword==NULL||dwLen<=0)
{
return FALSE;
}
if (dwBlockSize!=128&&
dwBlockSize!=192&&
dwBlockSize!=256)
{
return FALSE;
}
_dwBlockSize=(dwBlockSize>>3);
HCRYPTHASH hHash=NULL;
if (_hCryptProc)
{
CryptReleaseContext(_hCryptProc,0);
_hCryptProc=NULL;
}
if (_hKey)
{
CryptDestroyKey(_hKey);
_hKey=NULL;
}
if(!CryptAcquireContext(&_hCryptProc,NULL,MS_ENH_RSA_AES_PROV,PROV_RSA_AES,0))
{
return FALSE;
}
if (!CryptCreateHash(_hCryptProc,CALG_MD5,0,0,&hHash))
{
return FALSE;
}
if (!CryptHashData(hHash,pbPassword,dwLen,0))
{
return FALSE;
}
DWORD dwKeyLength=MAKE_KEYLENGTH(dwBlockSize);
ALG_ID id;
if (_dwBlockSize==16)
{
id=CALG_AES_128;
}
else if (_dwBlockSize==24)
{
id=CALG_AES_192;
}
else
{
id=CALG_AES_256;
}
if (!CryptDeriveKey(_hCryptProc,id,hHash,dwKeyLength,&_hKey))
{
return FALSE;
}
CryptDestroyHash(hHash);
return TRUE;
}
// 加密函数
BOOL CAESAlg::Encrypt(PBYTE pBuffer, DWORD dwBufferSize, LPDWORD pdwDataLen)
{
if (_hCryptProc==NULL||
_hKey==NULL)
{
return FALSE;
}
if (pBuffer==NULL||pdwDataLen==NULL)
{
return FALSE;
}
if (!CryptEncrypt(_hKey,NULL,TRUE,0,pBuffer,pdwDataLen,dwBufferSize))
{
return FALSE;
}
return TRUE;
}
// 解密函数
BOOL CAESAlg::Decrypt(PBYTE pData, LPDWORD pdwDataLen)
{
if (_hCryptProc==NULL||
_hKey==NULL)
{
return FALSE;
}
if (pData==NULL||pdwDataLen==NULL)
{
return FALSE;
}
if (!CryptDecrypt(_hKey,NULL,TRUE,0,pData,pdwDataLen))
{
return FALSE;
}
return TRUE;
}
#pragma once
#include <Windows.h>
#include <WinCrypt.h>
#define MAKE_KEYLENGTH(len)\
(len<<0x10)
//AES算法封装类
class CAESAlg
{
public:
CAESAlg(void);
public:
virtual ~CAESAlg(void);
public:
// 初始化
BOOL Init(PBYTE pbPassword, DWORD dwLen, DWORD dwBlockSize=128);
// 加密函数
BOOL Encrypt(PBYTE pBuffer, DWORD dwBufferSize, LPDWORD pdwDataLen);
// 解密函数
BOOL Decrypt(PBYTE pData, LPDWORD pdwDataLen);
private:
// CSP对象的句柄
HCRYPTPROV _hCryptProc;
// 加密解密密钥
HCRYPTKEY _hKey;
// 块大小
DWORD _dwBlockSize;
};
#include "StdAfx.h"
#include "AESAlg.h"
CAESAlg::CAESAlg(void)
: _dwBlockSize(16),
_hCryptProc(NULL),
_hKey(NULL)
{
}
CAESAlg::~CAESAlg(void)
{
if(_hKey)
{
CryptDestroyKey(_hKey);
_hKey=NULL;
}
if (_hCryptProc)
{
CryptReleaseContext(_hCryptProc,0);
_hCryptProc=NULL;
}
}