Inconsistent cipher operations

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

Описание

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

Например, вы настраиваете контекст шифра для расшифровки, используя EVP_DecryptInit_ex.

EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
Тем не менее, вы используете контекст для шифрования, используя EVP_EncryptUpdate.
EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len); 

Риск

Микширование шагов шифрования и дешифрования может привести к неясному коду. Трудно с первого взгляда определить, используется ли текущий контекст шифра для шифрования или расшифровки. Микширование может также привести к расовым условиям, неудачному шифрованию и неожиданному зашифрованному тексту.

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

После настройки контекста шифра для определенного семейства операций используйте контекст только для этого семейства операций.

Например, если вы настраиваете контекст шифра для расшифровки, используя EVP_DecryptInit_exПосле этого используйте контекст только для расшифровки.

Примеры

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



#include <openssl/evp.h>
#include <stdlib.h>

/* Using the cryptographic routines */

unsigned char *out_buf;
int out_len;
unsigned char g_key[16];
unsigned char g_iv[16];
void func(unsigned char* src, int len) {
    
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);
    
    /* Cipher context set up for decryption*/
    EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, g_key, g_iv);

    /* Update step for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);        
}

В этом примере контекст шифра ctx настроен на расшифровку, используя EVP_DecryptInit_ex. Однако сразу после этого контекст используется для шифрования с помощью EVP_EncryptUpdate.

Коррекция - Изменение Setup шаге

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


#include <openssl/evp.h>
#include <stdlib.h>

unsigned char *out_buf;
int out_len;
unsigned char g_key[16];
unsigned char g_iv[16];

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

    /* Cipher context set up for encryption*/
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, g_key, g_iv);

    /* Update step for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);        
}

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

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