//计算hash值
BOOL CEncryptionDlg::CalculateHash(BYTE *pData, DWORD dwDataLength, ALG_ID algHashType, BYTE **ppHashData, DWORD *pdwHashDataLength)
{
BOOL bRet = FALSE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hCryptHash = NULL;
DWORD dwTemp = 0;
DWORD dwHashDataLength = 0;
BYTE* pHashData = NULL;
// 获得指定CSP的密钥容器的句柄
bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
if (FALSE == bRet)
{
MessageBox(_T("CryptAcquireContext Error\r\n"));
return FALSE;
}
// 创建一个HASH对象, 指定HASH算法
bRet = ::CryptCreateHash(hCryptProv, algHashType, NULL, NULL, &hCryptHash);
if (FALSE == bRet)
{
MessageBox(_T("CryptCreateHash Error\r\n"));
CryptReleaseContext(hCryptProv, 0);
return FALSE;
}
// 计算HASH数据
bRet = ::CryptHashData(hCryptHash, pData, dwDataLength, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptHashData Error\r\n"));
CryptDestroyHash(hCryptHash);
CryptReleaseContext(hCryptProv, 0);
return FALSE;
}
// 获取HASH结果的大小
dwTemp = sizeof(dwHashDataLength);
bRet = ::CryptGetHashParam(hCryptHash, HP_HASHSIZE, (BYTE *)(&dwHashDataLength), &dwTemp, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptGetHashParam Error\r\n"));
CryptDestroyHash(hCryptHash);
CryptReleaseContext(hCryptProv, 0);
return FALSE;
}
// 申请内存
pHashData = new BYTE[dwHashDataLength]{ 0 };
if (NULL == pHashData)
{
MessageBox(_T("new Error\r\n"));
CryptDestroyHash(hCryptHash);
CryptReleaseContext(hCryptProv, 0);
return FALSE;
}
// 获取HASH结果数据
bRet = ::CryptGetHashParam(hCryptHash, HP_HASHVAL, pHashData, &dwHashDataLength, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptGetHashParam Error\r\n"));
delete[] pHashData;
pHashData = NULL;
CryptDestroyHash(hCryptHash);
CryptReleaseContext(hCryptProv, 0);
return FALSE;
}
// 返回数据
*ppHashData = pHashData;
*pdwHashDataLength = dwHashDataLength;
// 释放关闭
CryptDestroyHash(hCryptHash);
CryptReleaseContext(hCryptProv, 0);
return TRUE;
}
// AES加密
BOOL CEncryptionDlg::AesEncrypt(BYTE *pPassword, DWORD dwPasswordLength, BYTE *pData, DWORD &dwDataLength, DWORD dwBufferLength)
{
BOOL bRet = TRUE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hCryptHash = NULL;
HCRYPTKEY hCryptKey = NULL;
do {
// 获取CSP句柄
bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
if (FALSE == bRet)
{
MessageBox(_T("CryptAcquireContext Error\r\n"));
break;
}
// 创建HASH对象
bRet = ::CryptCreateHash(hCryptProv, CALG_MD5, NULL, 0, &hCryptHash);
if (FALSE == bRet)
{
MessageBox(_T("CryptCreateHash Error\r\n"));
break;
}
// 对密钥进行HASH计算 计算出密钥的MD5值
bRet = ::CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptHashData Error\r\n"));
break;
}
// 使用HASH来生成密钥
bRet = ::CryptDeriveKey(hCryptProv, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
if (FALSE == bRet)
{
MessageBox(_T("CryptDeriveKey Error\r\n"));
break;
}
// 加密数据
bRet = ::CryptEncrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength, dwBufferLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptEncrypt Error\r\n"));
break;
}
} while (FALSE);
// 关闭释放
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptHash)
{
CryptDestroyHash(hCryptHash);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
return bRet;
}
// AES解密
BOOL CEncryptionDlg::AesDecrypt(BYTE *pPassword, DWORD dwPasswordLength, BYTE *pData, DWORD &dwDataLength)
{
// 变量
BOOL bRet = TRUE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hCryptHash = NULL;
HCRYPTKEY hCryptKey = NULL;
do
{
// 获取CSP句柄
bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
if (FALSE == bRet)
{
MessageBox(_T("CryptAcquireContext Error\r\n"));
break;
}
// 创建HASH对象
bRet = ::CryptCreateHash(hCryptProv, CALG_MD5, NULL, 0, &hCryptHash);
if (FALSE == bRet)
{
MessageBox(_T("CryptCreateHash Error\r\n"));
break;
}
// 对密钥进行HASH计算
bRet = ::CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptCreateHash Error\r\n"));
break;
}
// 使用HASH来生成密钥
bRet = ::CryptDeriveKey(hCryptProv, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
if (FALSE == bRet)
{
MessageBox(_T("CryptDeriveKey Error\r\n"));
break;
}
// 解密数据
bRet = ::CryptDecrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptDecrypt Error\r\n"));
break;
}
} while (FALSE);
// 关闭释放
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptHash)
{
CryptDestroyHash(hCryptHash);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
return bRet;
}
// 生成公钥和私钥
BOOL CEncryptionDlg::GenerateKey(BYTE **ppPublicKey, DWORD *pdwPublicKeyLength, BYTE **ppPrivateKey, DWORD *pdwPrivateKeyLength)
{
// 变量
BOOL bRet = TRUE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hCryptKey = NULL;
DWORD dwPublicKeyLength = 0;
BYTE* pPublicKey = NULL;
DWORD dwPrivateKeyLength = 0;
BYTE* pPrivateKey = NULL;
do
{
// 获取CSP句柄
bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptAcquireContext Error\r\n"));
break;
}
// 生成公/私密钥对
bRet = ::CryptGenKey(hCryptProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hCryptKey);
if (FALSE == bRet)
{
MessageBox(_T("CryptGenKey Error\r\n"));
break;
}
// 获取公钥密钥的长度和内容
bRet = ::CryptExportKey(hCryptKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwPublicKeyLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptExportKey Error\r\n"));
break;
}
pPublicKey = new BYTE[dwPublicKeyLength]{0};
bRet = ::CryptExportKey(hCryptKey, NULL, PUBLICKEYBLOB, 0, pPublicKey, &dwPublicKeyLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptExportKey Error\r\n"));
break;
}
// 获取私钥密钥的长度和内容
bRet = ::CryptExportKey(hCryptKey, NULL, PRIVATEKEYBLOB, 0, NULL, &dwPrivateKeyLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptExportKey Error\r\n"));
break;
}
pPrivateKey = new BYTE[dwPrivateKeyLength]{0};
bRet = ::CryptExportKey(hCryptKey, NULL, PRIVATEKEYBLOB, 0, pPrivateKey, &dwPrivateKeyLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptExportKey Error\r\n"));
break;
}
// 返回数据
*ppPublicKey = pPublicKey;
*pdwPublicKeyLength = dwPublicKeyLength;
*ppPrivateKey = pPrivateKey;
*pdwPrivateKeyLength = dwPrivateKeyLength;
} while (FALSE);
// 释放关闭
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
return bRet;
}
// 公钥加密数据
BOOL CEncryptionDlg::RsaEncrypt(BYTE *pPublicKey, DWORD dwPublicKeyLength, BYTE *pData, DWORD &dwDataLength, DWORD dwBufferLength)
{
// 变量
BOOL bRet = TRUE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hCryptKey = NULL;
do
{
// 获取CSP句柄
bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptAcquireContext Error\r\n"));
break;
}
// 导入公钥
bRet = ::CryptImportKey(hCryptProv, pPublicKey, dwPublicKeyLength, NULL, 0, &hCryptKey);
if (FALSE == bRet)
{
MessageBox(_T("CryptImportKey Error\r\n"));
break;
}
// 加密数据
bRet = ::CryptEncrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength, dwBufferLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptEncrypt Error\r\n"));
break;
}
} while (FALSE);
// 关闭句柄
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
return bRet;
}
// 私钥解密数据
BOOL CEncryptionDlg::RsaDecrypt(BYTE *pPrivateKey, DWORD dwProvateKeyLength, BYTE *pData, DWORD &dwDataLength)
{
// 变量
BOOL bRet = TRUE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hCryptKey = NULL;
do
{
// 获取CSP句柄
bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
if (FALSE == bRet)
{
MessageBox(_T("CryptAcquireContext Error\r\n"));
break;
}
// 导入私钥
bRet = ::CryptImportKey(hCryptProv, pPrivateKey, dwProvateKeyLength, NULL, 0, &hCryptKey);
if (FALSE == bRet)
{
MessageBox(_T("CryptImportKey Error\r\n"));
break;
}
// 解密数据
bRet = ::CryptDecrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength);
if (FALSE == bRet)
{
MessageBox(_T("CryptDecrypt Error\r\n"));
break;
}
} while (FALSE);
// 关闭句柄
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
return bRet;
}