Windows CryptoAPI AES加解密

·

#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;
}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注