Шифр квадрат Плейфера на русском

вот код может поможет дочитайте там код
Классические алгоритмы шифрования. Алгоритм Плейфера (Playfair).
Базируется на методе многобуквенного шифрования, где элементом считается биграма (2 буквы). Основан на использовании буквенной матрицы (для русского алфавита удобно взять матрицу 5х6, для английского 5х5). Матрица строится на основе некоторого ключевого слова. Матрица заполняется слева направо, сверху вниз. Сначала записывается ключевое слово (причём повторяющиеся буквы пропускаются). Затем записывается весь оставшийся алфавит (опять же исключая те буквы, которые уже находятся в матрице). В результате построения будет получена буквенная матрица с неповторяющимися символами.
На рисунке1 построена матрица по ключевому слову "форум".

Подготовка
Основные требования к открытому (исходному) тексту:

при разбиении исходного текста на биграммы не должна возникнуть ситуация, когда в одной биграмме 2 символа одинаковы.
длинна исходного текста должна быть чётной.

Пример: слово РОССИЯ.
разбиваем на биграммы: РО|СС|ИЯ
Как видим во второй биграме у нас 2 одинаковых символа, необходимо изменить текст так, чтобы устранить эту ситуацию. Для этого вводится некий разделяющий символ. (я выбрал "ъ" - т.к. он достаточно редко встречается)
Получаем: РО|СЪ|СИ|Я
Длина текста нечётная. Опять используя наш символ получаем: РО|СЪ|СИ|ЯЪ
Теперь можно приступить к шифрованию.

Шифрование
Шифрование каждой биграммы происходит по следующим правилам:

Если буквы биграммы попадают в одну и туже строчку матрицы, то каждую из них заменяем буквой следующую за ней (справа) в той же строке. (строку считаем цикличной).
Если буквы биграммы попадают в один и тот же столбец матрицы, то каждую из них заменяем буквой следующую за ней (вниз) в том же столбце (столбец считаем цикличным).
Если не выполняется ни 1, ни 2 правила, то каждая буква из биграммы заменяется буквой, находящейся на пересечении строки, содержащей эту букву, и столбца, где содержится вторая буква.

Закодируем наше слово РО|СЪ|СИ|ЯЪ. Ключ: форум.
1) РО - буквы в одной строчке (Правило1). Букву Р заменяем на У, букву О зменяем на Р.
2) СЪ - буквы не лежат в одном столбце, и не лежат в одной строке (Правило3). Буквы С заменяем на Т, букву Ъ заменяем на Щ.
3) СИ - буквы не лежат в одном столбце, и не лежат в одной строке (Правило3). Буквы С заменяем на Т, букву И заменяем на З.
4) ЯЪ - буквы в одной строчке (Правило1). Букву Я заменяем на Щ, букву Ъ зменяем на Ы.
(Если что-то не понятно, посмотрите Рисунок2)

Всё, при шифровании слова РОССИЯ мы получили УРТЩТЗЩЫ. (При дешифровании мы получим РОСЪСИЯЪ. Зная, что Ъ может быть использован как разделяющий, человек легко поймёт смысл сообщения)

Дешифрование
Аналогично правилам при шифровании:

Если буквы биграммы попадают в одну и туже строчку матрицы, то каждую из них заменяем предыдущей буквой (слева) в той же строке. (строку считаем цикличной).
Если буквы биграммы попадают в один и тот же столбец матрицы, то каждую из них заменяем предыдущей буквой (вверх) в том же столбце (столбец считаем цикличным).
Если не выполняется ни 1, ни 2 правила, то каждая буква из биграммы заменяется буквой, находящейся на пересечении строки, содержащей эту букву, и столбца, где содержится вторая буква.

//Шифрование Плэйфера
function Playfair_Crypt(s,key:string):string;
const
//Размер ключевой матрицы:
MaxX = 6;//столбцы
MaxY = 5;//строки
//Наш алфавит. Размер должен быть MaxY*MaxX.
//Поэтому в нашем случае убраны буквы "ё", "й", "ь".
URusA = 'абвгдежзиклмнопрстуфхцчшщъыэюя';

var i,j,t,x1,x2,y1,y2 :integer;
M : array[1..MaxY,1..MaxX]of char; //ключевая матрица
temp :string;

//Функция поиска символа "с" в ключевой матрице.
//Возвращает строку "y" и столбец "x".
Procedure SimbolPos(c:char;var x,y:integer);
var i,j:integer;
begin
x:=0;
y:=0;
for i := 1 to MaxY do
for j := 1 to MaxX do
if c=M[i,j] then
begin
x:=j;
y:=i;
exit;
end;
end;

label M1;
begin
//переводим ключ и исходный текст в нижний регистр.
key:=AnsiLowerCase(key);
s:=AnsiLowerCase(s);
//удаляем из строки все символы, не входящие в наш алфавит.
temp:='';
for i := 1 to length(s) do if pos(s[i],URusA)<>0 then temp:=temp+s[i];
s:=temp;
//Создание ключевой матрицы, с использованием ключевого слова "key".
temp:='';
for i:=1 to length(key) do
if pos(key[i],temp)=0 then temp:=temp+key[i];
for i:=1 to length(URusA) do
if pos(URusA[i],temp)=0 then temp:=temp+URusA[i];
t:=0;
for i:=1 to 5 do
for j:=1 to 6 do
begin
inc(t);
M[i,j]:=temp[t];
form1.StringGrid1.Cells[j,i]:=temp[t];
end;

//просмотр строки по парам символов и вставка разделяющего символа
//"ъ" в случае когда в паре попались одинаковые символы.
M1:
for i:=1 to length(s)div 2 do
begin
if s[2i-1]=s[2i] then
begin
insert('ъ',s,2i);
goto M1;
end;
end;
//Добавляем символ в конец строки, если её длина нечётная.
if length(s) MOD 2 = 1 then if s[length(s)]<>'ъ' then s:=s+'ъ'
else s:=s+'я';
temp:='';
for i:=1 to length(s)div 2 do
begin
SimbolPos(s[2
i-1],x1,y1);
SimbolPos(s[2*i],x2,y2);
//Правило 1
if y1 = y2 then
begin
inc(x1); inc(x2);
if x1 > MaxX then x1:=x1-MaxX;
if x2 > MaxX then x2:=x2-MaxX;
temp:=temp+M[y1,x1]+M[y2,x2];
end;
//Правило 2
if x1 = x2 then
begin
inc(y1); inc(y2);
if y1 > MaxY then y1:=y1-MaxY;
if y2 > MaxY then y2:=y2-MaxY;
temp:=temp+M[y1,x1]+M[y2,x2];
end;
//Правило 3
if (x1<>x2) and (y1<>y2) then temp:=temp+M[y1,x2]+M[y2,x1];
end;
Playfair_Crypt:=temp;
end;

//Дешифрование Плэйфера
function Playfair_DeCrypt(s,key:string):string;
const
//Размер ключевой матрицы:
MaxX = 6;//столбцы
MaxY = 5;//строки
//Наш алфавит. Размер должен быть MaxY*MaxX.
//Поэтому в нашем случае убраны буквы "ё", "й", "ь".
URusA = 'абвгдежзиклмнопрстуфхцчшщъыэюя';

var i,j,t,x1,x2,y1,y2 :integer;
M : array[1..MaxY,1..MaxX]of char; //ключевая матрица
temp :string;

//Функция поиска символа "с" в ключевой матрице.
//Возвращает строку "y" и столбец "x".
Procedure SimbolPos(c:char;var x,y:integer);
var i,j:integer;
begin
x:=0;
y:=0;
for i := 1 to MaxY do
for j := 1 to MaxX do
if c=M[i,j] then
begin
x:=j;
y:=i;
exit;
end;
end;

label M1;
begin
//переводим ключ и исходный текст в нижний регистр.
key:=AnsiLowerCase(key);
s:=AnsiLowerCase(s);
//удаляем из строки все символы, не входящие в наш алфавит.
temp:='';
for i := 1 to length(s) do
begin
if pos(s[i],URusA)<>0 then temp:=temp+s[i];
end;
s:=temp;
//Создание ключевой матрицы, с использованием ключевого слова "key".
temp:='';
for i:=1 to length(key) do
if pos(key[i],temp)=0 then temp:=temp+key[i];
for i:=1 to length(URusA) do
if pos(URusA[i],temp)=0 then temp:=temp+URusA[i];
t:=0;
for i:=1 to 5 do
for j:=1 to 6 do
begin
inc(t);
M[i,j]:=temp[t];
end;

temp:='';
for i:=1 to length(s)div 2 do
begin
SimbolPos(s[2i-1],x1,y1);
SimbolPos(s[2
i],x2,y2);
//Правило 1
if y1 = y2 then
begin
dec(x1); dec(x2);
if x1 <= 0 then x1:=x1+MaxX;
if x2 <= 0 then x2:=x2+MaxX;
temp:=temp+M[y1,x1]+M[y2,x2];
end;
//Правило 2
if x1 = x2 then
begin
dec(y1); dec(y2);
if y1 <= 0 then y1:=y1+MaxY;
if y2 <= 0 then y2:=y2+MaxY;
temp:=temp+M[y1,x1]+M[y2,x2];
end;
//Правило 3
if (x1<>x2) and (y1<>y2) then temp:=temp+M[y1,x2]+M[y2,x1];
end;
Playfair_DeCrypt:=temp;
end;

Copied from: http://atree.click/cn/showdetail.php?cid=6916

Это запрос на создание калькулятора, оставленный пользователем

По этому запросу еще не было создано ни одного калькулятора. Если Вы заинтересованы в создании такого калькулятора, оставьте ниже Ваш комментарий.
Ссылка скопирована в буфер обмена
PLANETCALC, Шифр квадрат Плейфера на русском

Комментарии