exponenta event banner

Неверный ключ для криптографического алгоритма

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

Описание

Этот дефект возникает при инициализации объекта контекста с ключом для определенного алгоритма, но при выполнении операции, которую алгоритм не поддерживает.

Например, контекст инициализируется ключом для алгоритма DSA.

ret = EVP_PKEY_set1_DSA(pkey,dsa);
ctx = EVP_PKEY_CTX_new(pkey, NULL);
Однако для шифрования данных используется контекст - операция, которую алгоритм DSA не поддерживает.
ret = EVP_PKEY_encrypt(ctx,out, &out_len, in, in_len);

Риск

Если алгоритм не поддерживает криптографическую операцию, ожидаемые результаты не отображаются. Например, при использовании алгоритма DSA для шифрования может появиться непредвиденный шифротекст.

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

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

  • Диффи-Хеллман (DH): Для вывода ключей.

  • Алгоритм цифровой подписи (DSA): для подписи.

  • RSA: для шифрования и подписи.

  • Эллиптическая кривая (EC): Для вывода ключей и сигнатуры.

Примеры

развернуть все

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
size_t out_len;

int func(unsigned char *src, size_t len, DSA * dsa){
  EVP_PKEY_CTX *ctx;
  EVP_PKEY *pkey = NULL;

  pkey = EVP_PKEY_new();
  if(pkey == NULL) fatal_error();

  ret = EVP_PKEY_set1_DSA(pkey,dsa);
  if (ret <= 0) fatal_error();

  ctx = EVP_PKEY_CTX_new(pkey, NULL); 
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_encrypt_init(ctx); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_encrypt(ctx, out_buf, &out_len, src, len);  
}

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

Коррекция - использовать алгоритм RSA

Одной из возможных корректировок является инициализация объекта контекста ключом, связанным с алгоритмом RSA.

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

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
size_t out_len;

int func(unsigned char *src, size_t len, RSA * rsa){
  EVP_PKEY_CTX *ctx;
  EVP_PKEY *pkey = NULL;

  pkey = EVP_PKEY_new();
  if(pkey == NULL) fatal_error();

  ret = EVP_PKEY_set1_RSA(pkey,rsa);
  if (ret <= 0) fatal_error();

  ctx = EVP_PKEY_CTX_new(pkey, NULL); /* RSA key is set in the context */
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_encrypt_init(ctx); /* Encryption operation is set in the context */
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
  if (ret <= 0) fatal_error();
  return EVP_PKEY_encrypt(ctx, out_buf, &out_len, src, len);  
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_PKEY_INCORRECT_KEY
Воздействие: среднее
CWE ID: 310, 325, 573, 664
Представлен в R2018a