メインコンテンツ

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

キー生成のパラメーターがセキュリティで保護されていません

キー生成に使用されるコンテキストが脆弱なパラメーターに関連付けられている

説明

この欠陥は、脆弱なパラメーターに関連付けられた EVP_PKEY_CTX コンテキスト オブジェクトを使用して、キー生成を試みた場合に発生します。脆弱なパラメーターの構成要素は使用する公開鍵 アルゴリズムによって決まります。DSA アルゴリズムでは、不十分なパラメーターの長さを設定した結果、脆弱なパラメーターになる可能性があります。

たとえば、DSA パラメーター生成に使用するビット数を 512 ビットに設定し、このパラメーターをキー生成に使用します。

EVP_PKEY_CTX *pctx,*kctx;
EVP_PKEY *params, *pkey;

/* Initializations for parameter generation */
pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DSA, NULL);
params = EVP_PKEY_new();

/* Parameter generation */
ret = EVP_PKEY_paramgen_init(pctx);
ret = EVP_PKEY_CTX_set_dsa_paramgen_bits(pctx, KEYLEN_512BITS);
ret = EVP_PKEY_paramgen(pctx, &params);

/* Initializations for key generation */
kctx = EVP_PKEY_CTX_new(params, NULL);
pkey = EVP_PKEY_new();

/* Key generation */
ret = EVP_PKEY_keygen_init(kctx);
ret = EVP_PKEY_keygen(kctx, &pkey);

リスク

脆弱なパラメーターは暗号の強固さが不十分なキーにつながり、既知の攻撃方法に機密情報をさらすことになります。

修正方法

アルゴリズムに応じて、以下のパラメーターを使用します。

  • Diffie-Hellman (DH): DH プライム パラメーターの長さを 2048 ビットに設定します。

    ret = EVP_PKEY_CTX_set_dh_paramgen_prime_len(pctx, 2048); 
    DH ジェネレーターを 2 または 5 に設定します。
    ret = EVP_PKEY_CTX_set_dh_paramgen_generator(pctx, 2);

  • デジタル署名アルゴリズム (DSA): DSA パラメーター生成に使用するビット数を 2048 ビットに設定します。

    ret = EVP_PKEY_CTX_set_dsa_paramgen_bits(pctx, 2048); 
    

  • RSA: RSA キーの長さを 2048 ビットに設定します。

    ret = EVP_PKEY_CTX_set_rsa_keygen_bits(kctx, 2048);

  • 楕円曲線 (EC): X9_62_prime256v1 など、解読されることがわかっている曲線の使用を避けます。たとえば、sect239k1 を使用します。

    ret = EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sect239k1);
    

すべて展開する

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

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY_CTX * 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, 512); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_keygen(ctx, &pkey); 
}

この例では、RSA キー生成に 512 ビットを使用しているため、生成されるキーが攻撃に対して脆弱になります。

修正 — 2048 ビットを使用

RSA キー生成に 2048 ビットを使用します。

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

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY_CTX * 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();
  return EVP_PKEY_keygen(ctx, &pkey); 
}

結果情報

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

バージョン履歴

R2018a で導入