4

<openssl/rsa>C ライブラリを使用して永続的に実行されるプログラムを作成しました。
基本的に、引数で指定されたパスワードを復号化します。問題は、問題なく動作することもあれば、失敗することもあります (同じ pubkey/privkey/password を使用すると、次のエラーが返されます:

message: error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed

誰もそれを経験したことがありますか?一般に、この種のエラーが返されるのはなぜですか?


いくつかの詳細

プログラムの初期化時に、次のようにして秘密鍵を取得します。

#define PRIVFILE  "<correct-path>/privkey.pem"
EVP_PKEY *privKey;
int size_key;
FILE *fp = fopen(PRIVFILE, "r");
if (!fp) 
{
    <logs>
    return -1;
}
PEM_read_PrivateKey(fp, &privKey, 0, NULL);
fclose (fp);
 if (privKey == NULL)
{
    ERR_print_errors_fp (stderr);
    return -1;
}
size_key = EVP_PKEY_size(privKey);

その後、リッスン ループ中に、メソッドがプライベート復号化アルゴリズムを呼び出します。

int len_enc = size_key;
unsigned char* enc_pw;
unsigned char* dec_pw;
int len_dec = 8;
char* err = malloc(130);
enc_pw = malloc(len_enc);
dec_pw = malloc(len_dec);
memset(enc_pw, 0, len_enc);
memset(dec_pw, 0, len_dec);
memcpy(enc_pw, value, len_enc); //value being the raw ciphered data to decrypt
ERR_load_crypto_strings();
if (RSA_private_decrypt(len_enc, enc_pw, dec_pw, privKey->pkey.rsa,RSA_PKCS1_OAEP_PADDING) == -1)
{
ERR_error_string(ERR_get_error(), err);
radlog(L_ERR, "message: %s", err);
}
free(enc_pw);
free(dec_pw);
free(err);
  • Crypt::OpenSSL::RSA を使用して perl でデータを暗号化しました。

    my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key( $key_string);
    私の $ciphertext = $rsa_pub->encrypt( $plaintext);

  • 少し短くするために言及しなかったbase64エンコーディング/デコーディングがいくつかあります。問題はそこからではありません。

  • 秘密鍵と公開鍵は、openssl genrsa: openssl genrsa -out privkey.pem 1024で生成されます。openssl rsa -in privkey.pem -pubout > pubkey.pub

しばらくはうまくいくようですが、時折(リクエストのピーク時、それが重要な場合)、以前は有効だった暗号化されたデータに対して次のエラーが発生します。

message: error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
4

1 に答える 1

1

マルチスレッドアプリケーションですか?

私は昨日同じ問題を抱えていましたが、私の場合、それはキーを使用する複数のスレッドに関連していました (1 つは decrypt 用、もう 1 つは encript 用)。この問題は、ミューテックス セマフォでキーを保護することで解決されました。

昨日からサービスが安定してきています。

于 2014-08-14T14:38:07.660 に答える