wincrypt.h实现AES加密
时间: 2025-06-19 22:28:40 浏览: 23
### 使用 wincrypt.h 实现 AES 加密
在 Windows 平台上,`wincrypt.h` 是 Microsoft CryptoAPI 的头文件之一,提供了对加密算法的支持,包括 AES(Advanced Encryption Standard)。以下是使用 `wincrypt.h` 和相关函数实现 AES 加密的详细说明和示例代码。
#### 1. 加载加密服务提供者 (CSP)
要使用 CryptoAPI 进行加密操作,首先需要加载一个支持所需算法的加密服务提供者 (CSP)。可以通过 `CryptAcquireContext` 函数实现[^1]。
#### 2. 导入或生成 AES 密钥
AES 加密需要一个密钥,可以使用 `CryptGenKey` 或 `CryptImportKey` 来生成或导入密钥。对于 AES-256,密钥长度为 256 位(32 字节)[^3]。
#### 3. 设置加密参数
在进行加密之前,需要设置加密算法的参数。通过 `CryptSetKeyParam` 函数可以配置块加密模式(如 CBC 模式)和初始化向量 (IV)[^1]。
#### 4. 执行加密操作
使用 `CryptEncrypt` 函数执行实际的加密操作。该函数会根据指定的密钥和算法对数据进行加密[^1]。
以下是一个完整的 C++ 示例代码,展示如何使用 `wincrypt.h` 实现 AES-256 加密:
```cpp
#include <windows.h>
#include <wincrypt.h>
#include <iostream>
#include <vector>
#pragma comment(lib, "crypt32.lib")
bool AesEncrypt(const BYTE* key, DWORD keySize, const BYTE* iv, DWORD ivSize, const BYTE* data, DWORD dataSize, std::vector<BYTE>& encryptedData) {
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hSymmetricKey = NULL;
// 获取加密服务提供者
if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
std::cerr << "CryptAcquireContext failed." << std::endl;
return false;
}
// 导入 AES 密钥
if (!CryptImportKey(hCryptProv, key, keySize, 0, 0, &hSymmetricKey)) {
std::cerr << "CryptImportKey failed." << std::endl;
goto Cleanup;
}
// 设置加密模式为 CBC,并提供 IV
if (!CryptSetKeyParam(hSymmetricKey, KP_IV, iv, 0)) {
std::cerr << "CryptSetKeyParam failed." << std::endl;
goto Cleanup;
}
// 设置加密算法为 AES-256
if (!CryptSetKeyParam(hSymmetricKey, KP_MODE, (BYTE*)&CALG_AES_256, 0)) {
std::cerr << "CryptSetKeyParam for mode failed." << std::endl;
goto Cleanup;
}
// 计算加密后数据的大小
DWORD encryptedSize = dataSize + (dataSize % 16 ? (16 - dataSize % 16) : 0);
encryptedData.resize(encryptedSize);
// 执行加密操作
if (!CryptEncrypt(hSymmetricKey, NULL, TRUE, 0, encryptedData.data(), &dataSize, encryptedSize)) {
std::cerr << "CryptEncrypt failed." << std::endl;
goto Cleanup;
}
encryptedData.resize(dataSize); // 调整输出缓冲区大小以匹配实际加密数据长度
Cleanup:
if (hSymmetricKey) CryptDestroyKey(hSymmetricKey);
if (hCryptProv) CryptReleaseContext(hCryptProv, 0);
return !encryptedData.empty();
}
int main() {
// 示例密钥和 IV(必须为 32 字节和 16 字节)
BYTE aesKey[32] = { /* 你的 256 位密钥 */ };
BYTE iv[16] = { /* 你的 128 位 IV */ };
// 待加密的数据
BYTE plainText[] = "This is a secret message.";
DWORD plainTextSize = sizeof(plainText);
// 存储加密后的数据
std::vector<BYTE> encryptedData;
if (AesEncrypt(aesKey, sizeof(aesKey), iv, sizeof(iv), plainText, plainTextSize, encryptedData)) {
std::cout << "Encryption successful!" << std::endl;
for (BYTE b : encryptedData) {
printf("%02x", b);
}
printf("\n");
} else {
std::cerr << "Encryption failed." << std::endl;
}
return 0;
}
```
#### 注意事项
1. 确保使用支持 AES 的 CSP,例如 `MS_ENH_RSA_AES_PROV`。
2. 密钥和 IV 必须符合 AES 算法的要求(密钥长度为 128、192 或 256 位,IV 长度为 128 位)。
3. 加密前需对数据进行填充,以确保其长度为块大小的倍数。
---
###
阅读全文
相关推荐


















