Incompatible padding for RSA algorithm operation

Операция Cryptography не поддерживается дополнительным набором типа в контексте

Описание

Этот дефект происходит, когда вы выполняете операцию алгоритма RSA на объекте контекста, который не совместим с дополнением, ранее сопоставленным с объектом.

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

ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
...
ret = EVP_PKEY_verify(ctx, out, out_len, in, in_len);

Риск

Дополняющие схемы удаляют детерминизм из алгоритма RSA и защищают операции RSA от определенных видов нападения.

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

Фиксация

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

  • Шифрование: Используйте OAEP дополнение схемы.

    Например, используйте EVP_PKEY_CTX_set_rsa_padding функция с аргументом RSA_PKCS1_OAEP_PADDING или RSA_padding_add_PKCS1_OAEP функция.

    ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
    
    Можно также использовать схемы PKCS#1v1.5 или SSLv23. Следует иметь в виду, что эти схемы рассматриваются небезопасными.

    Можно затем использовать функции, такие как EVP_PKEY_encrypt / EVP_PKEY_decrypt или RSA_public_encrypt / RSA_private_decrypt на контексте.

  • Подпись: Используйте дополнительную схему RSA-PSS.

    Например, используйте EVP_PKEY_CTX_set_rsa_padding функция с аргументом RSA_PKCS1_PSS_PADDING.

    ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING);
    Можно также использовать ANSI X9.31, PKCS#1v1.5 или схемы SSLv23. Следует иметь в виду, что эти схемы рассматриваются небезопасными.

    Можно затем использовать функции, такие как EVP_PKEY_sign- EVP_PKEY_verify пара или RSA_private_encrypt- RSA_public_decrypt пара на контексте.

Если вы выполняете два вида операции с тем же контекстом, после первой операции, сбрасываете дополнительную схему в контексте перед второй операцией.

Примеры

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

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

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;

int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error();
  return RSA_private_encrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

В этом примере, функциональном RSA_private_encrypt выполняет операцию подписи при помощи OAEP дополнение схемы, которая поддерживает операции шифрования только.

Коррекция — дополнительная схема использования, которая поддерживает подпись

Одна возможная коррекция должна использовать дополнительную схему RSA-PSS. Откорректированный пример использует функциональный RSA_padding_add_PKCS1_PSS сопоставлять дополнительную схему с контекстом.

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

#define fatal_error() exit(-1)

int ret;
unsigned char *msg_pad;
unsigned char *out_buf;

int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error(); 

  ret = RSA_padding_add_PKCS1_PSS(rsa, msg_pad, src, EVP_sha256(), -2); 
  if (ret <= 0) fatal_error();

  return RSA_private_encrypt(len, msg_pad, out_buf, rsa, RSA_NO_PADDING); 
}

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

Группа: криптография
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: CRYPTO_RSA_BAD_PADDING
Удар: Средняя
ID CWE: 310, 372, 573, 664
Введенный в R2018a