C++如何生成含10000个16字节随机密钥的key.bin并读取存储到RAM
C++ 密钥文件生成与读取实现
前置说明
所有实现基于C++11及以上标准库,无需引入第三方依赖,代码兼容Windows、Linux、macOS平台。
1. 生成key.bin文件
实现逻辑
总共需要生成10000个16字节密钥,总文件大小固定为10000 * 16 = 160000 Byte。使用标准库随机数组件生成随机值,二进制模式写入文件避免内容转义。
核心代码片段
#include <fstream> #include <array> #include <random> #include <stdexcept> void generate_key_file(const std::string& file_path = "key.bin") { // 二进制截断模式打开文件 std::ofstream ofs(file_path, std::ios::binary | std::ios::trunc); if (!ofs.is_open()) { throw std::runtime_error("无法打开文件用于写入"); } // 初始化随机数生成器,加密场景下优先使用该安全随机源 std::random_device rd; std::uniform_int_distribution<uint8_t> dist(0, 255); // 逐个生成16字节密钥写入文件 for (size_t i = 0; i < 10000; ++i) { std::array<uint8_t, 16> key; for (size_t j = 0; j < 16; ++j) { key[j] = dist(rd); } ofs.write(reinterpret_cast<const char*>(key.data()), key.size()); } ofs.close(); }
2. 读取key.bin内容到内存
实现逻辑
用std::vector<std::array<uint8_t, 16>>存储所有密钥,既保证内存连续,也可以通过下标直接访问单个密钥。读取前先校验文件大小是否符合预期,避免读入损坏的文件。
核心代码片段
#include <vector> #include <filesystem> // C++17及以上可用,用于获取文件大小,低版本可以自行替换为文件流seekg计算 std::vector<std::array<uint8_t, 16>> load_key_file(const std::string& file_path = "key.bin") { // 校验文件大小是否符合预期 const size_t expected_size = 10000 * 16; if (std::filesystem::file_size(file_path) != expected_size) { throw std::runtime_error("密钥文件大小异常,可能已损坏"); } // 二进制只读模式打开文件 std::ifstream ifs(file_path, std::ios::binary); if (!ifs.is_open()) { throw std::runtime_error("无法打开文件用于读取"); } // 预分配内存空间,避免多次扩容 std::vector<std::array<uint8_t, 16>> keys(10000); for (auto& key : keys) { ifs.read(reinterpret_cast<char*>(key.data()), key.size()); } ifs.close(); return keys; }
完整调用示例
#include <iostream> int main() { try { // 生成密钥文件 generate_key_file(); std::cout << "密钥文件生成成功" << std::endl; // 读取密钥到内存 auto keys = load_key_file(); std::cout << "密钥读取完成,共加载" << keys.size() << "个密钥" << std::endl; // 测试打印第一个密钥的前4个字节,验证正确性 std::cout << "第一个密钥前4字节: "; for (size_t i = 0; i < 4; ++i) { printf("%02X ", keys[0][i]); } std::cout << std::endl; } catch (const std::exception& e) { std::cerr << "运行错误: " << e.what() << std::endl; return 1; } return 0; }
注意事项
- 所有文件操作必须加
std::ios::binary标志,Windows平台下不加该标志会自动转换换行符,导致文件内容与预期不符 - 如果是加密场景使用,禁止用
rand()函数生成随机数,安全等级不足,必须使用密码学安全的随机源 - 如果你的编译器不支持C++17的
std::filesystem,可以把文件大小校验逻辑替换为:打开文件后用ifs.seekg(0, std::ios::end); size_t file_size = ifs.tellg(); ifs.seekg(0, std::ios::beg);计算
内容的提问来源于stack exchange,提问作者seeker1234
相关产品推荐
相关产品推荐

