用C++和OpenSSL做AES加解密应基于EVP接口(如EVP_EncryptInit_ex),采用CBC模式时需16字节随机IV与密钥,自动PKCS#7填充;使用std::vector管理内存,注意密钥派生、IV传输及OpenSSL版本兼容性。

用C++和OpenSSL做AES加解密,核心是正确使用EVP接口、管理密钥与IV、处理填充和内存安全。别直接调底层AES函数,EVP系列(如EVP_EncryptInit_ex)才是推荐方式,它自动处理模式、填充、硬件加速等细节。
AES加解密基本流程(CBC模式为例)
CBC是最常用且相对安全的模式,需16字节密钥(AES-128)、16字节IV(必须随机且每次不同),明文会自动PKCS#7填充:
- 加密:准备密钥和随机IV → 初始化EVP上下文 → 输入明文 → 获取密文(含可能的填充字节)
- 解密:用相同密钥和收到的IV → 初始化解密上下文 → 输入密文 → 输出原始明文(自动去填充)
- 注意:IV不用保密,但必须和密文一起传输;密钥绝不能硬编码,应安全派生(如用PBKDF2)或由密钥管理系统提供
关键代码片段(C++封装要点)
避免裸指针和手动内存管理。用std::vector存密钥、IV、明/密文:
- 生成随机IV:
RAND_bytes(iv.data(), iv.size());(iv为vector)(16) - 加密时调用
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), nullptr, key.data(), iv.data()) - 输出缓冲区大小至少为
input_len + AES_BLOCK_SIZE,因PKCS#7最多补16字节 - 解密后用
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GET_RC, 0, &padding_len)或手动截去末尾填充字节(值等于填充长度)
常见坑与安全提醒
很多崩溃或解密失败源于忽略这些细节:
家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l
立即学习“C++免费学习笔记(深入)”;
- 忘记调用
EVP_add_cipher(EVP_aes_128_cbc())(OpenSSL 1.1.0+通常自动注册,但静态链接或旧版本需显式调用) - 密钥或IV长度错误:AES-128要16字节,AES-256要32字节;IV长度必须等于块长(16)
- 复用同一EVP上下文做多次加解密而未重置(应每次新建或调用
EVP_EncryptInit_ex重初始化) - 把Base64解码后的密文当原始字节传入——确保输入是原始二进制,不是字符串
- 在生产环境直接用口令当密钥:应先用
PBKDF2_HMAC派生密钥,盐值随机且唯一
编译与链接注意事项
确保链接正确版本的OpenSSL库:
- Linux:编译加
-lssl -lcrypto,头文件路径通常无需指定(系统已安装) - Windows(MSVC):链接
libssl.lib和libcrypto.lib,并定义OPENSSL_NO_SSL3等宏避免警告 -
macOS:可能需用
brew install openssl再指定-I/opt/homebrew/include -L/opt/homebrew/lib - 运行时若报“symbol not found”或“undefined reference”,检查OpenSSL版本是否≥1.1.1(推荐1.1.1或3.x LTS)










