СПЗ отчеты (Власенко О.В.) / 2
.docМіністерство освіти, науки, молоді та спорту України
Житомирський державний технологічний університет
ФІКТ
Кафедра ПЗОТ
Група ПІК-9
Лабораторна робота №2
Кодування файлу
Виконав : Оленюк О.О.
Перевірив : Власенко О.В.
Житомир
2012
Завдання:
Програма повинна забезпечувати шифрування і дешифрування будь- яких файлів по довільному алгоритму з використанням пароля.
Виконання роботи
1. Текст програми.
#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>
#include <string.h>
#define BUFSIZE 10000 \\ Оголошення константи
void main( int argc, char **argv ) { \\ Доступ до командної строчки
int source, target;
int i,j ;
int Suma ;
char *buffer, *parol;
int count;
unsigned int buf;
struct Zagolovok \\ Оголошення функції заголовка
{ char program[10];
char versia[14];
unsigned long summa;
char namefile[10]; } zagol;
buf = sizeof(struct Zagolovok);
if( argc != 5 ) {
printf( "\n" "Usage: ENCODE [/e or /d] [Input_File] [Output_File] [Password] \n" );
exit( 1 );
}
if( strcmp(argv[1], "/e") != 0 && strcmp(argv[1], "/d") != 0) \\ Перевірка
exit( 3 ); \\ правильності введення ключа
if( ( source = open( argv[ 2 ], O_BINARY | O_RDONLY ) ) == -1 ) {
printf( "\nOpen source file error: %d", errno ); \\ Відкриття файлу
exit( 1 );
}
target = open( argv[3], 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[ 3 ], O_BINARY | O_WRONLY | O_CREAT | O_TRUNC,
S_IREAD | S_IWRITE );
}
if( target == -1 ) {
printf( "\nOpen target file error: %d", errno );
exit( 2 );
}
count = BUFSIZE;
if( ( buffer = ( char* )malloc( count ) ) == NULL ) {
printf( "\nNot enough memory" ); \\ Перевірка наявності вільної пам’яті
exit( 3 );
}
if( strcmp(argv[1], "/e") == 0)
write(target, &zagol, buf); \\ Запис структури Заголовок при шифруванні
if( strcmp(argv[1], "/d") == 0)
read(source, &zagol, buf); \\ Читання структури Заголовок при дешифруванні
while( !eof( source ) ) {
if( ( count = read( source, buffer, count ) ) == -1 ) {
printf( "\nRead file error: %d", errno );
exit( 4 ); }
j=0; \\ Виконання бітової операції XOR
for( i = 0; i < count; i++ ) {
if( j == strlen(parol)) j=0 ;
buffer[ i ] ^= parol[ j++ ];
}
if( ( count = write( target, buffer, count ) ) == -1 ) { \\ Запис в файл
printf( "\nWrite file error: %d", errno );
exit( 5 );
}
}
if( strcmp(argv[1], "/e") == 0) \\ Запис вмісту Заголовок при шифруванні
{
strcpy(zagol.program, "-=Encode=-");
strcpy(zagol.versia, "/Professional/");
zagol.summa = Suma;
strcpy(zagol.namefile,argv[2]) ;
lseek(target, 0L, SEEK_SET);
write(target, &zagol, buf);
}
if( strcmp(argv[1], "/d") == 0) \\Перевірка вмісту Заголовок при дешифруванні
if(zagol.summa != Suma || strcmp(zagol.program, "Encode") != 0 || strcmp(zagol.versia, "Professional") != 0)
printf("\n Error, do not true code! \n");
close( source );
close( target );
free( buffer );
}