Openssl RSA зашифровать и расшифровать в C - PullRequest
0 голосов
/ 17 мая 2018

У меня есть пример кода, который шифрует сообщение с использованием закрытого ключа 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, но расшифрованная строка пуста.

сообщение об ошибке: Сообщение об ошибке расшифровки: ошибка: 0407008A: подпрограммы rsa: RSA_padding_check_PKCS1_type_1: недопустимое заполнение

1 Ответ

0 голосов
/ 17 мая 2018

Ваше входное сообщение msg является строкой с нулевым символом в конце, но когда вы зашифруете ее для получения буфера encrypted, это будет двоичный буфер, strlen (зашифрованный), который вы передаете в 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);
...