Missing cipher final step

Вы не выполняете последний шаг после шагов обновления для шифрования или расшифровки данных

Описание

Этот дефект возникает, когда вы не выполняете последний шаг после шагов обновления для шифрования или расшифровки данных.

Например, вы делаете следующее:

/* Initialization of cipher context */
ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
...
/* Update step */
ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len);
...
/* Missing final step */
...
/* Cleanup of cipher context */
EVP_CIPHER_CTX_cleanup(ctx);

Риск

Блочные шифры разбивают ваши данные на блоки фиксированного размера. Во время шифрования или расшифровки шаг обновления шифрует или расшифровывает ваши данные в блоках. Все оставшиеся данные шифруются или расшифровываются на заключительном этапе. Заключительный шаг добавляет заполнение к оставшимся данным так, чтобы оно занимало один блок, и затем шифрует или расшифровывает заполненные данные.

Если вы не выполняете последний шаг, оставшиеся в частичном блоке данные не шифруются и не расшифровываются. Вы можете столкнуться с неполным или неожиданным выходом.

Зафиксировать

После ваших шагов обновления для шифрования или расшифровки, выполните последний шаг, чтобы зашифровать или расшифровать оставшиеся данные.

/* Initialization of cipher context */
ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
...
/* Update step(s) */
ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len);
...
/* Final step */
ret = EVP_EncryptFinal_ex(&ctx, out_buf, &out_len);
...
/* Cleanup of cipher context */
EVP_CIPHER_CTX_cleanup(ctx);

Примеры

расширить все


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

unsigned char *out_buf;
int out_len;
unsigned char key[SIZE16];
unsigned char iv[SIZE16];

void func(unsigned char *src, int len) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    
    /* Update steps for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);   
    
    /* Missing final encryption step */
    
    /* Cleanup of cipher context */
    EVP_CIPHER_CTX_cleanup(ctx); 
}

В этом примере контекст шифра ctx очищается перед заключительным шагом шифрования. На заключительном этапе предполагается шифрование оставшихся данных. Без последнего шага шифрование является неполным.

Коррекция - Выполните заключительный шаг шифрования

После шагов обновления для шифрования выполните заключительный шаг шифрования, чтобы зашифровать оставшиеся данные. В исправленном коде ниже, стандартная программа EVP_EncryptFinal_ex используется для выполнения этого последнего шага.


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

unsigned char *out_buf;
int out_len;
unsigned char key[SIZE16];
unsigned char iv[SIZE16];

void func(unsigned char *src, int len) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    
    /* Update steps for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);   
    
    /* Final encryption step */
    EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
    
    /* Cleanup of cipher context */
    EVP_CIPHER_CTX_cleanup(ctx); 
}

Информация о результатах

Группа: Криптография
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: CRYPTO_CIPHER_NO_FINAL
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 311, 325, 372, 664
Введенный в R2017a