OpenSSL3.1 使用 EVP 接口的 AES-XTS C 示例 无法分段数据进行计算

问题描述 投票:0回答:1

对于AES-XTS加密,我想对数据进行分段输入计算,但是有问题。

#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;

    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();

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

    // if(1 != EVP_EncryptUpdate(ctx, out, &len, text, len))
    //         handleErrors();
    int block_size = 16;

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

    ciphertext_len = len;
    if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
            handleErrors();
    ciphertext_len += len;

    return ciphertext_len;
}

整个数据的计算结果是正确的,但是使用EVP_EncryptUpdate分割后的结果是错误的。 任何帮助表示赞赏。谢谢你。

c openssl xts segment
1个回答
0
投票

OpenSSL 中的 XTS 实现不支持流式传输。也就是说,每次 EVP_EncryptInit_ex(3) 调用只能有一次 EVP_EncryptUpdate(3) 调用(与“Decrypt”函数类似)。

© www.soinside.com 2019 - 2024. All rights reserved.