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

Тема работы: Программная дешифрация пароля.

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

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

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

В примере рассмотрен способ дешифрации, при котором каждый символ пароля преобразуется из символьной формы в числовую. Далее над числовой переменной производятся преобразования обратные тем, которые производились в программе шифрации: уменьшение числовой величины ASCII - кода по формуле: код_зашифрованного_символа = код_символа - (ключ + 1). Далее производится суммирование всех расшифрованных кодов символов, и если эта сумма совпадает по величине с суммой кодов символов, введенных с клавиатуры, то программа выдает сообщение о правильно введенном пароле. Пароль необходимо создавать размером не менее 6, но и не более 15 символов. Более объемные пароли неудобны в использовании, хранении и обработке программами.

 

Ход работы:

  1. Проверить работу программы (shifrac.c), создающей файл на диске с зашифрованным паролем. Просмотреть текстовой файл с паролем (parol.pwl) на диске и убедиться в правильной шифрации пароля. Для этого сопоставьте коды преобразованных символов обозначениям самих символов. Например, А=(65), В=(66), Z=(90) и т.д..
  2. Проверьте файл ключа s.key, он должен содержать введенный ключ, в незашифрованном виде. (Все эти данные в файлах используются программой дешифрации пароля).
  3. В программе, с разработанным товарным знаком, и работающим основным блоком, организовать защиту программы от несанкционированного использования с помощью пароля.
  4. В компилятор ТС++ загрузите программу deshifr.c. В случае отсутствия файла на диске используйте текст приведенной ниже программы (наберите ее в текстовом редакторе компилятора ТС++, комментарии, данные в тексте программы не набирать!):

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

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

#include <stdio.h>

#include <ctype.h>

int t, s, s1;

int f, e, i, ff1;

int ii,iii;

main()

{

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

read_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;

}                               

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 коды*/

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

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

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

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

s=s+ff1;

}

}

fclose(fp);

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

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

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

{

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

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

delay(1500);

}

else  {

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

delay(1500);

}

return 0;

}

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

{

FILE *fpp;

char *ii;

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

if ((fpp=fopen("c:\\s.key", "r"))==NULL)/*Открытие

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

{

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

return 1;

}

else

{                       

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

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

}

fclose(fpp);

return 0;

}

  1. Выполните эту программу пошагово (трассировка), запишите имена операторов и функций, используемых данной программой, дайте их краткую характеристику.
  2. Изучите принцип работы программы; взаимосвязь функций. Запишите в отчет название и назначение каждой функции, приведенной в функции main.
  3. Просмотрите, какие сообщения выдает программа по окончании работы. Запишите промежуточные результаты работы программы, эти результаты содержат также ASCII-коды преобразованных символов(результат можно просмотреть с помощью клавиш Alt+F5).
  4. Законспектируйте характеристику алгоритма дешифрации. В чем он заключается?
  5. Протестируйте программы для следующих паролей: ERbvvZ09, ZzCc, ZZ00, 1234567890cgytds. Ответьте на вопрос: различает ли программа регистр вводимых символов? Если да, то почему?
  6. Введите ключ больше 100. Как работает программа дешифрации для рассмотренных паролей?
  7. Введите для этих же паролей ключ в диапазоне 100-1000. Как работает программа дешифрации для таких ключей? Объясните причину такой работы программы. Почему величина ключа должна быть небольшой, около 100? Как эта особенность связана с ASCII кодами символов?
  8. Проверить, какие пароли может обрабатывать программа шифрации. Могут ли использоваться русские буквы при обработке пароля в данной программе?
  9. Удалите файл ключа и запустите программу дешифрации пароля; удалите файл пароля и запустите программу дешифрации пароля какое сообщение выдает программа?
  10. Удалите оба файла: пароля и ключа, какое диагностическое сообщение выдает программа дешифрации.
  11. Какая функция производит сравнение пароля введенного с клавиатуры и пароля, считанного в зашифрованном виде из файла? Объясните принцип ее работы.

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

1.     Какой принцип используется для сравнения паролей в приведенном примере? Как взаимодействуют программы шифрации и дешифрации пароля?

2.     Какие функции и операторы С++ используются для дешифрации пароля?

 

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

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

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

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

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