一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

C++文件内容如何加密

时间:2026-07-12 09:25:57 编辑:袖梨 来源:一聚教程网

最可靠方案是用OpenSSL EVP接口实现AES-256-CBC加密:必须随机生成16字节IV并随密文保存,密钥需通过PKCS5_PBKDF2_HMAC派生,采用PKCS#7填充,流式处理大文件,严格校验EVP_EncryptFinal_ex返回值,并优先选用AES-256-GCM以保障完整性。

OpenSSLEVP_EncryptInit_ex 做 AES 加密最可靠

直接调用系统级加密库比手写算法安全得多,OpenSSL 是当前 C++ 项目里最常用、审核最充分的选择。别碰自己实现的 XOR 或简单移位——哪怕只是测试,也容易因密钥管理或填充方式出错导致数据不可恢复。

关键点在于:必须用 AES-256-CBC 模式(不是 ECB),手动处理 IV(初始化向量)并随密文一起保存,且必须使用 PKCS#7 填充。常见错误是把 IV 写死或忽略它,结果同一文件每次加密结果一样,或者解密时崩溃。

  • IV 必须每次随机生成(用 RAND_bytes),长度固定为 16 字节(AES 块大小)
  • 密钥不能直接用字符串字面量,要用 EVP_BytesToKey 或更推荐的 PKCS5_PBKDF2_HMAC 衍生(加盐 + 迭代)
  • 加密后,把 IV 放在密文前 16 字节,再写密文主体,解密时先读出前 16 字节作 IV
  • 务必检查 EVP_EncryptFinal_ex 返回值,它可能因填充失败返回 0

读写大文件时别一次性 fread 到内存

加密 1GB 文件时如果用 std::ifstream::rdbuf()->pubseekoff 读全量到 std::vector<uint8_t></uint8_t>,会触发 OOM 或卡死。得流式处理:每次读 4096 字节(或 16KB),加密后立刻写入输出文件。

注意 EVP_EncryptUpdate 的输入长度不一定要是块对齐的,但最后一次必须调用 EVP_EncryptFinal_ex 补齐填充;而 EVP_EncryptUpdate 输出缓冲区要预留额外 EVP_MAX_BLOCK_LENGTH 字节空间,否则可能溢出。

立即学习“C++免费学习笔记(深入)”;

  • 输入缓冲区大小建议设为 4096,输出缓冲区大小设为 4096 + EVP_MAX_BLOCK_LENGTH
  • std::ofstreamstd::ios::binary 打开输出文件,避免 Windows 下 n 被误转
  • 不要用 std::string 存二进制密文——它会把

热门栏目