#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
void ShowError(const char* pszText);
BOOL AesEncrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength);
BOOL AesDecrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength);
int main(int argc, _TCHAR* argv[])
{
BYTE pData[MAX_PATH] = { 0 };
DWORD dwDataLength = 0, dwBufferLength = MAX_PATH;
DWORD i = 0;
RtlZeroMemory(pData, dwBufferLength);
lstrcpyA((char*)pData, "Hello World !11111111111111111122222222222222222222");
dwDataLength = lstrlenA((char*)pData);
printf("Text[%d]\n", dwDataLength);
for (i = 0; i < dwDataLength; i++)
{
printf("%x ", pData[i]);
}
printf("\n\n");
//AES加密
AesEncrypt((BYTE*)"yxx", 3, pData, &dwDataLength, dwBufferLength);
printf("AES Encrypt[%d]\n", dwDataLength);
for (i = 0; i < dwDataLength; i++)
{
printf("%x ", pData[i]);
}
printf("\n\n");
//AES解密
AesDecrypt((BYTE*)"yxx", 3, pData, &dwDataLength, dwBufferLength);
printf("AES Decrypt[%d]\n", dwDataLength);
for (i = 0; i < dwDataLength; i++)
{
printf("%x ", pData[i]);
}
printf("\n\n");
system("pause");
return 0;
}
void ShowError(const char* pszText)
{
char szErr[MAX_PATH] = { 0 };
wsprintfA(szErr, "%s Error [%d]", pszText, GetLastError());
MessageBoxA(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
}
//AES加密
BOOL AesEncrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength)
{
BOOL bRet = TRUE;
HCRYPTPROV hCryptprov = 0;
HCRYPTHASH hCryptHash = 0;
HCRYPTKEY hCryptKey = 0;
do
{
//获取CSP句柄
bRet = CryptAcquireContextA(&hCryptprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
if (FALSE == bRet)
{
ShowError("CryptAcquireContext");
break;
}
//创建HASH对象
bRet = CryptCreateHash(hCryptprov, CALG_MD5, 0, 0, &hCryptHash);
if (FALSE == bRet)
{
ShowError("CryptCreateHash");
break;
}
//对密钥进行HASH计算
bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
if (FALSE == bRet)
{
ShowError("CryptHashData");
break;
}
//使用HASH来生成密钥
bRet = CryptDeriveKey(hCryptprov, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
if (FALSE == bRet)
{
ShowError("CryptDeriveKey");
break;
}
bRet = CryptEncrypt(hCryptKey, 0, TRUE, 0, pData, dwDataLength, dwBufferLength);
if (FALSE == bRet)
{
ShowError("CryptEncrypt");
break;
}
} while (FALSE);
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptHash)
{
CryptDestroyHash(hCryptHash);
}
if (hCryptprov)
{
CryptReleaseContext(hCryptprov, 0);
}
return bRet;
}
//AES解密
BOOL AesDecrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength)
{
BOOL bRet = TRUE;
HCRYPTPROV hCryptprov = 0;
HCRYPTHASH hCryptHash = 0;
HCRYPTKEY hCryptKey = 0;
do
{
//获取CSP句柄
bRet = CryptAcquireContext(&hCryptprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
if (FALSE == bRet)
{
ShowError("CryptAcquireContext");
break;
}
//创建HASH对象
bRet = CryptCreateHash(hCryptprov, CALG_MD5, 0, 0, &hCryptHash);
if (FALSE == bRet)
{
ShowError("CryptCreateHash");
break;
}
//对密钥进行HASH计算
bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
if (FALSE == bRet)
{
ShowError("CryptHashData");
break;
}
//使用HASH来生成密钥
bRet = CryptDeriveKey(hCryptprov, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
if (FALSE == bRet)
{
ShowError("CryptDeriveKey");
break;
}
bRet = CryptDecrypt(hCryptKey, 0, TRUE, 0, pData, dwDataLength);
if (FALSE == bRet)
{
ShowError("CryptDecrypt");
break;
}
} while (FALSE);
if (hCryptKey)
{
CryptDestroyKey(hCryptKey);
}
if (hCryptHash)
{
CryptDestroyHash(hCryptHash);
}
if (hCryptprov)
{
CryptReleaseContext(hCryptprov, 0);
}
return bRet;
}
发表回复