Научная работа

ШИФРАЦИЯ ДАННЫХ
Якунин М.С.

ВСТУПЛЕНИЕ

На протяжении всей истории человечества, люди стремились скрыть от чужих глаз свои письма и записи.Для этого они придумывали различные методы шифрации,которых к нашим дням накопилось достаточно много. Но если раньше для шифрации и дешифрации стоило прилагать некоторые усилия, то сегодня с появлением компьютерной техники, этот процесс стал намного эффективнее и быстрее, т.к всю "черную" работу теперь делает компьютер.Но как заставить его шифровать ? Для этого существует два способа:
1. Воспользоваться уже написанными программами.
2. Самостоятельно написать программу шифрации. Итак если вы выбрали второй способ, то данная стать для вас.Я надеюсь она поможет вам в ваших начинанияхи вы узнаете из нее что-то новое. В данной статье коротко описываются два способа шифрации данных - Метод Цезаря - Усовершенстовованный метод Цезаря и прилагаются исходные тексты программ реализующие данные методы на языках: Basic и Pascal.

МЕТОД ЦЕЗАРЯ

Суть щифрации заключается в том, что каждый символ заменяется на символ стоящий на 2 позиции дальше, т.е. к-ый символ заменяется на к+2-й,причем последние два символа алфавита заменяются на первые два соответственно. Давайте попробуем вывести формулу по которой по заданной позиции символа можно найти смещение, символа, стоящего на 2 позиции дальше, относительно позиции какого-то начального символа:
Shn=N1+(Sn-N1+2) mod L (1)
Где
Shn -номер зашифрованного символа
N1 -номер начального символа
Sn -номер шифруемого символа
L -количество символов
Пример1:
Пусть введен символ 'H'(). Найти номер зашифрованного символа.
Shn=65+(72-65+2) mod 26 = 74('J')

Рассмотрим два случая :
-использование всей таблицы ASCII
-использование определенного языка

= Использование всей таблицы ASCII =
Это наиболее простая (в программном смысле) реализация метода Цезаря, но и вместе с тем наиболее эффективная. Как видно из названия при шифрации используется вся таблица ASCII т.е номер начального символа (N1)=1, а их количество (L)=254, и формула (1) будет выглядеть следующим образом:
Shn=1+(Sn-1+2) mod 254 - Общая формула
sh:=chr(1+(ord(sim)-1+2) mod 254) - Turbo Pascal
где ch,sim переменные типа Char
sh$ =chr$(1+(asc(sim$)-1+2) mod 254)- Basic
где sh$,sim$ символьные переменные
Замечание:
Как вы уже наверное заметили что используется не вся таблица ASCII, не используются символы с номерами 0 и 255. Это в принципе и не к чему т.к они пустые, но если очень хочется, то можно, изменив N1 и L, соответствующим образом изменить формулу (1): Shn=(Sn+2) mod 255

= Использование определенного языка =
В данном случае при шифрации используется один, или несколько языков. Т.е при шифрации, например, русских символов используются русские символы, а при шифрации латинских- латинские. Поэтому формула 1 будет выглядеть следующим образом:
Shn=128+(Sn-128+2) mod 32 для русских заглавных символов
Shn=65+(Sn-65+2) mod 26 для латинских заглавных символов
Shn=97+(sn-97+2) mod 26 для латнских строчных символов
для русских строчных символов данная формула выглядит несколько сложнее ,из-за особенности таблицы ASCII, и ее вы можете поглядеть в исходном тексте программ.


Программа на BASIC

'Шифр Цезаря
CLS
COLOR 15, 1
PRINT "Шифрация методом Цезаря Автор: Якунин Максим"
COLOR 15, 0
INPUT "Введите имя шифруемого файла: "; inpF$
INPUT "Введите имя зашифрованного файла: "; OutF$
OPEN inpF$ FOR INPUT AS #1
OPEN OutF$ FOR OUTPUT AS #2
WHILE NOT EOF(1)
INPUT #1, mstr$
FOR k = 1 TO LEN(mstr$)
sim$ = MID$(mstr$, k, 1)
GOSUB 10
MID$(mstr$, k, 1) = shif$
NEXT k
PRINT #2, mstr$
WEND
CLOSE #1
CLOSE #2
PRINT "Шифрация закончена!"
END
10 SELECT CASE sim$
CASE "а" TO "н"
shif$ = CHR$(ASC(sim$) + 2)
CASE "о"
shif$ = "р"
CASE "п"
shif$ = "с"
CASE "р" TO "э"
shif$ = CHR$(ASC(sim$) + 2)
CASE "ю"
shif$ = "а"
CASE "я"
shif$ = "б"
CASE "А" TO "Я"
shif$ = CHR$((ASC(sim$) - ASC("А") + 2) MOD 32 + ASC("А"))
CASE "a" TO "z"
shif$ = CHR$((ASC(sim$) - ASC("a") + 2) MOD 26 + ASC("a"))
CASE "A" TO "Z"
shif$ = CHR$((ASC(sim$) - ASC("A") + 2) MOD 26 + ASC("A"))
CASE ELSE
shif$ = sim$
END SELECT
RETURN

Программа на PASCAL

Program Cezars_Shifr;
uses crt;
const l=80; {Длинна строки}
var k: byte; {служебная переменная}
M_str: string[l]; {Читаемая строка}
I_f: text; {Файловая переменная}
o_f: text; {Файловая переменная}
I_name,O_Name: string[12]; {Имена файлов}
{-----Возвращает зашифрованный символ----------------------------}
Function shifr (sim: char):char;
const n=31; n1=26; { кол-во букв в английском алфавите}
Begin
{ Если символ sim попадает в указанные промежутки, то производится
шифрация символа по описанным формулам,если не попадает то он не изменяется}
case sim of
'а'..'н': shifr:=chr(ord(sim)+2);
'о': shifr:='р';
'п': shifr:='с';
'р'..'э': shifr:=chr(ord(sim)+2);
'ю': shifr:='а';
'я': shifr:='б';
'А'..'Я': shifr:= chr((ord(sim)-ord('А')+2) mod 31 +ord('А'));
'a'..'z': shifr:=chr((ord(sim)-ord('a')+2) mod n1 +ord('a'));
'A'..'Z': shifr:= chr((ord(sim)-ord('A')+2) mod n1+ord('A'));
else shifr:=sim
end
end;
{-------------------------------------------------------------------}
begin
clrscr; {Очищает экран }
textcolor(15);{Устанавливает белый цвет символов}
textBackGround(1);{Устанавливает синий цвет фона}
insLine;{Вставляет пустую строку цвета фона}
writeln('Шифровка методом Цезаря Автор: Якунин Максим');
textbackGround(0);{Устанавливаем черный цвет фона}
write('Введите имя шифруемого файла: ');
readln (i_name);{Читаем имя шифруемого файла}
write('Введите имя зашифрованного файла: ');
readln (O_name);{Читаем имя файла в который будем записывать шифрованный текст}
assign (i_f,i_name);{Связываем файловые переменные с}
assign (o_f,o_name);{именами файлов}
reset (i_f);{Открываем файл с именем i_name для чтения}
rewrite (o_f);{Открываем файл с именем o_name для записи}
Writeln ('Шифрую ...'); while not eof(i_f) do {Пока не достигли конца файла}
begin {выполняем}
readln (i_f,M_str);{Читаем из файла с именем i_name одну строку}
for k:=1 to l do m_str[k]:=shifr(m_str[k]); {Шифруем все символы прочитанной строки}
writeln (o_f,m_str);{сохраняем зашифрованную строку}
End; close (i_f);{Закрываем файл с именем i_name для чтения}
close (o_f);{Закрываем файл с именем о_name для чтения}
Writeln ('Шифрация закончена! Нажмите Enter.');
readln;
end.

БОЛЕЕ СОВЕРШЕННЫЙ МЕТОД ШИФРАЦИИ

Суть метода заключается в том, что данные шифруются при помощи некоторого ключа, в нашем случае это массив из десяти случайных чисел из диапазона 1-20. Т.е все данные разбиваются на группы по десять символов и, каждый символ шифруется методом Цезаря, но сдвиг осуществляется не на два, а на число с соответствующим индексом из массива ключа.(1-й на key[1], 2-й на key[2],...,10-й на key[10], 1-й на key[1] и так далее до конца). Для большей надежности шифрации будем использовать всю таблицу ASCII.
ПРИМЕР:
Ключ:
Индекс: 1 2 3 4 5 6 7 8 9 10
Число: 5 7 8 15 6 13 9 17 7 3

Шифруемый текст:
Он сел на скамью.
Зашифрованный текст:
У+(Ёл¬)-з#ц-и¬Єv7

Так как ключ при каждой шифрации меняется, то его нужно сохранять, но просто записывать его в файл было бы неразумно, потому что такой файл можно быстро расшифровать, зная метод шифрации. Поэтому для решения данной задачи я рекомендую вам делать следующее:
1) Использовать постоянный, известный только вам, ключ не сохраняя его в файле.
ДОСТОИНСТВА:
Расшифровать файл будет достаточно сложно, даже зная метод шифрации.
НЕДОСТАТКИ:
Злоумышленник ,узнав ключ и зная метод щифрации, получит доступ ко всем вашим зашифрованным данным.
2) Сохранять ключ в файле специальным образом.
ДОСТОИНСТВА:
Все зашифрованные файлы будут зашифрованы по разному, что увеличивает надежность.
НЕДОСТАТКИ:
В зашифрованном файле будет храниться ключ к дешифрации, поэтому разгадав каким образом он там храниться злоумышленник получит доступ к ключу, а следовательно, зная метод шифрации,к зашифрованным данным. В нашем примере ключ записывается в конец файла следующим образом:
1-е число заменяется на символ с номером 1+это число из таблицы ASCII. Затем 10-е число заменяется на символ с номером 1+данное число, и так далее. Чтобы числа не слились в единое число между ними ставится #.

Ключ из примера будет выгледеть так:
#########


Программа на BASIC


CLS
COLOR 15, 1 PRINT "Шифрация Автор: Якунин Максим Сергеевич"
COLOR 15, 0
PRINT
INPUT "Введите имя шифруемого файла: "; inpF$
INPUT "Введите имя зашифрованного файла: "; OutF$
OPEN inpF$ FOR INPUT AS #1
OPEN OutF$ FOR OUTPUT AS #2
PRINT "Шифрую..."
WHILE NOT EOF(1)
INPUT #1, mstr$
FOR k = 1 TO LEN(mstr$)
sim$ = MID$(mstr$, k, 1)
GOSUB 10
MID$(mstr$, k, 1) = shif$
NEXT k
PRINT #2, mstr$
WEND
CLOSE #1
CLOSE #2
PRINT "Шифрация закончена!"
END
10 SELECT CASE sim$
CASE "а" TO "н"
shif$ = CHR$(ASC(sim$) + 2)
CASE "о"
shif$ = "р"
CASE "п"
shif$ = "с"
CASE "р" TO "э"
shif$ = CHR$(ASC(sim$) + 2)
CASE "ю"
shif$ = "а"
CASE "я"
shif$ = "б"
CASE "А" TO "Я"
shif$ = CHR$((ASC(sim$) - ASC("А") + 2) MOD 32 + ASC("А"))
CASE "a" TO "z"
shif$ = CHR$((ASC(sim$) - ASC("a") + 2) MOD 26 + ASC("a"))
CASE "A" TO "Z"
shif$ = CHR$((ASC(sim$) - ASC("A") + 2) MOD 26 + ASC("A"))
CASE ELSE
shif$ = sim$
END SELECT
RETURN


Программа на PASCAL


Program shifr_lk;
uses crt;
const l=10; {Размер ключа}
var M_key: array[1..l] of byte; {Массив хранящий числа ключа}
k,c,t: byte;{Служебные переменные}
i_name,o_name: string[12];{Имена файлов}
m_str: string[80];{Читаемая строка}
i_f,o_f: text;{Файловые переменные}
{------Возвращает зашифрованный символ---------------}
function sh(sim: char; n: word): char;
begin sh:=chr((ord(sim)-1+n) mod 254+1) end;
{----------------------------------------------------}
begin
clrscr;
randomize;{Включение генератора случайных чисел}
for c:=1 to l do m_key[c]:=1+random (20); {Формирование ключа}
textcolor (15);
textbackground(1);
insline;
writeln(' Шифратор Автор: Якунин Максим Сергеевич');
textbackground(0);
writeln;
write ('Введите имя шифруемого файла: ');
readln(i_name); {Ввод имени шифруемого файла}
write ('Введите имя зашифрованного файла: ');
readln (o_name);{Ввод имени зашифрованного файла}
assign (i_f,i_name);
assign (o_f,o_name);
reset (i_f); {Открываем файл с именем i_name для чтения}
rewrite (o_f);{Открываем файл с именем o_name для записи}
Writeln ('Шифрую ...');
t:=1;
while not eof(i_f) do {Пока не достигли конца файла}
begin {выполняем}
readln (i_f,M_str); {Читаем из файла с именем i_name одну строку}
for k:=1 to 80 do
begin
m_str[k]:=sh(m_str[k],M_key[t]); {Шифруем все символы проч}
t:=t+1;
if t=11 then t:=1;
end;
writeln (o_f,m_str);
End;
writeln ('Сохраняем ключ к дешифрации...');
for k:=0 to 4 do
begin
write (o_f,chr(1+M_key[1+k]));
write (o_f,'#');
write (o_f,chr(1+M_key[10-k]));
write (o_f,'#');
end;
close (i_f);
close (o_f);
Writeln ('Шифрация закончена! Нажмите Enter.');
readln;
end.

Программа метода шифрации с использованием "исключающего или"
Шифрация методом XOR

PROGRAM max1;
uses crt;
var i_f: text;
O_f: text;
l,t,k: byte;
pasw: string[20];
i_name,O_name: string[12];
m_str: string[80];
begin
clrscr;
textcolor(15);
textBackground(1);
insline;
writeln('');
writeln;
textBackground(0);
write('Введите пароль: ');
readln(pasw);
l:=length (pasw);
write('Введите имя шифруемого файла: ');
readln(i_name);
write('Введите имя зашифрованного файла: ');
readln(o_name);
assign (i_f,i_name);
assign (o_f,o_name);
reset (i_f); {Открываем файл с именем i_name для чтения}
rewrite (o_f);{Открываем файл с именем o_name для записи}
Writeln ('Шифрую ...');
t:=1;
while not eof(i_f) do {Пока не достигли конца файла}
begin {выполняем}
readln (i_f,M_str); {Читаем из файла с именем i_name одну строку}
for k:=1 to 80 do
begin
m_str[k]:=chr(ord(m_str[k]) xor ord (pasw[t])); {Шифруем все символы проч}
if t=l then t:=1
else t:=t+1;
end;
writeln (o_f,m_str);
End;
write ('Шифрация закончена!');
readln;
end.