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
Удар: Средняя
ID CWE: 372, 664
Введенный в R2017a