Міністерство освіти і науки України
Житомирський державний технологічний університет
Лабораторна робота №3
з курсу "Системне програмування"
на тему: "Кодування файлу"
м. Житомир
2011 р.
Содержание
1. Технічне завдання
2. Вимоги до програми
3. Код програми
Висновок
Список використаної літератури
1. Технічне завдання
Програма повинна забезпечувати шифруванні і дешифруванні будь-яких файлів по довільному алгоритму з використанням пароля.
2. Вимоги до програми
1. Назва програми: Encode.
2. Iнтерфейс - командний рядок, в який вводяться режим роботи програми, пароль, а також імена файлів.
encode </e | /d> <File_to_code> [distination_file] [/p=password] Наприклад: encode /e myfile.txt myfile.cod /p=mypassword, де /e або /d - ключ який визначає шифрування або дешифрування; myfile.txt - специфікація файлу який має бути зашифрований; myfile.cod - специфікація файлу в який має бути записано зашифровану послідовність; /p=mypassword - пароль для шифрування.
3. Режим шифрування - ключ /e, режим дешифрування - ключ /d.
4. При невірному завданні параметрів програма повинна виводити інформацію про вірне завдання параметрів. Наприклад: encode </e | /d> <File_to_code> <distination_file> [/p=password]
5. Зашифрований файл повинен складатися із заголовку і кодованих даних.
6. Заголовок повинен містити: сигнатуру виду файлу;номер версії програми;рядок Copyright, із якого зрозуміло, якою програмою файл був зашифрований; контрольну суму, що повинна використатися в алгоритмі дешифрування; імя вихідного файлу для його відновлення при дешифруванні іншу інформацію на розсуд розробника.
7. Необхідно рахувати контрольну суму, яка буде контролювати правильність дешифрування. Найпростішій метод підрахунку контрольної суми - це сумування всіх байтів файлу.
8. Для виконання кодування даних можна використати будь який алгоритм. Найпростішим може бути алгоритм Гамування (гаммирования).Базується він на бітовій операції XOR.
програма кодування пароль гамування бітовий
#include <string.h>
#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <alloc.h>
#include <errno.h>
#define BUFSIZE 10000
char* buffer;
//структура для збереження заголовку
struct Header
{
char signat[3]; //сiгнатуру виду файлу;
int version; //номер версії програми;
char CopyRight[30]; //рядок Copyright
char filename[13];// імя вихідного файлу
unsigned long CRC; //контрольна сума
}header;
unsigned long Cryptographer(int count, char* pass, unsigned long conf, char* argv);
/***************************************************************************/
void main( int argc, char **argv )
{
int source, target;
int i;
int count;
unsigned long 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("Access denied! Password error! Please try again");
//закрити файли та звільнити память
close( source );
close( target );
free( buffer );
getch();
}
/***************************************************************************/
/* Функція приймає:
розмір тексту
пароль
поточну конторльну суму
ключ
Функція повертає:
конторльну суму
*/
unsigned long Cryptographer(int zise, char* password, unsigned long conf, char* key)
{
int Len = strlen( password );
int askikod;
int cur = 0;
for( int a=0; a<zise; 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. (бібліотека ЖІТІ)