I
ic
Unregistered / Unconfirmed
GUEST, unregistred user!
#pragma once
#include <wincrypt.h>
// 数据流加密/解密接口
class CCrypt
{
public:
CCrypt():m_hProv(NULL),m_hKey(NULL){}
~CCrypt() { Destroy(); }
operator HCRYPTPROV () const{return m_hProv;}
BOOL Create(LPCTSTR pszPwd)
{ // 初始化
if(CryptAcquireContext(&m_hProv,NULL,MS_DEF_PROV,PROV_RSA_FULL,0) ||
CryptAcquireContext(&m_hProv,NULL,MS_DEF_PROV,PROV_RSA_FULL,CRYPT_NEWKEYSET))
{
// 根据口令生成加密键
HCRYPTHASH hHash;
if(CryptCreateHash(m_hProv,CALG_MD5,0,0,&hHash))
{
if(CryptHashData(hHash,(PBYTE)pszPwd,lstrlen(pszPwd),0))
{
if(CryptDeriveKey(m_hProv,CALG_RC4,hHash,0,&m_hKey))
{
CryptDestroyHash(hHash);
return TRUE;
}
}
CryptDestroyHash(hHash);
}
CryptReleaseContext(m_hProv,0);
m_hProv=NULL;
}
return FALSE;
}
void Destroy()
{ // 释放资源
if(m_hProv)
{
CryptDestroyKey(m_hKey);
CryptReleaseContext(m_hProv,0);
m_hProv=NULL;
}
}
BOOL Encrypt(PVOID pData,DWORD cbData) const
{ // 加密数据流,采用原地加密方式,如果希望保存原来的缓冲区,应先复制后再调用该函数
return CryptEncrypt(m_hKey,NULL,TRUE,0,(PBYTE)pData,&cbData,cbData);
}
BOOL Decrypt(PVOID pData,DWORD cbData) const
{ // 解密数据流,采用原地解密方式,如果希望保存原来的缓冲区,应先复制后再调用该函数
return CryptDecrypt(m_hKey,NULL,TRUE,0,(PBYTE)pData,&cbData);
}
static DWORD GetHash(const void* pData,DWORD cbData)
{ // 计算hash值
DWORD dwValue=0;
for(DWORD i=0;i<cbData;i++)
{
dwValue=(dwValue<<5)+dwValue+((const BYTE*)pData);
}
return dwValue;
}
private:
HCRYPTPROV m_hProv; // 加密算法提供者
HCRYPTKEY m_hKey; // 加密键
};
//------------------------调用示范------------------------------------------
CString s1; char cBuf[MAX_PATH] = {0, };
BOOL bR = FALSE;
int i1 = 32, i2 = 16;
char cData[32] = {0, };
CCrypt Crypt;
Crypt.Create("bb68jkape1"
bR = Crypt.Encrypt(cBuf, i2);
Crypt.Destroy();
#include <wincrypt.h>
// 数据流加密/解密接口
class CCrypt
{
public:
CCrypt():m_hProv(NULL),m_hKey(NULL){}
~CCrypt() { Destroy(); }
operator HCRYPTPROV () const{return m_hProv;}
BOOL Create(LPCTSTR pszPwd)
{ // 初始化
if(CryptAcquireContext(&m_hProv,NULL,MS_DEF_PROV,PROV_RSA_FULL,0) ||
CryptAcquireContext(&m_hProv,NULL,MS_DEF_PROV,PROV_RSA_FULL,CRYPT_NEWKEYSET))
{
// 根据口令生成加密键
HCRYPTHASH hHash;
if(CryptCreateHash(m_hProv,CALG_MD5,0,0,&hHash))
{
if(CryptHashData(hHash,(PBYTE)pszPwd,lstrlen(pszPwd),0))
{
if(CryptDeriveKey(m_hProv,CALG_RC4,hHash,0,&m_hKey))
{
CryptDestroyHash(hHash);
return TRUE;
}
}
CryptDestroyHash(hHash);
}
CryptReleaseContext(m_hProv,0);
m_hProv=NULL;
}
return FALSE;
}
void Destroy()
{ // 释放资源
if(m_hProv)
{
CryptDestroyKey(m_hKey);
CryptReleaseContext(m_hProv,0);
m_hProv=NULL;
}
}
BOOL Encrypt(PVOID pData,DWORD cbData) const
{ // 加密数据流,采用原地加密方式,如果希望保存原来的缓冲区,应先复制后再调用该函数
return CryptEncrypt(m_hKey,NULL,TRUE,0,(PBYTE)pData,&cbData,cbData);
}
BOOL Decrypt(PVOID pData,DWORD cbData) const
{ // 解密数据流,采用原地解密方式,如果希望保存原来的缓冲区,应先复制后再调用该函数
return CryptDecrypt(m_hKey,NULL,TRUE,0,(PBYTE)pData,&cbData);
}
static DWORD GetHash(const void* pData,DWORD cbData)
{ // 计算hash值
DWORD dwValue=0;
for(DWORD i=0;i<cbData;i++)
{
dwValue=(dwValue<<5)+dwValue+((const BYTE*)pData);
}
return dwValue;
}
private:
HCRYPTPROV m_hProv; // 加密算法提供者
HCRYPTKEY m_hKey; // 加密键
};
//------------------------调用示范------------------------------------------
CString s1; char cBuf[MAX_PATH] = {0, };
BOOL bR = FALSE;
int i1 = 32, i2 = 16;
char cData[32] = {0, };
CCrypt Crypt;
Crypt.Create("bb68jkape1"
bR = Crypt.Encrypt(cBuf, i2);
Crypt.Destroy();