核心原则
密码学安全随机数生成器(CSPRNG)需满足:
- 熵源来自系统底层(如硬件随机数、系统环境噪声);
- 不可预测、不可重现;
- 杜绝使用
rand()等伪随机函数(仅用于非安全场景)。
使用CryptGenRandom(Windows CryptoAPI),系统级CSPRNG,支持 Windows XP 及以上。
cpp
#include <windows.h>
#include <wincrypt.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
// 生成256位(32字节)密码学安全随机密钥
int generate_aes256_key_win(uint8_t *key_out) {
HCRYPTPROV hProv = 0;
// 1. 获取加密服务提供器(CSP)句柄
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
fprintf(stderr, "CryptAcquireContext失败,错误码:%lu\n", GetLastError());
return -1;
}
// 2. 生成32字节安全随机数(256位密钥)
if (!CryptGenRandom(hProv, 32, key_out)) {
fprintf(stderr, "CryptGenRandom失败,错误码:%lu\n", GetLastError());
CryptReleaseContext(hProv, 0);
return -1;
}
// 3. 释放资源
CryptReleaseContext(hProv, 0);
return 0;
}
// 测试:生成并打印256位密钥
int main() {
uint8_t aes256_key[32] = {0};
if (generate_aes256_key_win(aes256_key) != 0) {
return -1;
}
printf("Windows生成的256位AES密钥(十六进制):\n");
for (int i = 0; i < 32; i++) {
printf("%02X ", aes256_key[i]);
if ((i+1) % 8 == 0) printf("\n"); // 每8字节换行,便于阅读
}
return 0;
}
