C ++: fread читает каждый раз разные размеры - PullRequest
0 голосов
/ 17 мая 2019

вот мой код:

#include <openssl/err.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

#define KEY_LENGTH  2048
#define PUB_EXP     3
#define PRINT_KEYS
#define WRITE_TO_FILE

int main(void) {

    size_t pri_len;            // Length of private key
    size_t pub_len;            // Length of public key
    char   *pri_key;           // Private key
    char   *pub_key;           // Public key
    char   *msg = (char *)malloc(256);  // Message to encrypt
    char   *encrypt = NULL;    // Encrypted message
    char   *decrypt = NULL;    // Decrypted message
    char   *err = NULL;               // Buffer for any error messages
    size_t red;

    RSA *keypair = RSA_generate_key(KEY_LENGTH, 3, NULL, NULL);
    FILE *out;
    FILE *in;

    char *direct = (char*)malloc(256);


    if (fopen_s(&in, "test.txt", "r") != 0)
    {
        printf("in Error is %d.\n", GetLastError());
        return -1;
    }
    if (fopen_s(&out, "etest.txt", "w") != 0)
    {
        printf("out Error is %d.\n", GetLastError());
        return -1;
    }

    encrypt = (char *)malloc(RSA_size(keypair));

    setvbuf(out, encrypt, _IOFBF, RSA_size(keypair));

    for (;;)
    {
        red = fread(msg, 1, RSA_size(keypair) - 42, in);
        std::cout << "encrypt read -> " << red << std::endl;
        if (red == 0) break;
        if (((red = RSA_public_encrypt(RSA_size(keypair) - 42, (unsigned char*)msg, (unsigned char*)encrypt,
            keypair, RSA_PKCS1_OAEP_PADDING))) == -1) {
            ERR_load_crypto_strings();
            ERR_error_string(ERR_get_error(), err);
            fprintf(stderr, "Error encrypting message: %d\n", err);
        }
        std::cout << "encrypted size -> " << red << std::endl;
        if (fwrite(encrypt, 1, red, out) == 1)
        {
            printf("fwrite Error is %d (%d).\n", errno);
        }

    }

    fclose(in);
    fclose(out);

    if (fopen_s(&in, "etest.txt", "r") != 0)
    {
        printf("in Error is %d (%s).\n", errno);
    }
    if (fopen_s(&out, "dtest.txt", "w") != 0)
    {
        printf("out Error is %d (%s).\n", errno);
    }


    decrypt = (char *)malloc(RSA_size(keypair) - 42);

    for (;;)
    {
        red = fread(msg, 1, RSA_size(keypair), in);

        std::cout << "red decrypt -> " << red << std::endl;

        if (red < RSA_size(keypair)) break;
        if ((red = RSA_private_decrypt(red, (unsigned char*)msg, (unsigned char*)decrypt,
            keypair, RSA_PKCS1_OAEP_PADDING)) == -1) {

            ERR_load_crypto_strings();
            ERR_error_string(ERR_get_error(), err);
            fprintf(stderr, "Error decrypting message: %d\n", err);
        }

        fwrite(decrypt, 1, red, out);
        std::cout << decrypt << std::endl;



    }
    fclose(in);
    fclose(out);
    RSA_free(keypair);
    return 0;
}

Идея проста, у меня есть слово GIO в test.txt, я открываю его и шифрую, используя RSA ключи, которые я генерирую, затем язапишите зашифрованные данные в etest.txt, затем я открываю их и пытаюсь расшифровать и записать расшифрованные данные в dtest.txt.Это простой пример для образовательных целей.

Проблема, с которой я сталкиваюсь, заключается в том, что при шифровании данных RSA_public_encrypt возвращает 256, что здорово, я записываю 256 байт в etest.txt,Но когда я пытаюсь открыть один и тот же файл для расшифровки и прочитать из него, сообщение журнала std::cout << "red decrypt -> " << red << std::endl; возвращает другое количество.Например, иногда это 24, 47, 50 иногда даже 256.В случае 256 я открываю dtest.txt и вижу данные

GIOÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

, которые не зашифрованы.Поэтому мой вопрос: почему я каждый раз читаю различный объем данных из etest.txt?и почему я получаю неправильные расшифрованные данные, если я читаю 256 байт?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...