用密码学安全随机数生成256位密钥

核心原则

密码学安全随机数生成器(CSPRNG)需满足:

  1. 熵源来自系统底层(如硬件随机数、系统环境噪声);
  2. 不可预测、不可重现;
  3. 杜绝使用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;
}
相关推荐
晓蛋16 小时前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
倒头就睡的小比特16 小时前
算法竞赛C++常用的STL
c++·算法
weilx123417 小时前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!17 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
rockmelodies17 小时前
# Windows Server2008 R2 Standard(SP1镜像U盘)重置本地管理员密码【完整详细步骤】
windows·密码破解
傲世仙尊17 小时前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿17 小时前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读18 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy18 小时前
C 语言指针:从内存地址到灵活的数据访问
c语言
liufeiyu197618 小时前
VS 2026 升级后出现错误: 找不到指定的 SDK“Microsoft.NET.Sdk”
visual studio·vs 2026