разбить файлы на блоки фиксированного размера в C

Меня просят разбить файлы на блоки фиксированного размера для шифрования файлов. В частности, у меня есть много файлов, которые могут быть двоичными или текстовыми.

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

Сценарий заключается в том, что пользователь создает резервные копии своих файлов на удаленном сервере, разбивая свои файлы на блоки, шифруя блоки (используя RSA), а затем отправляя зашифрованные тексты на сервер.

Рассмотрим два файла, один из которых представляет собой 33-битный текстовый файл A, а другой — 34-битный двоичный файл B.
A может быть разделен на два 32-битных блока A1 и A2 (последние 31 бит A2 — это все нули). ).
B может быть разделен на два 32-битных блока B1 и B2 (последние 30 битов B2 — все 0). Если я получаю A1 (или A2, B1, B2), то я рассматриваю A1 как 32-битное целое число и могу выполнять шифрование RSA.

Я умею писать код для RSA-шифрования, но, к сожалению, понятия не имею, как написать код на C для получения A1, A2, B1, B2.

Может ли кто-нибудь помочь мне написать пример кода или дать мне ссылку?


person user4478    schedule 20.12.2012    source источник
comment
Я всегда находил эти руководства полезными: cplusplus.com/doc/tutorial/files   -  person Lucian    schedule 20.12.2012
comment
Я не знаю ни одной компьютерной системы, в которой можно было бы иметь 33-битный текстовый файл. Файлы содержат целые байты, а не биты.   -  person unwind    schedule 20.12.2012
comment
Вы хотите сделать это на C или C++?   -  person netcoder    schedule 20.12.2012
comment
Я читал cplusplus.com/doc/tutorial/files раньше, но до сих пор не знаю идея как сделать. Например, на веб-странице говорится, что нам нужны разные коды для текстовых и двоичных файлов. Итак, стандартная процедура заключается в том, чтобы сначала узнать, является ли рассматриваемый файл двоичным или текстовым, а затем использовать различные фрагменты кода для их обработки?   -  person user4478    schedule 20.12.2012
comment
неуместно ли это делать в C/C++?   -  person user4478    schedule 20.12.2012
comment
@ user4478: Это уместно. Но C/C++ — это не язык: вам нужно выбрать, хотите ли вы делать это на C или на C++. Это очень разные языки. Выбери один.   -  person netcoder    schedule 20.12.2012
comment
Я больше знаком с C. Я выбираю C.   -  person user4478    schedule 20.12.2012
comment
При шифровании текстовые файлы можно безопасно рассматривать как двоичные файлы.   -  person brian beuning    schedule 20.12.2012
comment
В реальном RSA вы работаете с ключами от 700 до 4000 бит. Вы хотели бы зашифровать в блоках, которые являются наибольшим числом байтов меньше, чем ваш ключ. Например, с помощью 700-битного ключа вы зашифруете 87-байтовые блоки, потому что 87 * 8 = 696 бит.   -  person brian beuning    schedule 20.12.2012
comment
Итак, Брайан, ты имеешь в виду, что мне не нужно различать, читаю ли я текст или двоичный файл. Что мне нужно сделать, так это рассматривать каждый файл как двоичный файл, верно?   -  person user4478    schedule 20.12.2012
comment
Когда вы сообщаете исполняющим библиотекам, что файл является текстовым, они изменяют способ обработки символов конца строки. Для шифрования вам все равно.   -  person brian beuning    schedule 20.12.2012


Ответы (1)


Ниже приведен высокоуровневый алгоритм, который вы можете легко преобразовать в код C:

char* get_Next_Block_From_File(FILE *fp, int seek_offset, int blockSize)
{
    // Open file
    // lseek to seek_offset

    len = blockSize / 8;
    bit_pos = blockSize % 8;

    for (i=0; i<len; i++) {
        copy_from_file_to_local_buffer_byte_by_byte();
    }

    if (bit_pos) {
        byte[i] <<= (8 - bit_pos);
        append_byte_to_local_buffer();
    }

    return local_buffer;
}
person manav m-n    schedule 21.12.2012
comment
но я хочу знать, какую функцию я должен вызвать - person user4478; 26.12.2012