メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

RSA 公開指数がセキュリティで保護されていません

キー生成で使用されるコンテキストが低い指数値に関連付けられている

説明

この欠陥は、低い公開指数に関連付けられたコンテキスト オブジェクトを使用して、RSA キー生成を試みた場合に発生します。

たとえば、コンテキスト オブジェクトの公開指数を 3 に設定してから、そのコンテキスト オブジェクトをキー生成に使用します。

/* Set public exponent */
ret = BN_dec2bn(&pubexp, "3");

/* Initialize context */
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); 
pkey = EVP_PKEY_new();
ret = EVP_PKEY_keygen_init(kctx);

/* Set public exponent in context */
ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);

/* Generate key */
ret = EVP_PKEY_keygen(kctx, &pkey);

リスク

低い RSA 公開指数では、特に、脆弱なパディング スキームが使用されているかパディングがまったく使用されていない場合に、特定の種類の攻撃による被害が大きくなります。

修正方法

公開指数には 65537 を使用することが推奨されます。高い公開指数を使用するほど演算が低速になる可能性があります。

すべて展開する

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

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  BIGNUM* pubexp;
  EVP_PKEY_CTX* ctx;

  pubexp = BN_new();
  if (pubexp == NULL) fatal_error();
  ret = BN_set_word(pubexp, 3);
  if (ret <= 0) fatal_error();

  ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_keygen_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
  if (ret <= 0) fatal_error();
  return EVP_PKEY_keygen(ctx, &pkey);
}

この例では、RSA 公開指数として 3 がコンテキスト オブジェクト ctx に関連付けられています。この低い指数値では、生成されるキーを使用する操作が特定の攻撃に対して脆弱になります。

修正 — 公開指数に 65537 を使用

1 つの修正方法として、推奨される公開指数 65537 を使用します。

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

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  BIGNUM* pubexp;
  EVP_PKEY_CTX* ctx;

  pubexp = BN_new();
  if (pubexp == NULL) fatal_error();
  ret = BN_set_word(pubexp, 65537);
  if (ret <= 0) fatal_error();

  ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_keygen_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
  if (ret <= 0) fatal_error();
  return EVP_PKEY_keygen(ctx, &pkey);
}

結果情報

グループ: 暗号化
言語: C | C++
既定値: オフ
コマンド ライン構文: CRYPTO_RSA_LOW_EXPONENT
影響度: Medium

バージョン履歴

R2018a で導入