c - 不稳定的 openssl/rsa 行为 : RSA_EAY_PRIVATE_DECRYPT:padding check failed

标签 c perl encryption openssl rsa

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

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

稍后,在监听循环中,调用私有(private)解密算法的方法

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 对数据进行了加密:

    我的 $rsa_pub = Crypt::OpenSSL::RSA->new_public_key( $key_string);
    我的 $ciphertext = $rsa_pub->encrypt( $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

最佳答案

它是多线程应用程序吗?

我昨天遇到了同样的问题,就我而言,它与使用 key 的多个线程有关(一个用于解密,许多其他线程用于加密)。解决了使用互斥信号量保护 key 的问题。

服务从昨天开始稳定运行。

关于c - 不稳定的 openssl/rsa 行为 : RSA_EAY_PRIVATE_DECRYPT:padding check failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898211/

相关文章:

mysql - 加密Mysql数据库存储在磁盘上的文件

CMake 指示编译器不支持标志,但它支持

c - 程序集 x86 - "leave"指令

使用按位运算符比较 float

perl - 当表单发布到我的脚本时,如何访问 URL 中传递的参数?

Perl 发布请求以 base64 格式发送 zip 文件?

php - 好的编程软件

performance - Perl 应用程序是否有类似 "New Relic"的内容?

Java AES-256-CBC 未按预期工作

c# - Vigenere Square Lookup(使用字符串数组)