メインコンテンツ

暗号化アルゴリズムのキーが正しくありません

公開鍵の暗号化操作が、コンテキストの初期化で使用されたアルゴリズムでサポートされていない

説明

この欠陥は、特定のアルゴリズム用のキーを使用してコンテキスト オブジェクトを初期化したが、そのアルゴリズムでサポートされていない操作を実行した場合に発生します。

たとえば、DSA アルゴリズムのキーを使用してコンテキストを初期化します。

ret = EVP_PKEY_set1_DSA(pkey,dsa);
ctx = EVP_PKEY_CTX_new(pkey, NULL);
しかし、データを暗号化するためにそのコンテキストを使用します。データの暗号化は DSA アルゴリズムでサポートされていない操作です。
ret = EVP_PKEY_encrypt(ctx,out, &out_len, in, in_len);

リスク

アルゴリズムで暗号化操作がサポートされていない場合、期待どおりの結果が表示されません。たとえば、暗号化に DSA アルゴリズムを使用すると、予期しない暗号文になる可能性があります。

修正方法

以下のように、実行する暗号化操作に適したアルゴリズムを使用します。

  • Diffie-Hellman (DH): キー派生用。

  • デジタル署名アルゴリズム (DSA): 署名用。

  • RSA: 暗号化および署名用。

  • 楕円曲線 (EC): キー派生および署名用。

すべて展開する

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
size_t out_len;

int func(unsigned char *src, size_t len, DSA * dsa){
  EVP_PKEY_CTX *ctx;
  EVP_PKEY *pkey = NULL;

  pkey = EVP_PKEY_new();
  if(pkey == NULL) fatal_error();

  ret = EVP_PKEY_set1_DSA(pkey,dsa);
  if (ret <= 0) fatal_error();

  ctx = EVP_PKEY_CTX_new(pkey, NULL); 
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_encrypt_init(ctx); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_encrypt(ctx, out_buf, &out_len, src, len);  
}

この例では、DSA アルゴリズムに関連付けられたキーを使用してコンテキスト オブジェクトが初期化されています。しかし、このオブジェクトは暗号化に使用されます。暗号化は DSA アルゴリズムでサポートされていない操作です。

修正 — RSA アルゴリズムを使用

1 つの修正方法として、RSA アルゴリズムに関連付けられたキーを使用してコンテキスト オブジェクト初期化します。

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

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
size_t out_len;

int func(unsigned char *src, size_t len, RSA * rsa){
  EVP_PKEY_CTX *ctx;
  EVP_PKEY *pkey = NULL;

  pkey = EVP_PKEY_new();
  if(pkey == NULL) fatal_error();

  ret = EVP_PKEY_set1_RSA(pkey,rsa);
  if (ret <= 0) fatal_error();

  ctx = EVP_PKEY_CTX_new(pkey, NULL); /* RSA key is set in the context */
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_encrypt_init(ctx); /* Encryption operation is set in the context */
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
  if (ret <= 0) fatal_error();
  return EVP_PKEY_encrypt(ctx, out_buf, &out_len, src, len);  
}

結果情報

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

バージョン履歴

R2018a で導入