用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)才是推荐方式,它自动处理模式、填充、硬件加速等细节。
CBC是最常用且相对安全的模式,需16字节密钥(AES-128)、16字节IV(必须随机且每次不同),明文会自动PKCS#7填充:
避免裸指针和手动内存管理。用std::vector存密钥、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_ctr
l(ctx, EVP_CTRL_GET_RC, 0, &padding_len)或手动截去末尾填充字节(值等于填充长度)很多崩溃或解密失败源于忽略这些细节:
EVP_add_cipher(EVP_aes_128_cbc())(OpenSSL 1.1.0+通常自动注册,但静态链接或旧版本需显式调用)EVP_EncryptInit_ex重初始化)PBKDF2_HMAC派生密钥,盐值随机且唯一确保链接正确版本的OpenSSL库:
-lssl -lcrypto,头文件路径通常无需指定(系统已安装)libssl.lib和libcrypto.lib,并定义OPENSSL_NO_SSL3等宏避免警告brew install openssl再指定-I/opt/homebrew/include -L/opt/homebrew/lib