разделяне на файлове на блокове с фиксиран размер в C

От мен се иска да разделя файловете на блокове с фиксиран размер, за да извърша криптирането на файла. По-конкретно, имам много файлове, които могат да бъдат двоични или текстови.

Помолен съм да напиша потребителска програма, която приема като входни данни тези файлове, разделя всеки файл на да речем много 32-битови блокове и след това изпраща 32-битовите блокове.

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

Да разгледаме два файла, единият е 33-битов текстов файл A, а другият е 34-битов двоичен файл B.
A може да бъде разделен на два 32-битови блока A1 и A2 (последните 31 bis на A2 са всички 0 ).
B може да бъде разделен на два 32-битови блока B1 и B2 (последните 30 bis на B2 са всички нули). Ако получа 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