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

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

Описание

Слабое дополнение для алгоритма 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++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_RSA_WEAK_PADDING
Влияние: носитель
ID CWE: 310, 326, 327, 780

Введенный в R2018a