Missing cipher algorithm

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

Описание

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

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

Риск

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

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

ret = EVP_EncryptInit(&ctx, EVP_aes_128_cbc(), key, iv)
Функциональный EVP_aes_128_cbc() указывает, что алгоритм Усовершенствованного стандарта шифрования (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 вызывает алгоритм Усовершенствованного стандарта шифрования (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
Удар: носитель
ID CWE: 310, 573
Введенный в R2017a