портятся данные, почему?

считывается максимум для отправки в 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 шт):

Автор решения: switcher

Оказывается, что функцию:

EVP_EncryptInit_ex (ctx, EVP_aes_128_cfb128 (), NULL, dtf->ckey, dtf->ivec);

нужно вызывать каждый раз, перед шифрованием очередной строки.

→ Ссылка