Частичная расшифровка файла

176
14 ноября 2018, 11:20

Есть файлы, зашифрованные с помощью библиотеки Crypto++, алгоритм CBC.

const byte* key = ...;
const byte* iv = ...;
QByteArray dataChunck
CFB_Mode<AES>::Encryption encrypt(key, 32, iv);
encrypt.ProcessData((byte*)dataChunck.data(), (byte*)dataChunck.data(), dataChunck.size());

Расшифровка почти такая же:

CFB_Mode<AES>::Decryption encrypt(key, 32, iv);
encrypt.ProcessData((byte*)dataChunck.data(), (byte*)dataChunck.data(), dataChunck.size());

И все это работает, если декодировать файл с начала и до конца. Но вот появилась необходимость частичной расшифровки файла (для поддержки заголовка Range у HTTP сервера). Вариант в лоб - декодировать файл полностью и забирать оттуда только нужные байты. Но может есть способ, декодировать только нужные байты?

Если просто вместо dataChunk передавать нужный мне фрагмент, то получаю на выходе мусор, подозреваю что должно быть "правильное выравнивание" или еще соблюдать какой-то нюанс.

Answer 1

Проблема решена, результатом я доволен. Действительно ошибся немного в описание, шифрование CFB, а не CBC.

Методом проб и ошибок, стало ясно, что частичная расшифровка дает нормальный результат, если указывать диапазон кратный 16 байтам (это размер вектора инициализации), но при этом, первые 16 байт испорченные. Потому я получаю позицию, откуда нужно получить данные, смещаю её вниз до ближайшего числа, кратного 16 и затем еще отнимаю 16 байт (которые будут испорченные). Данные отправляем на декодирование, и от полученного результата отрезаем начало на лишнее количество байт.

qint64 roundToPrev16(qint64 _currentPos)
{
    const int magicDiv = 16;
    qint64 x = _currentPos / magicDiv;
    qint64 res = x * magicDiv;
    res -= 16;
    return res;
}

Итого оверхэд не слишком большой (не более 32 байт). А так как данный алгоритм используется при Range запросах на HTTP сервер, который актуален обычно для мультимедийных файлов и составляет 1-20 мбайт, то расшифровка лишних 32 байт не сказывается на производительности.

READ ALSO
Ограничить величину int c++?

Ограничить величину int c++?

Например есть

167
Приложение виснет при больших данных

Приложение виснет при больших данных

Да, допускаю, что сформулировал заголовок глупоДело вот в чём, есть приложение, часть которого занимается поиском директорий и определённых...

167
Ограничение доступа к интерфейсу DBus

Ограничение доступа к интерфейсу DBus

Начал изучать работу межпроцессного взаимодействия с помощью DBus в QtНачал с примера ping-pong

182
Неправильный вывод суммы матриц С++

Неправильный вывод суммы матриц С++

Начал повторять C++ и возникла проблема при суммировании матриц, что вывод 2-х матриц А и В нормальный, а при выводе матрицы А+В выходит вот что...

182