Лабораторні роботи WinApi

Лабораторна робота №2

Шифрування файлу

Технічне завдання:

     Модифікувати програму копіювання файлу, написану у лабораторній роботі №1, таким чином, аби вона шифрувала файл. Програма копіювання, має відповідати усім вимогам, описаним у лабораторній роботі №1.

Вимоги до програми шифрування:

1.  Назва програми: Encode.
2. Iнтерфейс - командний рядок, в який вводяться режим роботи програми, пароль, а також імена вхідного та вихідного файлів.
encrypt </e | /d> <File_to_code> [distination_file] [/p=password]
Наприклад:
 
encrypt /e myfile.txt myfile.cod /p=mypassword,   де 
/e або /d - ключ який визначає шифрування або дешифрування;
myfile.txt - специфікація файлу який має бути зашифрований;
myfile.cod - специфікація файлу в який має бути записано зашифровану послідовність;
/p=mypassword - пароль для шифрування.

3. Режим шифрування - ключ /e, режим дешифрування - ключ /d.

4. При неправильному завданні параметрів програма повинна виводити інформацію про вірне завдання параметрів.

Наприклад: 
encrypt </e | /d> <File_to_code> <distination_file> [/p=password]

5. Зашифрований файл повинен містити  заголовок і кодовані дані.  Заголовок доцільно записувати у файл при шифруванні двічі. Перший раз без порахованої контрольної суми, для того щоб відступити місце у файлі, перед записом вже зашифрованих даних. Вдруге заголовок записувати вже з порахованою контрольною сумою, після шифрування даних. Для цього відповідно треба перемістити покажчик запису-читання файлу на початок файлу, а після повторного запису заголовку поверх записаного, покажчик запису-читання необхідно повернути знов в кінець файлу, для уникнення відсікання вмісту файлу при його закритті, по поточній позиції покажчика запису-читання.

6. Заголовок повинен містити:
         сигнатуру виду файлу;
         номер версії програми;
         рядок Copyright, із якого зрозуміло, якою програмою файл був зашифрований;
         контрольну суму, яка надасть можливість пперевірити правильність розшифрування даних;
         імя вихідного файлу для його відновлення при дешифруванні
         іншу інформацію на розсуд розробника.

Для роботи з заголовком краще використати структурну змінну. Наприклад:

struct Header {
  char signat[3];
  int version;
  char CopyRight[30];
  unsigned long CRC;
  char filename[13];
  ... 

7. Необхідно рахувати контрольну суму, яка буде контролювати правильність дешифрування. Найпростішій метод підрахунку контрольної суми - це додавання усіх байтів файлу.

Наприклад:
unsigned long CRC = 0;
...
   CRC +=buffer[i];

...

Контрольна сума має рахуватися одночасно, під час шифрування, для уникнення подвійного проходу по файлу. Контрольна сума рахується над незашифрованими даними. Під час шифрування, контрольна сума накопичується, та потім записується у заголовок файлу. Під час дешифрування контрольна сума читається з файлу (читається увесь записаний заголовок файлу), та порівнюється з порахованою контрольною сумою над розшифрованими даними. Якщо суми співпадають, то це доказує правильність розшифрування файлу.




8. Для вшифрування даних можна використати будь який алгоритм. Найпростішим може бути алгоритм гамування. Базується він на бітовій операції XOR. В мові Сі операція визначена символом ' ^ '. Ця операція є зворотньою. Тобто:


a xor b = c
c xor b = a
c xor a = b

Використовуючи це правило, в програмі можна записати це так:

   int j = 0;
   for( int i = 0; i < BytesRead; i++ ) {
      if( j == strlen( password ) ) j = 0;  

      buffer[ i ] ^= password[ j++ ];
   }

Результат буде будуватись по наступній схемі:

Вхідна послідовність
b1
b2
b3
b4
b5
b6
b7
b8
b9
b10
...
bn
Символи паролю "vasya"
v
a
s
y
a
v
a
s
y
a
...
...
Вихідна послідовність
c1=b1^'v'
c2=b2^'a'
c3=b3^'s'
c4
c5
c6
c7
c8
c9
c10
...
cn
Процес дешифрування проходить по тій же схемі.

Додаткові, необов'язкові завдання:

1. Вдосконалити алгоритм шифрування.

2. Реалізувати шифрування папки зі всім вкладеним вмістом, записуючи усі в один вихідний файл. При дешифруванні відновити усі структуру папок та вкладених файлів.