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