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

问题描述 投票:0回答:1

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

解密消息时出错:错误:04099079:rsa例程:RSA_padding_check_PKCS1_OAEP_mgf1:oaep解码错误。

当以下if条件为真时,解密失败

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: %s\n", err);     
    }

    printf("%s", decrypt);

    RSA_free(rsa);
    BIO_free(bo);
    free((char*)msg);
    free((char*)c);
    free(decrypt);  
    free(err);  
}
c++ encryption openssl rsa
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.