Недостающие данные о шифре к процессу

Итоговый шаг шифрования или дешифрования выполняется без предыдущих шагов обновления

Описание

Недостающие данные о шифре к процессу происходят, когда вы выполняете последний шаг шифрования блочного шифра или дешифрования неправильно.

Например, вы выполняете одно из следующих действий:

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

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Missing update step */
    ...
    /* Final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
  • Вы выполняете последовательные последние шаги без промежуточной инициализации и обновляете шаги.

    /* 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);
    ...
    /* Missing initialization and update */
    ...
    /* Second final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
  • Вы выполняете очистку контекста шифра и затем выполняете последний шаг.

    /* 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);
    ...
    /* Cleanup of cipher context */
    EVP_CIPHER_CTX_cleanup(ctx);
    ...
    /* Second final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);

Риск

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

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

Фиксация

Выполните шифрование или дешифрование в этой последовательности:

  • Инициализация контекста шифра

  • Обновите шаги

  • Последний шаг

  • Очистка контекста

Примеры

развернуть все


#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(void) {
    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);
    
    /* Missing update steps for encryption */
    
    /* Final encryption step */
    EVP_EncryptFinal_ex(ctx, out_buf, &out_len);           
}

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

Исправление — выполняет шаги обновления для шифрования перед последним шагом

Выполните шаги обновления для шифрования перед последним шагом. В исправленном коде ниже, стандартный EVP_EncryptUpdate выполняет шаги обновления.


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

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

Группа: криптография
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_CIPHER_NO_DATA
Влияние: носитель
ID CWE: 311, 325, 372, 664

Введенный в R2017a