exponenta event banner

Слабое заполнение для алгоритма RSA

Контекст, используемый в операции шифрования или подписи, связан с незащищенным типом заполнения

Описание

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

Например, шифрование выполняется с помощью объекта контекста, связанного со схемой заполнения PKCS # 1v1.5. Схема считается небезопасной и уже нарушена.

ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING);
...
ret = EVP_PKEY_encrypt(ctx, out, &out_len, in, in_len)

Риск

Схемы заполнения удаляют детерминизм из алгоритма RSA и защищают операции RSA от определенных видов атак. Известно, что схемы заполнения, такие как PKCS # 1v1.5, ANSI X9.31 и SSLv23, являются уязвимыми. Не используйте эти схемы заполнения для операций шифрования или подписи.

Зафиксировать

Перед выполнением операции 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);
    

    Затем можно использовать такие функции, как 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);

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

Примеры

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

#include <stddef.h>
#include <openssl/rsa.h>
#include <openssl/evp.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_public_encrypt(len, src, out_buf, rsa, RSA_PKCS1_PADDING); 
}

В этом примере схема заполнения PKCS # 1v1.5 используется на этапе шифрования.

Исправление - использовать схему заполнения OAEP

Используйте схему заполнения OAEP для усиления шифрования.

#include <stddef.h>
#include <openssl/rsa.h>
#include <openssl/evp.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_public_encrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING); 
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_RSA_WEAK_PADDING
Воздействие: среднее
CWE ID: 310, 326, 327, 780
Представлен в R2018a