OpenSSL 3.x中CRYPTO_ctr128_encrypt的替代API及弃用警告解决方法
OpenSSL 3.x 替代 CRYPTO_ctr128_encrypt 的解决方案
在OpenSSL 3.x中,CRYPTO_ctr128_encrypt和AES_encrypt这类低级加密接口已被标记为弃用,官方推荐使用EVP高级加密接口,这不仅能消除警告,还能提升代码的安全性和兼容性。
替代方案:使用EVP接口实现AES-CTR加密
以下是直接替换原有代码的完整实现:
#include <openssl/evp.h> // 替代原有CRYPTO_ctr128_encrypt调用的函数示例 int aes_ctr_encrypt(const unsigned char *in, unsigned char *out, size_t len, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv) { EVP_CIPHER_CTX *ctx = NULL; int out_len = 0; int total_len = 0; // 创建并初始化加密上下文 if (!(ctx = EVP_CIPHER_CTX_new())) { // 这里添加错误处理逻辑 goto cleanup; } // 初始化AES-CTR加密操作 if (EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv) != 1) { goto cleanup; } // 执行加密 if (EVP_EncryptUpdate(ctx, out, &out_len, in, len) != 1) { goto cleanup; } total_len += out_len; // 完成加密(CTR模式通常不会产生额外数据,但仍需调用) if (EVP_EncryptFinal_ex(ctx, out + total_len, &out_len) != 1) { goto cleanup; } total_len += out_len; cleanup: // 清理上下文 if (ctx) { EVP_CIPHER_CTX_free(ctx); } return total_len > 0 ? total_len : -1; } // 调用示例(对应你原有的代码逻辑) // 假设cipher->aes_key->key是AES密钥(128/192/256位),IV是16字节的初始向量 int result = aes_ctr_encrypt(in, out, len, EVP_aes_128_ctr(), cipher->aes_key->key, cipher->aes_key->IV); if (result == -1) { // 加密失败处理 }
关键说明:
- 根据你的密钥长度选择对应的EVP算法:
EVP_aes_128_ctr()、EVP_aes_192_ctr()或EVP_aes_256_ctr() - EVP接口自动处理CTR模式的计数器逻辑,无需手动维护
buffer和num变量(原代码中的这两个参数已被封装到上下文内部) - 必须检查每个EVP函数的返回值,确保操作成功
临时抑制警告(不推荐长期使用)
如果暂时无法迁移到EVP接口,可以通过定义宏来抑制弃用警告:
在编译时添加编译选项-DOPENSSL_SUPPRESS_DEPRECATED,或者在代码开头添加:
#define OPENSSL_SUPPRESS_DEPRECATED
但请注意,这只是临时方案,低级接口在未来版本中可能会被移除,建议尽快迁移到EVP接口。
内容的提问来源于stack exchange,提问作者Navidk
相关产品推荐
相关产品推荐

