exponenta event banner

Отсутствует алгоритм шифрования

Алгоритм шифрования или дешифрования не связан с контекстом шифра

Описание

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

Контекст шифра можно инициализировать без алгоритма. Однако перед шифрованием или расшифровкой данных необходимо связать контекст шифра с алгоритмом шифра.

Риск

Отсутствующий алгоритм шифрования может привести к ошибкам во время выполнения или, по крайней мере, к незащищенному шифротексту.

Перед шифрованием или расшифровкой настраивается контекст шифра, имеющий информацию, необходимую для шифрования: алгоритм и режим шифра, ключ шифрования или дешифрования и вектор инициализации (для режимов, требующих векторов инициализации).

ret = EVP_EncryptInit(&ctx, EVP_aes_128_cbc(), key, iv)
Функция EVP_aes_128_cbc() указывает, что для шифрования должен использоваться алгоритм AES. Функция также определяет размер блока 128 бит и режим цепочки блоков шифрования (CBC).

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

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

Перед выполнением операций шифрования или дешифрования

 ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len)
связать контекст шифра ctx с алгоритмом.
ret = EVP_EncryptInit(ctx, EVP_aes_128_cbc(), key, iv)

Примеры

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


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

unsigned char key[SIZE16];
unsigned char iv[SIZE16];
void func(void) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();       
    EVP_CIPHER_CTX_init(ctx);
    EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv); 
}

В этом примере алгоритм не предоставляется, когда контекст шифра ctx инициализирован.

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

Исправление - предоставление алгоритма во время инициализации

Одной из возможных корректировок является предоставление алгоритма при инициализации контекста шифра. В приведенном ниже исправленном коде подпрограмма EVP_aes_128_cbc вызывает алгоритм AES (Advanced Encryption Standard). Процедура также определяет размер блока 128 бит и режим цепочки блоков шифрования (CBC) для шифрования.


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

unsigned char key[SIZE16];
unsigned char iv[SIZE16];
void func(unsigned char *src, int len, unsigned char *out_buf, int out_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);
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_CIPHER_NO_ALGORITHM
Воздействие: среднее
CWE ID: 310, 573
Представлен в R2017a