在RHEL8.8上如何用C语言正确调用libcrypto.so.1.1的CRYPTO_ctr128_encrypt?
解决CRYPTO_ctr128_encrypt调用的核心转储问题
首先纠正一个误解:block128_f不是结构体,而是OpenSSL定义的函数指针类型,指向块加密函数,原型为:
typedef void (*block128_f)(const unsigned char *in, unsigned char *out, const AES_KEY *key);
对于AES-CTR模式,你需要传入AES_encrypt这个函数指针作为该参数——因为CTR模式的核心是用ECB模式加密计数器块生成密钥流,AES_encrypt就是标准的AES-ECB加密函数,传空指针必然触发非法访问导致核心转储。
正确调用步骤及示例
初始化必要变量:
AES_KEY:用AES_set_encrypt_key初始化(和原AES_ctr128_encrypt的密钥初始化逻辑完全一致)ivec:16字节的初始计数器向量(IV+计数器,和原函数的ivec参数格式相同)ecount_buf:16字节的加密计数缓冲区,必须初始化为全0num:记录当前计数器块内已使用的字节数,初始化为0
完整调用代码示例:
#include <openssl/aes.h> void aes_ctr_encrypt(const unsigned char *plaintext, unsigned char *ciphertext, size_t length, const unsigned char *key, int key_bits, const unsigned char *ivec) { AES_KEY aes_key; unsigned char ecount_buf[AES_BLOCK_SIZE] = {0}; unsigned int num = 0; // 初始化AES加密密钥(和原逻辑一致) AES_set_encrypt_key(key, key_bits, &aes_key); // 调用CRYPTO_ctr128_encrypt,传入AES_encrypt作为block参数 CRYPTO_ctr128_encrypt(plaintext, ciphertext, length, &aes_key, (unsigned char *)ivec, ecount_buf, &num, AES_encrypt); }
关键注意事项
ivec、ecount_buf、num需保持状态连续性:如果是分段加密,每次调用后这三个变量会更新当前加密状态,下一次续加密必须传入同一组变量,不能重新初始化。- 参数逻辑需和原
AES_ctr128_encrypt对齐:ivec的格式、密钥长度、输入输出数据的处理逻辑完全一致,才能保证加密结果和原程序兼容。
内容的提问来源于stack exchange,提问作者Science Rocker
相关产品推荐
相关产品推荐

