Разработка программы шифрования текста

курсовая работа

2.1.3 Работа основных функций в программе

1. Все функции получают буквенное значение переменной word, далее:

function Atbash

Служит для шифрования и дешифрования методом Атбаш.

Запускается цикл, в котором каждой букве присваивается новое значение из таблицы ASCII. Функция ord возвращает символу под номером i его номер из таблица ASHII, далее этот номер вычитается из 219, если символ принадлежит определённому промежутку (219=97+122, т.е. равен сумме номеров символа a и z; 155=65+90, сумма номеров символов Z и a). В следующем действии функция chr возвращает символьный эквивалент получившемуся числу.

Функция выглядит следующим образом:

function Atbash(toCode: string): string;

var i: integer;

begin

for i := 1 to length(toCode) do

if ((toCode[i]>=a) and (toCode[i]<=z))

then toCode[i]:=Chr(219-Ord(toCode[i]));

if ((toCode[i]>=A) and (toCode[i]<=Z))

then toCode[i]:=Chr(155-Ord(toCode[i]));

Atbash := toCode;

end;

function CaesarEncipher (…)

Служит для шифрования методом Цезаря.

Запускается цикл, в котором каждой букве присваивается новое значение из таблицы ASCII. Функция ord возвращает символу под номером i его номер из таблица ASHII, далее к этому номеру прибавляется число 3, тем самым осуществляется «сдвиг» порядкового номера на 3 позиции вправо.

Функция выглядит следующим образом:

function CaesarEncipher(toCode: string): string;

var i, T: integer;

begin

for i := 1 to length(toCode) do begin

toCode[ i ] := Chr((Ord(toCode[ i ]) + 3));

end;

CaesarEncipher := toCode;

end;

function CaesarDecipher (…)

Служит для дешифрования методом Цезаря.

Процесс аналогичен шифрованию, но «сдвиг» элемента осуществляется на 3 позиции влево.

Функция выглядит следующим образом:

function CaesarDecipher(toDecode: string): string;

var i, T: integer;

begin

for i := 1 to length(toDecode) do begin

toDecode[ i ] := Chr((Ord(toDecode[ i ]) - 3));

end;

CaesarDecipher := toDecode;

end;

function PolibiusEncipher (…)

Служит для шифрования методом Полибия.

Запускается цикл, в котором каждой букве присваивается новое значение, состоящее из двух символов ix и jx, где оба символа берутся из первой строки: ix соответствует номеру строки элемента, jx номеру столбца.

Функция выглядит следующим образом:

function PolibiusEncipher(toCode: string): string;

var

i: integer;

ix, jx: char;

s: string;

begin

s := ;

for i := 1 to length(toCode) do begin

for ix := A to H do

for jx := A to H do

if TPolibius[ix, jx] = toCode[ i ] then begin

s := s + ix + jx;

break;

end;

end;

PolibiusEncipher := s

end;

function PolibiusDecipher (…)

Служит для дешифрования методом Полибия.

Запускается цикл while, в котором берётся первый символ, выражения требующего дешифровки (он представляет строку исходного символа), затем второй символ (он представляет столбец исходного символа). После этого в массиве TViginer на пересечении строки и столбца берётся нужный элемент. (Функция succ возвращает следующее буквенное значение, т.к. при шифровании элемент заменяется двумя символами, идущими подряд. Функция inc увеличивает величину на 2 ).

TViginer: string =

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz;

TPolibius: array[A .. H,A .. H] of char = (

(A, B, C, D, E, F, G, H),

(I, J, K, L, M, N, O, P),

(Q, R, S, T, U, V, W, X),

(Y, Z, a, b, c, d, e, f),

(g, h, i, j, k, l, m, n),

(o, p, q, r, s, t, u, v),

(w, x, y, z, 1, 2, 3, 4),

(5, 6, 7, 8, 9, _, +, -) );

Функция выглядит следующим образом:

function PolibiusDecipher(toDecode: string): string;

var

i: integer;

s: string;

begin

s := ;

i := 1;

while i <= length(toDecode) do begin

s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];

inc(i, 2);

end;

PolibiusDecipher := s

end;

function GronsfeldEncipher (…)

Служит для шифрования методом Гронсфельда.

Запускается цикл for, в котором зашифрованный элемент образуется засчёт присвоения первоначальному элементу номера, равного сумме номера этого элемента, номера символа ключа и разности номера элемента «0», т.к. он идёт перед порядковым номером символа ключа (из таблицы ASCHII).

Функция выглядит следующим образом:

function GronsfeldEncipher(toCode, K: string): string;

var i, T: integer;

begin

for i := 1 to length(toCode) do begin

toCode[ i ] := Chr(Ord(toCode[ i ])+(Ord(K[(pred(i) mod length(K)) + 1]) - Ord(0)));

end;

GronsfeldEncipher := toCode;

end;

function GronsfeldDecipher (…)

Служит для дешифрования методом Гронсфельда.

Принцип аналогичен шифрованию, с разницей в том, что сдвиг, образованный ключом в данном случае снимается.

Функция выглядит следующим образом:

function GronsfeldDecipher(toDecode, K: string): string;

var i, T: integer;

begin

for i := 1 to length(toDecode) do begin

toDecode[ i ] := Chr(Ord(toDecode[i])-(Ord(K[(pred(i) mod length(K)) + 1]) - Ord(0)));

end;

GronsfeldDecipher := toDecode;

end;

function ViginerEncipher (…)

Служит для шифрования методом Виженера.

Запускается цикл, в котором новое значение символа получается благодаря:

в начале использованию переменной, которой присваивается значение, равное номеру элемента, вычисленного функцией pos (функция pos ищет первое пересечение буквы кодового слова и массива TViginer, затем выдаёт номер данного элемента в массиве), минус 1

конечный элемент берётся из массива TViginer. Его номер равен номеру элемента пересечения символа вводимого текста минус 1, прибавить подсчитанную выше переменную, взять целую часть от деления всего этого на длину массива (52 символа) и прибавить 1.

Функция выглядит следующим образом:

TViginer: string =

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz;

function ViginerEncipher(toCode, K: string): string;

var

i: integer;

currK: byte;

s: string;

begin

s := ;

for i := 1 to length(toCode) do begin

currK := pred(pos(K[ (pred(i) mod length(K)) + 1 ], TViginer));

s := s + TViginer[ ((pred(pos(toCode[ i ], TViginer)) + currK) mod length(TViginer))+1];

end;

ViginerEncipher := s;

end;

function ViginerDecipher (…)

Служит для дешифрования методом Виженера.

Отличается от предыдущего шифрования номером символа, берущегося из массива. Он равен номеру пересечения элемента, уменьшенному на значение подсчитанной ранее переменной.

Функция выглядит следующим образом:

function ViginerDecipher(toDecode, K: string): string;

var

i, T: integer;

currK: byte;

s: string;

begin

s := ;

for i := 1 to length(toDecode) do begin

currK := pred(pos(K[ (pred(i) mod length(K)) + 1 ], TViginer));

T := pred(pos(toDecode[ i ], TViginer)) - currK;

I f T < 0 then inc(T, length(TViginer));

s := s + TViginer[T + 1];

end;

ViginerDecipher := s;

end;

2. Все функции возвращают переменную toCode или toDecode в значении s.

Делись добром ;)