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

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

Описание

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

Например, вы инициализируете контекст с ключом для алгоритма 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