Incorrect key for cryptographic algorithm

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

Описание

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

Например, вы инициализируете контекст с ключом для алгоритма 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++
По умолчанию: Off
Синтаксис командной строки : CRYPTO_PKEY_INCORRECT_KEY
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 310, 325, 573, 664
Введенный в R2018a