Weak padding for RSA algorithm

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

Описание

Слабое дополнение для алгоритма 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