Missing cipher algorithm

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

Описание

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

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

Риск

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

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

ret = EVP_EncryptInit(&ctx, EVP_aes_128_cbc(), key, iv)
Функция EVP_aes_128_cbc() указывает, что алгоритм Advanced Encryption Standard (AES) должен использоваться для шифрования. Функция также задает размер блока 128 бит и режим Cipher Bloch Chaining (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 вызывает алгоритм Advanced Encryption Standard (AES). Стандартная программа также задает размер блока 128 бит и режим Cipher Block Chaining (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++
По умолчанию: Off
Синтаксис командной строки: CRYPTO_CIPHER_NO_ALGORITHM
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 310, 573
Введенный в R2017a