メインコンテンツ

キー生成のパラメーターが見つかりません

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

説明

この欠陥は、最初に必要なパラメーターに関連付けられていないコンテキスト オブジェクトを使用して、キー生成ステップを実行した場合に発生します。

たとえば、キー生成の前に、EVP_PKEY_CTX コンテキスト オブジェクトと空の EVP_PKEY オブジェクト params を関連付けます。

EVP_PKEY * params = EVP_PKEY_new();
...
EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new(params, NULL);
... 
EVP_PKEY_keygen(ctx, &pkey);

リスク

適切なパラメーターがないと、キー生成ステップが発生しません。冗長な操作は多くの場合、コーディング エラーを示します。

修正方法

キー生成ステップの配置をチェックします。操作が意図されている場合、キー生成の前にパラメーターが設定されていることを確認します。

特定のアルゴリズムでは既定のパラメーターを使用します。たとえば、EVP_PKEY_CTX オブジェクトを作成するときに DSA アルゴリズムを指定している場合、既定のキーの長さである 1024 ビットが使用されます。

kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DSA, NULL);
コンテキストの作成中にアルゴリズムを指定すれば、この欠陥を回避するには十分です。楕円曲線 (EC) アルゴリズムを使用する場合のみ、キー生成の前に曲線も明示的に指定しなければなりません。

ただし、既定のパラメーターで生成できるキーは暗号化にとって非常に脆弱です。脆弱なパラメーターは別の欠陥を引き起こす可能性があります。既定のパラメーターを変更するには、アルゴリズムに固有の関数を使用します。たとえば、パラメーターを設定するために、以下の関数を使用できます。

  • Diffie-Hellman (DH): EVP_PKEY_CTX_set_dh_paramgen_prime_len および EVP_PKEY_CTX_set_dh_paramgen_generator を使用します。

  • デジタル署名アルゴリズム (DSA): EVP_PKEY_CTX_set_dsa_paramgen_bits を使用します。

  • RSA: EVP_PKEY_CTX_set_rsa_paddingEVP_PKEY_CTX_set_rsa_pss_saltlenEVP_PKEY_CTX_set_rsa_rsa_keygen_bitsEVP_PKEY_CTX_set_rsa_keygen_pubexp を使用します。

  • 楕円曲線 (EC): EVP_PKEY_CTX_set_ec_paramgen_curve_nid および EVP_PKEY_CTX_set_ec_param_enc を使用します。

すべて展開する

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY * params = EVP_PKEY_new();
  if (params == NULL) fatal_error();

  EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new(params, NULL);
  if (ctx == NULL) fatal_error();

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

この例では、コンテキスト オブジェクト ctx が、空のパラメーター オブジェクト params に関連付けられています。このコンテキスト オブジェクトには、キー生成に必要なパラメーターがありません。

修正 — コンテキストの作成中にアルゴリズムを指定

1 つの修正方法として、コンテキストの作成中に RSA などのアルゴリズムを指定します。より強固な暗号化のために、キーの長さとして、既定の 1024 ビットではなく 2048 ビットを使用します。

#include <openssl/evp.h>
#include <openssl/rsa.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_NO_PARAMS
影響度: Medium

バージョン履歴

R2018a で導入