不稳定的openssl / rsa行为:RSA_EAY_PRIVATE_DECRYPT:填充检查失败

时间:2013-06-03 13:43:03

标签: c perl encryption openssl rsa

我编写了一个使用<openssl/rsa> C库永久运行的程序 它基本上解密了参数中给出的密码。问题是,有时它可以完美地工作,有时它会失败(使用相同的pubkey / privkey /密码,返回此错误:

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-&gt; new_public_key($ key_string);
      我的$ ciphertext = $ rsa_pub-&gt;加密($ plaintext);

  • 有一些base64编码/解码,我没有提及它使它更短一点。问题不在于此。

  • 使用openssl genrsa生成私钥和公钥: openssl genrsa -out privkey.pem 1024openssl rsa -in privkey.pem -pubout > pubkey.pub

它似乎工作了一段时间,但偶尔(在请求的高峰期间,如果这很重要)我得到这些错误的加密数据似乎有效:

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

1 个答案:

答案 0 :(得分:1)

是多线程应用程序吗?

昨天我遇到了同样的问题,在我的情况下,它与使用密钥的多个线程相关(一个用于描述,另一个用于提示)。解决了使用互斥信号量保护密钥的问题。

自昨天以来,该服务一直保持稳定。