メインコンテンツ

RSA アルゴリズムのパディングが脆弱です

暗号化または署名操作で使用されるコンテキストが安全ではないパディング タイプと関連付けられている

説明

この欠陥は、脆弱なパディング スキームに前もって関連付けられたコンテキスト オブジェクトを使用して、RSA 暗号化または署名を実行した場合に発生します。

たとえば、PKCS#1v1.5 パディング スキームに関連付けられているコンテキスト オブジェクトを使用して、暗号化を実行します。このスキームは安全ではないと見なされており、既に解読されています。

ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING);
...
ret = EVP_PKEY_encrypt(ctx, out, &out_len, in, in_len)

リスク

パディング スキームは RSA アルゴリズムから確定性を排除し、特定の種類の攻撃から RSA 演算を保護します。PKCS#1v1.5、ANSI X9.31、SSLv23 などのパディング スキームは脆弱であることが知られています。暗号化操作または署名操作にこれらのパディング スキームを使用しないようにします。

修正方法

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);
    

    次に、コンテキストに対して、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);

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

すべて展開する

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

この例では、暗号化ステップに PKCS#1v1.5 パディング スキームが使用されています。

修正 — OAEP パディング スキームを使用

より強固な暗号化のために OAEP パディング スキームを使用します。

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

結果情報

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

バージョン履歴

R2018a で導入