c - Openssl RSA在C中加密和解密

标签 c encryption openssl rsa pem

我有一个示例代码,它使用 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:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding

最佳答案

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

所以改变

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

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

关于c - Openssl RSA在C中加密和解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50387772/

相关文章:

c - 如何在 Linux 内核中为 char* 类型的字符串分配内存?

c - 我的程序创建了一个字符数组的缩写,但不打印任何内容。我的错误在哪里?

c - 使用线程从链表中删除元素

php - 通过 SSL 交换信息时是否需要加密数据?

certificate - 谁能告诉我CSR版本和证书版本之间的区别?

windows - 如何在 Windows 上使用 OpenSSL FIPS 静态库构建 DLL?

c - fgets()中的标识符错误

c# - 用jquery加密用户密码,用C#解密

php - codeigniter 加密在新服务器上返回错误

c++ - QSslServer 中客户端的对等证书在 Qt C++ 中始终为 Null