вот мой код:
#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
байт?