портятся данные, почему?
считывается максимум для отправки в json формате наряду с другими данными, чтобы вместилось в 4096 байт. Чтобы было проще понять, привожу код. отправляю файл через gtk4 приложение.
unsigned char *cipher = malloc (16 * 200);
unsigned char *plain = malloc (16 * 200);
int iter = 0;
int buf_index = 0;
int readed;
int len;
int cipher_len;
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new ();
EVP_EncryptInit_ex (ctx, EVP_aes_128_cfb128 (), NULL, dtf->ckey, dtf->ivec);
dtf->is_start = 0;
while (1)
{
int readed = fread (plain, 1, 16 * 80, dtf->fp);
if (readed <= 0) break;
EVP_EncryptUpdate (ctx, cipher, &len, plain, readed);
cipher_len = len;
EVP_EncryptFinal_ex (ctx, cipher + len, &len);
cipher_len += len;
char *encrypted_data = to_print_hex (cipher, cipher_len);
build_and_send_block_data (dtf->name, dtf->filename, encrypted_data, dtf->eckey, dtf->eivec, dtf->is_start, dtf->self);
free (encrypted_data);
dtf->pos += readed;
vp->fraction = (double) (dtf->pos * 100) / (double) (dtf->size) / (double) (100.0);
if (vp->fraction > 1.0) vp->fraction = 1.0;
g_idle_add (set_fraction, vp);
dtf->is_start = 1;
}
EVP_CIPHER_CTX_free (ctx);
free (cipher);
free (plain);
в dtf->eckey и dtf->eivec зашифрованные ключи с помощью rsa. только на другой стороне можно их расшифровать, чтобы потом расшифровать эти данные.
В функции to_print_hex (cipehr, cipher_len) бинарные данные переводятся в читаемый hex формат, чтобы отправить по сети в формате json. отправляю пачкой.
на принимающей стороне код выглядит так.
char *ckey = _rsa_decrypt (private_key, eckey);
char *ivec = _rsa_decrypt (private_key, eivec);
size_t length;
unsigned char *hex = convert_data_to_hex (data, &length);
unsigned char *s = hex;
int num = 0;
FILE *afp;
if (pos == 0) {
afp = fopen (file_path, "w");
} else {
afp = fopen (file_path, "a");
}
unsigned char *b = malloc (size_buf + 1);
int plaintext_len;
{
EVP_CIPHER_CTX *ctx;
int len;
ctx = EVP_CIPHER_CTX_new ();
EVP_DecryptInit_ex (ctx, EVP_aes_128_cfb128 (), NULL, ckey, ivec);
EVP_DecryptUpdate (ctx, b, &len, hex, length);
plaintext_len = len;
EVP_DecryptFinal_ex (ctx, b + len, &len);
plaintext_len += len;
EVP_CIPHER_CTX_free (ctx);
//b[plaintext_len] = 0;
fwrite (b, 1, plaintext_len, afp);
}
когда файл принят и сохранен, он идентичен размеру тому, что был отправлен, но есть куски данных, которые отличаются от исходной картинки например. Мне вообще в голову ничего не приходит, что может быть? Еще я проверил щас данные. каждые 0x500 байт, то есть в начале каждого 0x500 байт, первые 16 байт отличаются от оригинала. и так каждая порция 0x500 байт. то есть начало нормальное в начале файла, а потом порченные данные после 0x500 (1280).
Ответы (1 шт):
Оказывается, что функцию:
EVP_EncryptInit_ex (ctx, EVP_aes_128_cfb128 (), NULL, dtf->ckey, dtf->ivec);
нужно вызывать каждый раз, перед шифрованием очередной строки.