ЛАБОРАТОРНАЯ РАБОТА №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.
Описание
хода
выполнения
работы и
письменные
ответы на
задания
хода работы. |