Пропавшие без вести ослепляющий для алгоритма RSA

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

Описание

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

Например, вы не включаете ослепление в объекте контекста rsa перед этим шагом дешифрования:

  ret = RSA_public_decrypt(in_len, in, out, rsa, RSA_PKCS1_PADDING)

Риск

Без ослепления время это берет для криптографической операции, которая будет завершена, имеет корреляцию со значением ключа. Атакующий может собрать информацию о ключе RSA путем измерения времени для завершения. Ослепление удаляет эту корреляцию и защищает операцию дешифрования или верификации от атак временным анализом.

Фиксация

Прежде, чем выполнить дешифрование RSA или верификацию подписи, позвольте ослепить.

ret = RSA_blinding_on(rsa, NULL);

Примеры

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

#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();

  RSA_blinding_off(rsa);
  return RSA_private_decrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

В этом примере ослепление отключено для объекта контекста rsa. Дешифрование с этим объектом контекста может быть уязвимо для атак временным анализом.

Исправление — позволяет ослепить перед дешифрованием

Одно возможное исправление должно явным образом позволить ослепить перед дешифрованием. Даже если ослепление может быть включено ранее или по умолчанию, явным образом разрешение ослепления гарантирует, что безопасность текущего шага дешифрования не уверена в вызывающей стороне func.

#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();

  ret = RSA_blinding_on(rsa, NULL);
  if (ret <= 0) fatal_error();
  return RSA_private_decrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

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

Группа: криптография
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_RSA_NO_BLINDING
Влияние: носитель
ID CWE: 310, 326, 573

Введенный в R2018a