Missing cipher key

Контекст, используемый для шифрования или расшифровки, связан с ключом NULL или не связан с ключом

Описание

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

Примечание

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

Риск

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

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

Перед вашими шагами шифрования или дешифрования

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

Иногда вы инициализируете контекст шифра с помощью ключа, не являющегося NULL

ret = EVP_EncryptInit_ex(&ctx, cipher_algo_1, NULL, key, iv)
но измените алгоритм шифрования позже. Когда вы меняете алгоритм шифрования, вы используете ключ NULL.
 ret = EVP_EncryptInit_ex(&ctx, cipher_algo_2, NULL, NULL, NULL)
Второй оператор инициализирует контекст шифра полностью, но с помощью ключа NULL. Чтобы избежать этой проблемы, каждый раз, когда вы инициализируете контекст шифра с помощью алгоритма, связывайте его с ключом.

Примеры

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


#include <openssl/evp.h>
#include <stdlib.h>
#define fatal_error() abort()

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *iv, unsigned char *src, int len){
    if (iv == NULL)
        fatal_error();
    
    /* Fourth argument is cipher key */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, NULL, iv); 
    
    /* Update step with NULL key */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

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

Коррекция - Используйте ключ случайного шифра

Используйте сильный генератор случайных чисел, чтобы создать ключ шифра. Исправленный код здесь использует функцию RAND_bytes объявлен в openssl/rand.h.


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define fatal_error() abort()
#define SIZE16 16

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *iv, unsigned char *src, int len){
    if (iv == NULL)
        fatal_error();
    unsigned char key[SIZE16];
    RAND_bytes(key, 16);
    
    /* Fourth argument is cipher key */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update step with non-NULL cipher key */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

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

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