【问题标题】:Openssl RSA encrypt and decrypt in COpenssl RSA在C中加密和解密
【发布时间】:2018-10-27 12:07:25
【问题描述】:

我有一个示例代码,它使用 PEM 私钥加密消息并使用 PEM 公钥对其进行解密,但最后解密结果为空。

    const char * msg = "this is a test message";
    //********************Encrypt*******************************
    if ((pFile = fopen("private.pem", "rt")) &&
        (rsa = PEM_read_RSAPrivateKey(pFile, NULL, passwd_callback, (void*)pcszPassphrase)))
    {
        fprintf(stderr, "Private key read.\n");

        RSA_private_encrypt(strlen(msg), (unsigned char *)msg, encrypted, rsa, RSA_PKCS1_PADDING);
        fclose(pFile);
    }
    //********************Decrypt*******************************
    pFile = fopen("pubkey.pem", "rt");
    if (rsa = PEM_read_RSAPublicKey(pFile, NULL, NULL, NULL))
    {
        RSA_public_decrypt(strlen((char *)encrypted), encrypted, decrypted, rsa, RSA_PKCS1_PADDING);
        ERR_load_crypto_strings();
        char * err = (char *)malloc(130);
        ERR_error_string(ERR_get_error(), err);
        fprintf(stderr, "Error decrypting message: %s\n", err);
    }

结果 RSA_public_decrypt 的输出为 1 但解密后的字符串为空。

错误消息:解密错误消息:error:0407008A:rsaroutines:RSA_padding_check_PKCS1_type_1:invalid padding

【问题讨论】:

    标签: c encryption openssl rsa pem


    【解决方案1】:

    您的输入消息msg 是一个以空字符结尾的字符串,但是当您对其进行加密以获取encrypted 缓冲区时,它将是二进制缓冲区,您传递给 RSA_public_decrypt() 的 strlen(encrypted) 将无效。

    所以改变

    RSA_public_decrypt(strlen((char *)encrypted), encrypted, 
    decrypted, rsa, RSA_PKCS1_PADDING);
    

    RSA_public_decrypt(RSA_size(rsa), encrypted, 
    decrypted, rsa, RSA_PKCS1_PADDING);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多