ЛАБОРАТОРНАЯ РАБОТА №10

Тема работы: Разработка алгоритма шифрования.

Цель работы: Изучить работу программы с использованием нескольких ключей, исследовать практическую реализацию симметричного алгоритма шифрования, ознакомиться с предложенным алгоритмом шифрования и создать свой собственный алгоритм.

Теоретическая часть:

Алгоритмы шифрования с использованием ключей предполагают, что данные не сможет прочитать никто, кто не обладает ключом для их расшифровки. Они могут быть разделены на два класса, в зависимости от того, какая методология криптосистем напрямую поддерживается ими.

Алгоритм шифрования - есть реализация некой взаимно-однозначной математической функции преобразования одних данных (открытых) в другие данные (закрытые). Выполняется такое преобразование на основе некоторых исключительно секретных данных - ключей шифрования, которыми обладают только участники секретной переписки. Если при этом собственно алгоритм шифрования не является секретом, и более того, широко опубликован, понятно, что надежность тайнописи эквивалентна надежности хранения и использования ключей. Все это верно при одной очень существенной оговорке - сам алгоритм должен быть "очень случайной" функцией и не порождать прямой или статистической зависимости закрытых данных от исходных - открытых. В этом, собственно, и состоит математическое понимание крипто - надежности.

Существуют две методологии с использованием ключей - симметричная (с секретным ключом) и асимметричная (с открытым ключом).

Симметричная (секретная) методология. В этой методологии и для шифрования, и для расшифровки отправителем и получателем применяется один и тот же ключ, об использовании которого они договорились до начала взаимодействия. Если ключ не был скомпрометирован, то при расшифровке автоматически выполняется аутентификация отправителя, так как только отправитель имеет ключ, с помощью которого можно зашифровать информацию, и только получатель имеет ключ, с помощью которого можно расшифровать информацию. Так как отправитель и получатель - единственные люди, которые знают этот симметричный ключ, при компрометации ключа будет скомпрометировано только взаимодействие этих двух пользователей. Проблемой, которая будет актуальна и для других криптосистем, является вопрос о том, как безопасно распространять симметричные (секретные) ключи. Алгоритмы симметричного шифрования используют ключи не очень большой длины и могут быстро шифровать большие объемы данных.

 

Ход работы:

1. 1. В компилятор ТС загрузите файлы: algshifr.c и algdesh.c.

/*Программное шифрование пароля с ключами, хранящимся в файле на диске.

Пароль в зашифрованном виде хранится в файле на диске*/

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <process.h>

int a, c, c1, d, i, j, t, k;

int ii, iii;

FILE *fp;

FILE *fpp;

char *ff[10];  /*Указатель на строку, содержащую путь к файлу ключа*/

main()

{

key_file();  /*Функция открытия файла для записи в него ключа,

 ключ хранится в файле в незашифрованном виде*/

read_key("c:\\s.key");  /*Функция чтения ключа 1 из файла*/

read_key("c:\\s1.key");  /*Функция чтения ключа 2 из файла*/

shifr_file();   /*Функция шифрации пароля при записи в файл*/

return 0;

}

key_file() /*Функция открытия файла для записи в него ключа,

 ключ хранится в файле в незашифрованном виде*/

{

int z;

clrscr();

fpp=fopen("c:\\s.key", "w");

if ((fpp=fopen("c:\\s.key", "w"))==NULL)/*Открытие файла на запись*/

{

printf("Невозможно открыть файл");

return 1;

}

else

{

clrscr();

printf("Введите ключ: число в интервале (0-100) ");

do

{ 

t=getchar();/*Ввод символов с клавиатуры*/

if (t!='\n')

{

fputc(t, fpp); /*Посимвольная запись строки в файл*/

}

}

while(t!='\n');

fclose(fpp);

}

return 0;

}

shifr_file()    /*Функция шифрации пароля при записи в файл*/

{

clrscr();

fp=fopen("c:\\parol.pwl", "w");

if ((fp=fopen("c:\\parol.pwl", "w"))==NULL)/*Открытие файла на запись*/

{

printf("Невозможно открыть файл");

return 1;

}

else

k=0;

read_key("c:\\s.key");

i=k; /*Присваеивание переменной i значения ключа*/

k=0;

read_key("c:\\s1.key");  /*Функция чтения ключа из файла*/

j=k; /*Присваивание переменной j значения ключа*/

printf("(C),inn,2001\n");

printf("Шифрация пароля и запись его в файл на диске,");

printf("в директории под именем\n C:\\parol.pwl \n");

printf("Ключ (i) = %d ключ (j) = %d\n",i,j);

printf("Введите пароль (используйте только латинские буквы и цифры\n");

printf("длина пароля не менее 6 и не более 15 символов: ");

do

{

a=getchar();/*Ввод символов с клавиатуры*/

if (a!='\n'){

printf("\nСимвол введенный с клавиатуры - (%c), его  ",a);

c=toascii(a);/*Преобразование символов в коды ASCII*/

printf("код ASCII=%d\n",c);

/*Реализация алгоритма шифрования (арифметические преобразования

над ASCII-кодоми символов)*/

/*---------------------------------------------------*/

c=c+10;

c1=(c+i)+j;/*Увеличение порядкового номера кода */

printf("Преобразованный код ASCII=%d\t",c1);

i++;

j--;

/*---------------------------------------------------*/

if((islower(c1)!=0)) /*Проверка регистра вводимых символов*/

{

d=tolower(c1);  /*Обратное преобразование кода в символ (нижний регистр)*/

printf("(%c) - зашифрованный символ\t\n",d);

}

else

{

d=toupper(c1);  /*Обратное преобразование кода в символ (верхний регистр)*/

printf("(%c) - зашифрованный символ\t\n",d);

}           

fputc(d, fp);

}

}

while(a!='\n');

fclose(fp);

return 0;

}

int read_key(char *ff)  /*Функция чтения ключа из файла*/

{

FILE *fpp;

char *ii;

fpp=fopen(ff, "r");

if ((fpp=fopen(ff, "r"))==NULL)/*Открытие

файла на чтение*/

{

printf("Не могу открыть файл! Файл с ключом не существует!");

exit(1);

}

else

{                        

ii=fgets(ii,'\n',fpp);/*Чтение символов из файла*/   

k=atoi(ii);

}

fclose(fpp);

return 0;

}

 

/*Программная дешифрация пароля с ключами, хранящимися в файле на диске.

Пароль в зашифрованном виде хранится в файле на диске*/

#include <stdio.h>

#include <ctype.h>

int t, s, s1;

int f, e, i, j, ff1, k;

int ii,iii;

char *ff[10];  /*Указатель на строку, содержащую путь к файлу ключа*/

main()

{

parol(); /*Функция суммирования кодов символов, вводимых с клавиатуры*/

read_key("c:\\s.key"); /*Функция чтения ключа из файла*/

read_key("c:\\s1.key");

deshifr_file(); /*Функция дешифрации пароля при чтении из файла*/

return 0;

}

parol()  /*Функция суммирования кодов символов, вводимых с клавиатуры*/

{

clrscr(); /*Очистка экрана*/

printf("(C),inn,2001\n");

printf("Дешифрация пароля, путем чтения зашифрованных ");

printf("символов из файла\n и их преобразования в коды ASCII ");

printf("и сравнения сумм кодов символов\n считанных из файла и с клавиатуры\n");

printf("Введите пароль: ");

s1=0;

while ((f=getchar())!='\n')/*Ввод символов пароля с клавиатуры*/

{

e=toascii(f);/*Преобразование символов в ASCII коды*/

printf("ASCII-код символа (%c) = %d\n",f,e);

s1=s1+e;/*Суммирование чисел кода*/

}

printf("\nСумма кодов символов, введенных с клавиатуры = %d\n\n",s1);

return s1;

}

deshifr_file()  /*Функция дешифрации пароля при чтении из файла*/

{              

FILE *fp;

int c;

char b;

int d, s;

fp=fopen("c:\\parol.pwl", "r");

if ((fp=fopen("c:\\parol.pwl", "r"))==NULL)/*Открытие

файла на чтение*/

{

printf("Не могу открыть файл! Файл с паролем не существует!\n");

return 1;

}                               

k=0;

read_key("c:\\s.key");  /*Функция чтения ключа i из файла*/

i=k;

k=0;

read_key("c:\\s1.key");  /*Функция чтения ключа j из файла*/

j=k;

s=0;

while((b=fgetc(fp))!=EOF)/*Чтение символов из файла*/

{     

if (b!=EOF)

{

if (isascii(b)!=0) /*Если символ есть код ASCII то выполняется

стандартное преобразование*/

{

c=toascii(b);

printf("Зашифрованный символ (%c) его код = %d",b,c);

}

else  /*Иначе прибавляется к коду 128*/

{

c=toascii(b)+128;

printf("Зашифрованный символ (%c) его код = %d\n",b,c);

}/*Преобразование символов в ASCII коды*/

/*Реализация алгоритма дешифрации (обратные арифметические преобразования

над ASCII-кодами символов, считанных из файла пароля)*/

/*-------------------------------------------------------*/

c=c-10;

ff1=(c-i)-j;/*Уменьшение численной величины кода на величину i,

(расшифровывание пароля)*/

printf("  Код расшифрованного символа = %d\n",ff1);

i++; /*Увеличение i на единицу*/

j--;

/*-------------------------------------------------------*/

s=s+ff1;

}

}

fclose(fp);

printf("\nСумма кодов расшифрованных символов = %d\n",s);

if (s==s1)/*Сравнение сумм кодов из введенного

с клавиатуры пароля и считанного из файла*/

{

printf("\nПароль верный!\n");

printf("Выполнение основного блока программы!");

delay(1500);

}

else  {

printf("\nПароль не верный! Попробуйте еще раз!");

delay(5000);

}

return 0;

}

int read_key(char *ff) /*Функция чтения ключа из файла*/

{

FILE *fpp;

char *ii;

fpp=fopen(ff, "r");

if ((fpp=fopen(ff, "r"))==NULL)/*Открытие

файла на чтение*/

{

printf("Не могу открыть файл! Файл с ключом j не существует!\n");

exit(1);

}

else

{                       

ii=fgets(ii,'\n',fpp);/*Чтение символов из файла*/   

k=atoi(ii); /*Преобразование строки в число*/

}

fclose(fpp);

return 0;

}

 1. Проверьте их работу. Почему не работает программа шифрования пароля? Какое диагностическое сообщение выдает данная программа?

2. Сохраните копии этих программ под именами algs.c и algd.c и продолжайте работу с этими копиями файлов. Для работы программы создайте средствами операционной системы файл s1.key в корневой директории диска С:\ и запишите в него число от 0 до

30. Это ключ алгоритма шифрования. Какой ключ шифрования созда­ется автоматически?

3. Рассмотрите алгоритм шифрования, он обозначен в тексте программы. Дайте его характеристику и запишите его математичес­кие формулы.

4. Определите, какая методология используется в организации данного алгоритма шифрования? Если это симметричная методология с секретными ключами, то почему? И если ассиметричная, с откры­тыми ключами, то почему?

5. Сколько ключей используется для шифрования пароля? Сколько ключей можно использовать для шифрования?

6. Протестируйте предложенные программы для паролей длина которых превышает 15 символов. Протестируйте программы для клю­чей величина которых превышает 100. Запишите в отчет результаты выдаваемые программой расшифровки.

7. Создайте 4 ключа и используйте их в алгоритме шифрова­ния. Для этого создайте 4 файлов со строками, содержащими чис­ло, например, 5 или 10, не делайте величину ключа слишком боль­шой. Дайте им имена s1.key, s2.key и т.д.. Сделайте изменения в программе используйте функцию чтения ключей int read_key(char *file_name).

8. Для создания файлов ключей средствами операционной сис­темы, откройте Блокнот и запишите в нем число от 0 до 30. Это будет один из ключей. Можете создать несколько таких ключей, но обязательно указать их использование в программе, как дан при­мер чтения строки из файла. Используйте также Far-Manager для создания файла ключа.

9. Для создания файла ключа программным методом,также ис­пользуйте пример, приведенный в программе. Создание такого фай­ла можно оформить в виде отдельной программы и в основной прог-

рамме шифрации пароля.

10. После создания файлов ключей определите, каким образом они будут использоваться в алгоритме шифрации пароля. Введите несколько (например, 4 переменных) переменных целого типа для ключей. Использовать ключи можно в простых выражениях, преобра­зующих целочисленную величину ASCII - кода символа. Используйте простые арифметические преобразования для изменения кодов сим­волов; в этих преобразованиях в качестве переменных применяйте ключи.

11. Внесите изменения в файл шифрации пароля. Зашифруйте пароль, состоящий из 3-5 символов, запишите их коды после за­шифровки.

12. Внесите изменения в алгоритм дешифрации, учитывая при этом, что те же операторы, которые использовались для шифрации теперь будут применяться для дешифрации, только в обратном по­рядке.

13. Отладьте программы шифрации и дешифрации.  Проверьте их работу для различных паролей и длин ключей. Ответьте на вопрос: почему ключи не могут иметь большое численное значение?

14. Сравните работу и результаты работы предложенных прог­рамм в качестве примера и программ, полученных Вами в процессе разработки собственного алгоритма шифрования, на одних и тех же ключах и паролях. Запишите результаты работы программ, сделайте вывод.

15. Защитите один из ключей, создаваемых программным спосо­бом, методом шифрования. Создайте отдельную программу, которая будет шифровать вводимый ключ простым алгоритмом (например, бу­дет увеличивать ASCII - код на единицу), а в программе расшиф­ровки примените алгоритм дешифрации ключа.

16. Протестируйте свою программу на различных паролях. Исс­ледуйте работу программы для паролей длиннее 15 символов и клю­чей больше 100.  Как работает программа? Какие сообщения выдает программа дешифрации?

 

Контрольные вопросы:

1.                Что такое симметричная методология и как она реализуется?

2.                Что такое алгоритм шифрования?

 

Отчет должен содержать:

1.             Тему работы, цель работы.

2.             Распечатку программы.

3.             Описание хода выполнения работы и письменные ответы на задания хода работы.

Ответы на контрольные вопросы.