Міністерствоосвіти і науки України
Житомирський державний технологічний університет
Лабораторнаробота №3
зкурсу «Системне програмування»
натему: «Кодування файлу»
м.Житомир
2011р.
Содержание
1. Технічне завдання
2. Вимоги до програми
3.Код програми
Висновок
Список використаноїлітератури
1. Технічне завдання
Програмаповинна забезпечувати шифруванні і дешифруванні будь-яких файлів по довільному алгоритму звикористанням пароля.
2. Вимоги до програми
1. Назвапрограми: Encode.
2. Iнтерфейс — командний рядок, в який вводяться режим роботи програми,пароль, а також імена файлів.
encode [distination_file] [/p=password] Наприклад: encode /e myfile.txtmyfile.cod /p=mypassword, де /e або /d — ключ який визначає шифрування абодешифрування; myfile.txt — специфікація файлу який має бути зашифрований; myfile.cod- специфікація файлу в який має бути записано зашифровану послідовність; /p=mypassword- пароль для шифрування.
3. Режим шифрування — ключ /e, режим дешифрування — ключ /d.
4. При невірномузавданні параметрів програма повинна виводити інформацію про вірне завданняпараметрів. Наприклад: encode [/p=password]
5. Зашифрованийфайл повинен складатися із заголовкуі кодованих даних.
6. Заголовокповинен містити: сигнатуру виду файлу;номер версії програми; рядок Copyright, із якого зрозуміло, якоюпрограмою файл був зашифрований; контрольну суму, що повинна використатися валгоритмі дешифрування; імя вихідного файлу для його відновлення придешифруванні іншу інформацію на розсуд розробника.
7. Необхіднорахувати контрольну суму, яка буде контролювати правильність дешифрування.Найпростішій метод підрахунку контрольної суми — це сумування всіх байтівфайлу.
8. Для виконаннякодування даних можна використати будь який алгоритм. Найпростішим може бутиалгоритм Гамування (гаммирования). Базується він на бітовій операції XOR.3. Код програми
програма кодування пароль гамування бітовий
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineBUFSIZE 10000
char*buffer;
//структурадля збереження заголовку
structHeader
{
charsignat[3]; //сiгнатуру виду файлу;
intversion; //номер версії програми;
charCopyRight[30]; //рядок Copyright
charfilename[13];// імя вихідного файлу
unsignedlong CRC; //контрольна сума
}header;
unsignedlong Cryptographer(int count, char* pass, unsigned long conf, char* argv);
/***************************************************************************/
voidmain( int argc, char **argv )
{
intsource, target;
inti;
intcount;
unsignedlong CRCM = 0;
clrscr();
//перевіркакількості аргументів командного рядка
if(argc != 5 )
{
printf("\nUsage:"
"\tMYENCODE\n"
"\t[d:][\\path]\\oriuginal_file\n"
"\t[d:][\\path]\\target_file\n"
"\tpassword\n"
"\tidenteficator(\e or \d )\n" );
getch();
exit(1 );
}
//відкриваємовихідний файл
source= open( argv[ 1 ], O_BINARY | O_RDONLY );
//обробкапомилки відкриття файлу
if(source == -1 )
{
printf("\nOpen source file error: %d", errno );
getch();
exit(2 );
}
//створюємоновий файл куди зпишим код
target= open( argv[ 2 ],
O_BINARY| O_WRONLY | O_CREAT | O_EXCL,
S_IREAD| S_IWRITE );
//перевіряємона наявність одноіменного файлу
//тазапитуємо користувача про необхідність його заміни новим
if(errno == EEXIST )
{
printf("\nFile already exists. Overwrite? (Y/N)\n" );
i= getch();
if(( i == 'y' ) || ( i == 'Y' ) )
target= open( argv[ 2 ],
O_BINARY| O_WRONLY | O_CREAT | O_TRUNC,
S_IREAD| S_IWRITE );
}
//обробкапомилки створеннянового файлу
if(target == -1 )
{
printf("\nOpen target file error: %d", errno );
getch();
exit(2 );
}
//якщопотрібно декодувати файл,
//тозчитуємо із закодованого файлу заголовок
if(strcmp(argv[4],"/d") == 0)
read(source,&header, sizeof(struct Header));
//якщопотрібно кодувати файл,
//тозаписуємо заголовок до файлу з кодом
if(strcmp(argv[4], "/e") == 0 )
{
strcpy(header.signat,«AY»);
header.version= 1;
strcpy(header.CopyRight,«Uncode»);
header.CRC= 0;
strcpy(header.filename,argv[1 ]);
write(target,&header,sizeof(struct Header));
}
//виділяємопамять для символьного масиву
count= BUFSIZE;
if(( buffer = ( char* )malloc( count ) ) == NULL )
{
printf("\nNot enough memory" );
getch();
exit(3 );
}
while(!eof( source ) )
{
//зчитуємоблок символів з вихідного файлу
count= read( source, buffer, count )
if(count == -1 )
{
printf("\nRead file error: %d", errno );
getch();
exit(4 );
}
//кодуємозчитані символи
CRCM+= Cryptographer(count,argv[3],CRCM,argv[4]);
//записуємоблок закодованих символів до вхідного файлу
count= write( target, buffer, count )
if(count == -1 )
{
printf("\nWrite file error: %d", errno );
getch();
exit(5 );
}
}
//якщопотрібно кодувати файл,
//топерезаписуємо заголовок файлу з кодом виправляючи контрольну суму
if(strcmp(argv[4],"/e")==0)
{
header.CRC= CRCM;
lseek(target,0L, 0);
write(target,&header, sizeof(struct Header));
}
//якщопотрібно декодувати файл,
if(strcmp(argv[4],"/d")==0)
//топорівнюємо контрольну суму
if(header.CRC!=CRCM)
printf(«Accessdenied! Password error! Please try again»);
//закритифайли та звільнити память
close(source );
close(target );
free(buffer );
getch();
}
/***************************************************************************/
/*Функція приймає:
розміртексту
пароль
поточнуконторльну суму
ключ
Функціяповертає:
конторльнусуму
*/
unsignedlong Cryptographer(int zise, char* password, unsigned long conf, char* key)
{
intLen = strlen( password );
intaskikod;
intcur = 0;
for(int a=0; a
{
if(cur > Len )
cur= 0;
//якщоварто декодувати
if(strcmp(key,"/d")==0)
{
buffer[a]^= password[cur];
askikod= buffer[a];
conf+= askikod;
}
//якщоварто закодувати
if(strcmp(key,"/e")==0)
{
askikod= buffer[a];
conf+= askikod;
buffer[a]^= password[cur];
}
cur++;
}
return(conf);
}
/***************************************************************************/
/>Висновок
Отже,на даній лабораторній роботі було реалізовано програму для кодування тадекодування файлів. Утиліта забезпечує можливість закодувати та розкодуватифайл (закодований цією ж програмою) за простим алгоритмом Гамування.
Програмнийкод може бути легко змінений з метою заміни алгоритму кодування\декодування.Для цього варто лише замінити функцію Cryptographer(), у якій буде реалізовано свій методобробки даних.
/>Список використаноїлітератури
1. Касаткін А.І. Управление ресурсами. — Минск: Вышейшая школа, 1992.
2. Касаткін А.І. Системное программирование.- Минск: Вышейшая школа, 1991.
3. Власенко О.В., Данильченко О.М., Северин О.О. Системнепрогрмамування. Курс лекцій. Частина 1. (бібліотека ЖІТІ)