You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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加密函数,传空指针必然触发非法访问导致核心转储。

正确调用步骤及示例

  1. 初始化必要变量:

    • AES_KEY:用AES_set_encrypt_key初始化(和原AES_ctr128_encrypt的密钥初始化逻辑完全一致)
    • ivec:16字节的初始计数器向量(IV+计数器,和原函数的ivec参数格式相同)
    • ecount_buf:16字节的加密计数缓冲区,必须初始化为全0
    • num:记录当前计数器块内已使用的字节数,初始化为0
  2. 完整调用代码示例:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:12:34