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

Тема работы: Оценка стойкости парольной защиты.

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

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

Парольные защиты.

Этот класс СЗПО, на сегодняшний день, является самым распространённым. Основной принцип работы данных систем заключается в идентификации и аутентификации пользователя ПО путём запроса дополнительных данных, это могут быть название фирмы и/или имя и фамилия пользователя и его пароль либо только пароль / регистрационный код. Эта информация может запрашиваться в различных ситуациях, например, при старте программы, по истечении срока бесплатного использования ПО, при вызове процедуры регистрации либо в процессе установки на ПК пользователя. Процедуры парольной защиты просты в реализации и, поэтому, очень часто применяются производителями ПО.

Большинство парольных СЗПО использует логические механизмы, сводящиеся к проверке правильности пароля / кода и запуске или не запуске ПО, в зависимости от результатов проверки. Существуют так же системы, шифрующие защищаемое ПО и использующие пароль или производную от него величину как ключ дешифрации, большинство таких систем использует слабые или простейшие алгоритмы шифрования, нестойкие к направленным атакам. Это происходит из-за сложности корректной реализации стойких криптоалгоритмов и нецелесообразности их применения для защиты недорогих условно-бесплатных программных продуктов, составляющих большинство ПО, использующего парольные защиты. Лишь в последнее время разработаны парольные СЗПО, реализующие стойкие криптоалгоритмы типа DES и RSA, они реализованы в виде защитного модуля и вспомогательных библиотек и устанавливаются на уже скомпилированные модули ПО.

Слабым звеном парольных защит является блок проверки правильности введённого пароля / кода. Для такой проверки можно сравнивать введённый пароль с записанным в коде ПО правильным либо с правильно сгенерированным из введённых дополнительных данных паролем. Возможно так же сравнение производных величин от введённого и правильного паролей, например их ХЭШ-функций, в таком случае в коде можно сохранять только производную величину, что повышает стойкость защиты. Путём анализа процедур проверки можно найти реальный пароль, записанный в коде ПО, найти правильно сгенерированный пароль из введённых данных либо создать программу для перебора паролей для определения пароля с нужной ХЭШ-суммой. Кроме того, если СЗПО не использует шифрования, достаточно лишь принудительно изменить логику проверки для получения беспрепятственного доступа к ПО.

Шифрующие системы более стойки к атакам, но при использовании простейших или некорректно реализованных криптоалгоритмов есть опасность дешифрации ПО.

Для всех парольных систем существует угроза перехвата пароля при его вводе авторизованным пользователем. Кроме того, в большинстве СЗПО данного типа процедура проверки используется лишь единожды, обычно при регистрации или установке ПО, затем система защиты просто отключается, что создаёт реальную угрозу для НСД при незаконном копировании ПО.

Положительные стороны:

Надёжная защита от злоумышленника-непрофессионала.

Минимальные неудобства для пользователя.

Возможность передачи пароля / кода по сети.

Отсутствие конфликтов с системным и прикладным ПО и аппаратным обеспечением.

Простота реализации и применения.

Низкая стоимость.

Отрицательные стороны:

Низкая стойкость большинства систем защиты данного типа.

Пользователю необходимо запоминать пароль / код.

Системы "привязки" ПО

 

Ход работы:

1.   В компилятор ТС загрузите файлы: vshifr.c, vdesh.c, vzlom.c из каталога STUDENT. Проверьте их работу. При отсутствии файлов на диске наберите их в компиляторе.

/* vshifr.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;

main()

{

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

return 0;

}

 

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

{

clrscr();

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

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

{

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

return 1;

}

else

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

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

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

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

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

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;/*Увеличение порядкового номера кода */

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

i++;

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

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;

}

 

vdesh.c

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

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

#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(); /*Функция суммирования кодов символов, вводимых с клавиатуры*/

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;

}                               

i=7; /*Ключ i*/

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;/*Уменьшение численной величины кода на величину 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(5000);

}

return 0;

}

 

vzlom.c

/*Подбор и расшифровывание пароля с неизвестным ключом*/

#include <stdio.h>

#include <ctype.h>

int d, i, j, ff1;

main()

{

clrscr();

printf("Один из приведенных ниже паролей является верным, для нахождения верного\n");

printf("пароля введите каждый последовательно при запросе пароля программой\n");

printf("дешифрации:\n\n");

while(i<11)

{

i++;

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

printf("\n");

}

return 0;

}

 

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

{              

FILE *fp;

int c,d;

char b;

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

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

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

{

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

return 1;

}                               

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

{     

if (b!=EOF)

{

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

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

{

c=toascii(b);

}

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

{

c=toascii(b)+128;

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

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

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

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

c=c-10;

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

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

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

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

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

{

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

printf("%c",d);

}

else

{

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

printf("%c",d);

}

}            

}

fclose(fp);

i=0;

j++;

i=j;

return 0;

}

2.   Сохраните копии этих программ под именами vshifr.c, vdesh.c, vzlom.c  в каталог C:\TC\BIN\ и продолжайте работу с этими копиями файлов.

3.   С помощью программы шифрации пароля создайте зашифрованный пароль на диске, изменив при этом величину ключа i. Этот пароль и ключ должен быть неизвестен второму студенту сидящему за компьютером, этот пароль он сможет просмотреть только в зашифрованном виде. Теперь студент, не знающий пароля будет «взламывать» пароль программы дешифрации.

4.   Заметьте время начала «взламывания» парольной защиты, состоящий из пунктов 5, 6, 7.

5.   Изучите метод простого перебора. Введите такие пароли: <Enter>, <пробел>, 1, 123, 1234, и т.д., имя студента зашифровавшего пароль, его день рождения, текущий год, дату и т.д..

6.   Изучите программный метод взлома. С помощью программы взлома vzlom.c получите несколько вариантов символов пароля, перебирая при этом в цикле значение ключа. Задавайте значение ключа i не больше 11. Запишите все варианты паролей.

7.   С помощью программы взлома vzlom.c получите символы пароля, для этого вместо цикла перебора ключа поставив известное константное значение ключа i. Файл vzlom.c по действию напоминает работу программы дешифрации, он выдает расшифрованные символы зашифрованного пароля. Запишите пароль.

8.   Отметьте время окончания успешной работы над пунктами 5, 6, 7. Запишите общее количество времени, затраченного на преодоление парольной защиты программы.

9.   Пункты 3, 4, 5, 6, 7 после завершения работы выполняет второй студент.

 

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

1.     Как реализуется парольная защита и в чем она состоит?

2.     Назовите слабые звенья парольной защиты.

3.     Назовите положительные стороны парольной защиты.

 

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

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

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

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

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