【问题标题】:OpenSSL RSA Decryption fails randomly C/C++OpenSSL RSA 解密随机失败 C/C++
【发布时间】:2018-09-05 11:34:35
【问题描述】:

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

错误解密消息:error: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++,是吗?我的意思是,是的,您在 base-64 解码时使用一次 std::string(并且在必要的最短时间),但除此之外,它是纯 C 语言,您不会为 malloc 相关问题找到太多帮助现代 C++ 社区。拥有minimal reproducible example 真的很有帮助,尤其是如果您可以提供失败的输入。
  • 是的,我已经看到并尝试过这个链接。输入总是相同的。加密的字符不同,但长度相同。所以可能不是内存问题。
  • base64_decode 函数返回什么?是否会在 const char* 或类似的持有者中返回字节,有时 0 会导致字符串被截断?
  • @Max 我是 C/C++ 的初学者,所以请多多包涵。我认为我的问题足够清楚,可以得到答案。
  • 谢谢@hauron,你的回答帮我解决了问题

标签: c++ encryption openssl rsa


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多