OpenSSL RSA 解密随机失败 C/C++



我正在实现RSA算法,其中我分别从.crt和.pem证书中读取公钥和私钥。它正确加密数据,但问题出在解密上。有时它解密得很好,有时它会给出以下错误:

解密消息时出错:错误:04099079:RSA 例程:RSA_padding_check_PKCS1_OAEP_mgf1:OAEP 解码错误。

当以下条件为 true 时,解密将失败

if ((decrypt_len = RSA_private_decrypt(strlen(c), (unsigned char*)c,
(unsigned char*)decrypt, rsa, RSA_PKCS1_OAEP_PADDING)) == -1)

代码块给出如下:

void DecryptRSA(const char *message)
{
char *privateCertPath = "privateCertificate.pem";
const char *msg = message; //message in base64 characters
BIO *bo = BIO_new_file(privateCertPath, "rb");
EVP_PKEY *pri;
OpenSSL_add_all_algorithms();
pri = PEM_read_bio_PrivateKey(bo, NULL, NULL,  NULL);
if (pri == NULL) {
/* Error */
}
RSA* rsa = EVP_PKEY_get1_RSA(pri);
unsigned char *decrypt = (unsigned char *) malloc(RSA_size(rsa));
int decrypt_len;
char *err = (char *) malloc(130);
string msgascii = base64_decode(msg); //converting 
const char *c = msgascii.c_str();   
if ((decrypt_len = RSA_private_decrypt(strlen(c), (unsigned char*)c,
(unsigned char*)decrypt, rsa, RSA_PKCS1_OAEP_PADDING)) == -1)
{
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), err);
fprintf(stderr, "Error decrypting message: %sn", err);     
}
printf("%s", decrypt);
RSA_free(rsa);
BIO_free(bo);
free((char*)msg);
free((char*)c);
free(decrypt);  
free(err);  
}

在 if 条件中使用 strlen(c( 会导致加密字符包含空字符时 char 数组终止,因此我使用 msgascii.size(( 并解决了这个问题。

最新更新