ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
дистанционная форма обучения
Кафедра автоматизированных систем управления (АСУ)
Программирование
Курсовой проект
«шифровка и дешифровка текста»
__________________________________________
(Фамилия Имя Отчество)
(шифр)
(почтовый адрес)
Дата выполнения работы ___________________
Оценка ___________________
И.О.Фамилия преподавателя ___________________
Подпись преподавателя ___________________
СОДЕРЖАНИЕ:
Содержание………………………………………………………………....стр.2
Введение…………………………………………………………………….стр. 3
Постановка задачи………………………………………………………...стр. 3
Используемые методы…………………………………………………….стр. 3
Описание алгоритма программы………………………………………..стр. 3
Описание входных и выходных данных………………………………..стр. 8
Заключение…………………………………………………………………стр. 8
Список литературы………………………………………………………..стр. 9
Приложение 1. Листинг программы……………………………………стр. 10
Приложение 2. Результаты работы……………………………………..стр. 13
Введение.
Целью данного курсового проекта является закрепление полученных знаний по разработке алгоритмов на персональном компьютере в среде Турбо Паскаль.
В курсовом проекте рассматривается работа программы для шифровки и дешифровки текста.
Постановка задачи.
Необходимо написать программу, которая будет шифровать и дешифровать текст. При этом программа должна брать исходный текст из файла, а результат сохранять в другом файле. Также необходимо создать «дружественный» интерфейс, для упрощения работы с программой конечного пользователя.
Используемые методы.
В программе используется следующий алгоритм шифрования: с помощью команды ORD каждый символ текста будет преобразован в его числовой код, но при этом еще будет использоваться ключ. Ключ будет задаваться пользователем и может содержать набор букв, чисел и символов. Каждый символ ключя будет декодирован в числовое значение, и алгебраическая сумма всех этих чисел будет прибавлена к имеющемуся значению зашифрованного знака в тексте. И так - для каждой буквы шифруемого текста, между которыми добавятся пробелы, иначе декодер примет множество символов, записанных в цифровом виде, за одно большое многозначное число и ничего не переведет.
При декодировании текста числовые значения переведутся в символьные при помощи команды CHR, но не зная ключя дешифровать такой текст будет достаточно сложно.
Описание алгоритма программы.
Программа Crypter. В программе используются следующие функции и процедуры:
Функция Password (FUNCTIONPassword(Psw: string): integer;): преобразует каждый символ, введенного пользователем ключя, в его числовой код и находит алгебраическую сумму этих чисел. В данной функции используются следующие переменные:
· строковая переменная Psw – при вызове функции ей передается ключ введенный пользователем с клавиатуры, именно это значение и присваивается данной переменной
· переменные i, res – целого типа служат для: переменная i необходима для работы цикла, а в переменную res будет записываться результат работы цикла.
Переменной res присваиваем значение равное 0. Для того, чтобы перевести каждый символ ключа в его числовой код создадим цикл размером от 1 до количества символов в ключе (данное значение мы получим при помощи команды length(psw) данная команда возвращает количество символов в строке). Затем в этом цикле с помощью команды ord(psw[i]) найдем числовые коды всех символов ключа, сложим их и присваиваем полученное значение функции Password.
FUNCTION Password(Psw: string): integer;
VAR i,res: integer;
BEGIN
res:=0;
for i:=1 to length(psw) do res:=res+ord(psw[i]);
Password:=res;
END;
Функция Crypt (FUNCTION Crypt(CryptStr: string): string;): функциядляшифрованиятекста. При вызове данной функции ей передается текст который необходимо шифровать, этот текст присваивается переменной CryptStr. В данной функции созданы следующие внутренние переменные необходимые для ее работы:
· переменные s, s1 – строкового типа. В переменную s1 будет записываться результат работы. Переменная s будет содержать в себе значение первого символа строки CryptStr
· переменные i, rez – целого типа. Переменная i необходима для работы цикла. Переменная rez будет содержать числовое значение символа находящегося в s.
Переменной s1 присваиваем пустое значение. Создаем цикл от 1 до количества символов в тексте содержащемся в переменной CryptStr (это значение мы получим выполнив команду length(CryptStr)). Далее в цикле текст «разбирается» на символы и каждый символ командой ORD переводится в его числовой код при этом к полученному числу прибавляется алгебраическая сумма числовых кодов символов ключа (эта сумма возвращается при вызове функции Password), полученное значение присваивается переменной rez. Затем полученные числовые значения переводятся в символьные командой STR и складываются, при этом между значениями вставляются пробелы (это необходимо для того, чтобы дешифратор по пробелам мог отделить числа, иначе он принял бы их за одно большое число).
FUNCTION Crypt(CryptStr: string): string;
VAR s,s1: string;
i,rez: integer;
BEGIN
s1:='';
for i:=1 to length(CryptStr) do
begin
s:=CryptStr;
s:=copy(s,1,1);
CryptStr:=copy(CryptStr,2,length(CryptStr)-1);
rez:=ord(s[1])+Password(PassW);
str(rez,s);
s1:=s1+s+' ';
end;
delete(s1,length(s1),1);
Crypt:=s1;
END;
Функция Decrypt (FUNCTIONDecrypt(DecryptStr: string): string;): функция для дешифровки текста. При вызове этой функции ей передается зашифрованный текст, который необходимо расшифровать, этот текст записывается в переменную DecryptStr. В данной функции созданы следующие внутренние переменные необходимые для ее работы:
· переменные Xpos, i, v, e – целого типа. Переменная Xpos будет содержать в себе позицию пробела. Переменная i необходима для работы цикла. Переменные v и eнеобходимы для работы с оператором VAL (данный оператор преобразует символ в число)
· переменные Code, s1 – строкового типа. Переменная s1 будет содержать результат работы. Переменная Code будет содержать значение первого числа извлеченного из переменной DecryptStr.
Создадим цикл размером от 1 до количества символов в переменной DecryptStr (это значение мы получим выполнив команду length(DecryptStr)). Далее в цикле из полученного зашифрованного текста «выдергиваются» числа разделенные пробелами и переводятся в числовые значения при помощи команды VAL потом от них отнимается алгебраическая сумма числовых кодов символов ключа (эта сумма возвращается при вызове функции Password), затем полученные значения преобразуются командой CHR в символьные и складываются. Полученный результат возвращается функцией Decrypt.
FUNCTION Decrypt(DecryptStr: string): string;
VAR Xpos,i,v,e: integer;
Code,s1: string;
BEGIN
s1:='';
for i:=1 to length(DecryptStr) do
begin
xpos:=pos(' ',DecryptStr);
if xpos<=0 then
begin
val(DecryptStr,v,e);
s1:=s1+chr(v-password(PassW));
Decrypt:=s1;
exit;
end;
code:=copy(DecryptStr,1,xpos-1);
val(code,v,e);
s1:=s1+chr(v-password(PassW));
delete(DecryptStr,1,xpos);
end;
Decrypt:=s1;
END;
Для упрощения работы с программой конечного пользователя были созданы следующие процедуры:
PROCEDURE Menu – процедура, выводящая на экран основное меню программы. Меню организовано с помощью операторов writeln, readlnи содержит следующие пункты:
1. Шифровать текст
2. Дешифровать текст
3. Выход
PROCEDURE Menu;
BEGIN
repeat
begin
ClrScr;
writeln('Программа шифровки и дешифровки текста!!!');
writeln;
writeln('1. Шифровать текст');
writeln('2. Дешифровать текст');
writeln('3. Выход');
writeln;
write('Выберите пункт меню: ');
readln(men);
case men of
1 : CryptP;
2 : DecryptP;
end;
end;
until men=3;
END;
При выборе первого пункта меню вызывается процедура шифрования текста (PROCEDURE CryptP;). Данная процедура создает интерфейс для ввода имени файла, который необходимо зашифровать и ключа. После ввода имени файла и ключа данный файл открывается (при помощи команды Assign) и весь текст из него записывается в переменную Line.Также создаем второй файл в который будет записан результат работы (этот файл будет иметь имя crypter.txt). Затем вызывается функция Crypt и ей передается значение переменной Line. После завершения работы функции зашифрованный текст сохраняется во вновь созданном файле. Закрываем оба открытых файла при помощи оператора Close.
PROCEDURE CryptP;
BEGIN
writeln;
write('Введитепутьиимяфайла: ');
readln(FileName);
write('Введитеключ: ');
readln(PassW);
Assign(F,FileName);
Assign(F1,'crypter.txt');
Rewrite(F1);
Reset(F);
while not EOF(F) do
begin
readln(F,Line);
line:=crypt(line);
writeln(F1,line);
end;
writeln;
writeln('Файл успешно зашифрован!!!');
Close(F);
Close(F1);
writeln;
write('Нажмите любую клавишу...');
ReadKey;
END;
При выборе второго пункта меню вызывается процедура дешифровки текста (PROCEDURE DecryptP;). Работа этой процедуры аналогична работе процедуры CryptP, за одним лишь исключением, мы вызываем функцию Decrypt вместо функции Crypt.