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
Удар: носитель
ID CWE: 310, 325, 573, 664
Введенный в R2018a