ЛАБОРАТОРНАЯ РАБОТА №8 |
Тема работы: Программное шифрование пароля. Цель работы: Изучить работу программы по шифрации пароля; получить представление о механизме использования ключей; ознакомиться с предложенным алгоритмом шифрования. |
Теоретическая
часть: Пароль
шифруется с
помощью
простейшего
метода
шифрования-замены,
когда каждый
символ
пароля
заменяется
другим
символом по
определенному
алгоритму. В
примере
рассмотрен
способ
шифрации, при
котором
каждый
символ
пароля
преобразуется
из
символьной
формы в
числовую
величину.
Далее над
числовой
переменной
производятся
преобразования:
увеличение
или
уменьшение
числовой
величины,
могут быть
использованы
другие виды
преобразований.
В
примере
числовая
величина
увеличивается
на значение,
вычисляемое
по формуле:
код_зашифрованного_символа
= код_символа + (ключ
+ 1). Далее
производится
обратное
преобразование
числовой
величины в
символьную
форму,
которая и
записывается
в файл. В
итоге в файле
хранится
зашифрованная
копия пароля.
Для
расшифровки
пароля
используется
другая
программа,
которая
повторяет
все
операторы
первой, но в
обратном
порядке.
Написание
этой
программы -
задача
следующей
лабораторной
работы. Пароль
необходимо
создавать
размером не
менее 6 и не
более 15
символов.
Более
объемные
пароли
неудобны в
использовании,
хранении и
обработке
программами.
Ключ в
рассмотренном
примере
желательно
использовать
не более 30, т.к. ASCII
– коды
символов
лежат в
пределах 0-255. Ход
работы: 1.
В
компилятор
ТС++ загрузите
программу shifrac.c.
В случае
отсутствия
файла на
диске
используйте
текст
приведенной
ниже
программы (наберите
ее в
текстовом
редакторе
компилятора
ТС++,
комментарии,
данные в
тексте
программы не
набирать!): /*Программное
шифрование
пароля с
ключом,
хранящимся в
файле на
диске. Пароль
в
зашифрованном
виде
хранится в
файле на
диске*/ #include
<stdio.h> #include
<stdlib.h> #include
<ctype.h> int
a, c, c1, d, i, t; int
ii, iii; FILE
*fp; FILE
*fpp; main() { key_file(); /*Функция
открытия
файла для
записи в него
ключа, ключ
хранится в
файле в
незашифрованном
виде*/ read_key(); /*Функция
чтения ключа
из файла*/ shifr_file(); /*Функция
шифрации
пароля при
записи в файл*/ read_key(); printf("\nКлюч
= %d",i); 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 printf("(C),inn,2001\n"); printf("Шифрация
пароля и
запись его в
файл на диске,");
printf("в
директории
под именем\n C:\\parol.pwl
\n"); printf("Введите
пароль (используйте
только
латинские
буквы и цифры\n"); printf("длина
пароля не
менее 6 и не
более 15
символов: "); do { a=getchar();/*Ввод
символов с
клавиатуры*/ if
(a!='\n'){ printf("\n"); printf("Символ
введенный с
клавиатуры - (%c),
его ",a); c=toascii(a);/*Преобразование
символов в
коды ASCII*/ printf("код
ASCII=%d\n",c); 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; } read_key() /*Функция
чтения ключа
из файла*/ { FILE
*fpp; char
*ii; fpp=fopen("c:\\s.key",
"r"); if
((fpp=fopen("c:\\s.key", "r"))==NULL)/*Открытие
файла
на чтение*/ { printf("Не
могу открыть
файл! Файл с
ключом не
существует!"); return
1; } else {
ii=fgets(ii,'\n',fpp);/*Чтение
символов из
файла*/
i=atoi(ii); } fclose(fpp); return
0; } 2.
Выполните
эту
программу
пошагово (трассировка),
запишите
имена
операторов и
функций,
используемых
данной
программой,
дайте их
краткую
характеристику.
3.
Изучите
принцип
работы
программы;
взаимосвязь
функций.
Запишите в
отчет
название и
назначение
каждой
функции,
приведенной
в функции main. 4.
Просмотрите,
какие
сообщения
выдает
программа по
окончании
работы.
Запишите
промежуточные
результаты
работы для
пароля zzz,
эти
результаты
содержат
также ASCII-коды
преобразованных
символов(этот
результат
можно
просмотреть
с помощью
клавиш Alt+F5). 5.
Какие файлы
создает
программа
шифрации
пароля, где
они
создаются?
Запишите их.
Просмотрите
содержимое
этих файлов.
Что содержит
файл пароля? 6.
Законспектируйте
характеристику
алгоритма
шифрования. В
чем он
заключается? 7.
Протестируйте
программу
для
следующих
паролей: ZZZ111,
ZzZzXxXxCcCc, zzzZZZ000.
Ответьте на
вопрос:
различает ли
программа
регистр
вводимых
символов?
Если да, то
почему? 8.
Введите
ключ больше 100.
Как работает
программа
для
рассмотренных
паролей? 9.
Введите для
этих же
паролей ключ
в диапазоне
100-1000. Возможна
ли
расшифровка
паролей с
такими
ключами? Если
да, то почему? 10.
Проверьте
работу
программы
для паролей
длина
которых
превышает 15
символов.
Объясните
почему с
увеличением
длины
шифруемого
пароля,
невозможно
будет его
расшифровать? 11.
Определите
какой
максимально
возможный
код ASCII
может быть
представлен
в виде
символа?
Какое это
десятичное
число? Контрольные
вопросы: 1.
Что такое ASCII
– коды, и каков
диапазон их
десятичных
значений? 2.
Какие
функции и
операторы С++
используются
для шифрации
пароля? Отчет
должен
содержать: 1.
Тему работы,
цель работы. 2.
Распечатку
программы. 3.
Описание
хода
выполнения
работы и
письменные
ответы на
задания хода
работы. 4.
Ответы на
контрольные
вопросы. |