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

OpenSSL3.1 AES-XTS EVP接口分段加密计算结果异常问题

AES-XTS分段加密出错的问题修复

核心问题分析

你的代码存在两个关键错误,导致分段加密结果异常:

  1. 错误调用EVP_EncryptFinal_ex
    AES-XTS属于无填充的块加密模式,专为块设备数据设计,每个块的加密依赖递增的Tweak值,不需要也不支持填充操作。调用EVP_EncryptFinal_ex会强制尝试添加PKCS#7填充,直接破坏最后一个块的加密结果,甚至导致整个流程出错。

  2. 长度跟踪与变量笔误

  • EVP_EncryptFinal_ex中使用了未定义的ciphertext变量,应为out;
  • 分段处理时直接用out + i作为输出位置存在风险:EVP_EncryptUpdate的输出长度参数会被实际写入字节数覆盖,虽然XTS块对齐时输入输出长度一致,但正确做法是维护独立的输出偏移量,规避OpenSSL内部缓存可能导致的位置偏差。

修复后的代码

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdio.h>
#include <string.h>

void handleErrors(void)
{
    ERR_print_errors_fp(stderr);
    abort();
}

int sca_aes_xts_encrypt(const uint8_t *key, size_t klen, uint8_t *iv, const uint8_t *text, size_t len, uint8_t *out) {
    EVP_CIPHER_CTX *ctx;
    size_t ciphertext_len = 0;
    int block_size = EVP_CIPHER_block_size(EVP_aes_128_xts()); // 避免硬编码块大小

    if(!(ctx = EVP_CIPHER_CTX_new()))
            handleErrors();

    if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_xts(), NULL, NULL, NULL))
            handleErrors();

    if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_KEY_LENGTH, klen, NULL))
            handleErrors();

    // 强制禁用填充,XTS模式必须设置
    EVP_CIPHER_CTX_set_padding(ctx, 0);

    if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
            handleErrors();

    int processed;
    for(size_t i = 0; i < len; i += block_size) {
        int input_len = (len - i) >= block_size ? block_size : (int)(len - i);
        if(1 != EVP_EncryptUpdate(ctx, out + ciphertext_len, &processed, text + i, input_len))
            handleErrors();
        ciphertext_len += processed;
    }

    // XTS模式无需调用EVP_EncryptFinal_ex
    EVP_CIPHER_CTX_free(ctx);

    return (int)ciphertext_len;
}

额外注意事项

  • 必须禁用填充:通过EVP_CIPHER_CTX_set_padding(ctx, 0)确保OpenSSL不自动添加填充,这是XTS模式的硬性要求;
  • 动态获取块大小:用EVP_CIPHER_block_size()替代硬编码的16,提升代码对不同算法的兼容性;
  • 正确跟踪输出长度:用ciphertext_len和processed变量记录实际写入字节数,避免内部缓存引发的位置错误;
  • Tweak值自动维护:XTS的IV(初始Tweak)会在加密过程中由OpenSSL自动递增,分段处理时无需手动修改IV。

内容的提问来源于stack exchange,提问作者user14423706

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:24:50