メインコンテンツ

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

RSA アルゴリズム演算のパディングに互換性がありません

コンテキストに設定されたパディング タイプで暗号化操作がサポートされていない

説明

この欠陥は、事前に関連付けられたパディングと互換性がないコンテキスト オブジェクトに対して RSA アルゴリズム演算を実行した場合に発生します。

たとえば、OAEP パディング スキームとコンテキスト オブジェクトを関連付けたものの、後で、署名検証にこのコンテキストを使用する場合です。署名検証はこのパディング スキームでサポートされていない操作です。

ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
...
ret = EVP_PKEY_verify(ctx, out, out_len, in, in_len);

リスク

パディング スキームは RSA アルゴリズムから確定性を排除し、特定の種類の攻撃から RSA 演算を保護します。

正しくないパディング スキームを使用すると、RSA 演算が失敗するか、予期しない暗号文になる可能性があります。

修正方法

RSA 演算を実行する前に、この演算と互換性のあるパディング スキームにコンテキスト オブジェクトを関連付けます。

  • 暗号化: OAEP パディング スキームを使用します。

    たとえば、引数 RSA_PKCS1_OAEP_PADDING を指定して関数 EVP_PKEY_CTX_set_rsa_padding を使用するか、関数 RSA_padding_add_PKCS1_OAEP を使用します。

    ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
    
    PKCS#1v1.5 または SSLv23 スキームを使用することもできます。これらのスキームは安全ではないと見なされていることに注意してください。

    次に、コンテキストに対して、EVP_PKEY_encrypt/EVP_PKEY_decryptRSA_public_encrypt/RSA_private_decrypt などの関数を使用することができます。

  • 署名: RSA-PSS パディング スキームを使用します。

    たとえば、引数 RSA_PKCS1_PSS_PADDING を指定して関数 EVP_PKEY_CTX_set_rsa_padding を使用します。

    ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING);
    ANSI X9.31、PKCS#1v1.5、または SSLv23 スキームを使用することもできます。これらのスキームは安全ではないと見なされていることに注意してください。

    次に、コンテキストに対して、EVP_PKEY_sign-EVP_PKEY_verify ペアや RSA_private_encrypt-RSA_public_decrypt ペアなどの関数を使用できます。

同じコンテキストを使用して 2 種類の操作を実行する場合、最初の操作後、2 番目の操作の前にコンテキストのパディング スキームをリセットします。

すべて展開する

#include <stddef.h>
#include <openssl/rsa.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();
  return RSA_private_encrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

この例では、関数 RSA_private_encrypt は、OAEP パディング スキームを使用して署名操作を実行していますが、このパディング スキームでは暗号化操作しかサポートしていません。

修正 — 署名をサポートするパディング スキームを使用

1 つの修正方法として、RSA-PSS パディング スキームを使用します。次の修正例では、関数 RSA_padding_add_PKCS1_PSS を使用してこのパディング スキームをコンテキストに関連付けています。

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

#define fatal_error() exit(-1)

int ret;
unsigned char *msg_pad;
unsigned char *out_buf;

int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error(); 

  ret = RSA_padding_add_PKCS1_PSS(rsa, msg_pad, src, EVP_sha256(), -2); 
  if (ret <= 0) fatal_error();

  return RSA_private_encrypt(len, msg_pad, out_buf, rsa, RSA_NO_PADDING); 
}

結果情報

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

バージョン履歴

R2018a で導入