讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何将程序的私有配置信息加密保存为.enc格式的二进制文件【详解】

胖枫君_9914

胖枫君_9914

发布时间:2026-03-31 19:07:01

|

673人浏览过

|

来源于php中文网

原创

AES加密配置结构体时,密钥须从安全源获取、IV每次随机生成并随密文保存;仅对POD结构体直接序列化,含std::string等需手动序列化;.enc文件须定义固定头包含magic、cipher_id、IV和tag长度;GCM模式必须保存认证标签;缓冲区需预留足够空间,错误须用ERR_print_errors_fp排查。

c++如何将程序的私有配置信息加密保存为.enc格式的二进制文件【详解】

用 AES 加密配置结构体前,先确认密钥和 IV 怎么来

硬编码密钥或固定 IV 是最常见也最危险的做法——加密形同虚设。AES 的安全性完全依赖密钥保密性和 IV 的不可预测性。生产环境必须从安全来源获取:比如系统密钥库(Windows DPAPI、macOS Keychain)、硬件模块(TPM),或至少由用户口令派生(用 PBKDF2 或 scrypt)。IV 每次加密都得重新生成,且必须和密文一起保存(通常前置 16 字节),不能复用。

  • IV 必须是随机的,用 std::random_device + std::uniform_int_distribution 填充,别用 time(0)
  • 密钥长度要匹配算法:AES-128 要 16 字节,AES-256 要 32 字节;少一字节都会导致 EVP_EncryptInit_ex 返回失败
  • OpenSSL 1.1.1+ 推荐用 EVP_AEAD 接口,比老式 EVP_Encrypt* 更难误用

序列化配置数据时,避免直接 memcpy 结构体到内存

C++ 结构体有对齐填充、虚函数表指针、非 POD 类型成员(如 std::string、std::vector),直接二进制 dump 会写入垃圾内存或指针地址,解密后无法还原。

  • 只对纯 POD 结构体(如仅含 int、double、char[32])做 reinterpret_cast<const uint8_t*>(&cfg)
  • 含 std::string 的配置,必须手动序列化:先写长度(uint32_t),再写内容字节
  • 推荐用 flatbuffers 或 protobuf 生成二进制 schema,比手写序列化更可靠
  • 加密前务必计算真实有效字节数,别把整个 sizeof(cfg) 当作明文字节数传给 OpenSSL

写 .enc 文件时,文件头格式决定后续能否正确解密

.enc 不是标准格式,你得自己定义最小可用头。否则几年后连自己都读不懂——比如不知道用的是 AES-128-CBC 还是 AES-256-GCM,IV 在哪,认证标签多长。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 建议固定 32 字节头:uint8_t magic[4] = {'E','N','C','1'} + uint8_t cipher_id = 1(1=AES-256-GCM)+ uint8_t iv_len = 12 + uint8_t tag_len = 16 + uint8_t iv[12] + uint8_t reserved[7]
  • OpenSSL 的 GCM 模式必须保存认证标签(tag),它通常追加在密文末尾,长度由 EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, ...) 获取
  • 不要省略头校验:解密前先检查 magic 和 cipher_id,不匹配就立刻拒绝,避免用错算法解密出乱码还继续处理

用 OpenSSL 加密时,EVP_EncryptFinal_ex 失败往往意味着缓冲区太小

很多人卡在这一步:加密函数返回 0,但没查错误码,直接以为“加密失败”,其实是输出缓冲区没预留够空间。AES-CBC 最大膨胀是加一个完整块(16 字节),GCM 还要额外加 tag 长度(通常 16 字节)。

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

  • 输出缓冲区大小 = 明文字节数 + 16(CBC)或 + 16(GCM 密文)+ tag_len(GCM 额外)
  • 调用 EVP_EncryptFinal_ex 前,必须确保目标缓冲区还有足够空间,否则会写越界或返回失败
  • 错误检查不能只看返回值:要用 ERR_print_errors_fp(stderr) 看具体报错,常见如 error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt,说明密钥/IV/密文三者不匹配
  • 别忽略 EVP_CIPHER_CTX_free,反复创建 ctx 不释放会导致 OpenSSL 内部堆泄漏
加密配置不是加个 AES 调用就完事,真正的难点在密钥生命周期管理、结构体序列化的确定性、以及文件格式的向后兼容设计——这些地方一旦出错,轻则配置无法读取,重则引入隐蔽的安全漏洞。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5959

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

949

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2740

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2098

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4454

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4591

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5959

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2925

2024.08.29

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn