3
|
А
|
М
|
Е
|
Н
|
А
|
К
|
Л
|
Ю
|
Ч
|
К
|
Л
|
По формуле шифра Вижинера находим:
Y1= 8 + ll (mod33) = 19 Þ T;
Y2= l + 12 (mod33) = 13 Þ M;
Y3= 13 + 31 (mod 33) = 11 Þ К;
Y4= 6 + 24 (mod 33) = 30 Þ Ю;
Y5= 14 + 11 (mod 33) = 25 Þ Ш;
Y6 = 1 + 12 (mod 33) = 13 Þ М.
Шифротекст: "ТМКЭШМ".
Шифры Бофора используют формулы:
yi = ki - xi(mod g) и
yi = Xi - ki(mod g).
Гомофоническая замена одному символу открытого текста ставит в
соответствие несколько символов шифротекста. Этот метод применяется для
искажения статистических свойств текста.
Это довольно распространенный криптографический метод, принцип
которого заключается в генерации гаммы шифра с помощью датчика ПСЧ и наложении
полученной гаммы на открытые данные обратимым образом (например, при
использовании логической операции "исключающее ПЛИ").
Процесс расшифрования данных сводится к повторной генерации гаммы шифра
при известном ключе и наложению такой гаммы на зашифрованные данные.
Полученный зашифрованный текст достаточно труден для раскрытия в том случае, когда
гамма шифра не содержит повторяющихся битовых последовательностей. Фактически
если период гаммы превышает длину всего зашифрованного текста и неизвестна
никакая часть исходного текста, то шифр можно раскрыть только прямым перебором
(подбором ключа).
На основе теории групп разработано несколько типов датчиков ПСЧ.
Наиболее доступны и эффективны конгруэнтные генераторы ПСЧ. Например, линейный
конгруэнтный датчик ПСЧ вырабатывает последовательности псевдослучайных чисел
T(i), описываемые соотношением
T(i+l) = [AT(i) + C]mod M,
Где А и С - константы; Т(0) - исходная величина, выбранная в качестве
порождающего числа.
Такой датчик ПСЧ генерирует псевдослучайные числа с определенным
периодом повторения, зависящим от выбранных значений А и С. Значение М обычно
устанавливается равным 25, где b - длинна слова ЭВМ в битах.
Одноключевая модель использует для шифрования и дешифрования один и тот
же секретный ключ, который должен быть неизвестен криптоаналитику противника.
Поэтому такая система называется одноключевой криптосистемой с секретными
ключами. Проблема распространения этих секретных ключей является одной из
главных трудностей при практическом использовании такой криптосистемы. Для
распространения секретных ключей требуются защитные каналы связи. Стоимость и
сложность распространения этих ключей оказываются очень большими.
ПП SHIFR_PLEYFER для определения координат
символов матрицы Плэйфера.
SHIFR_PLEYFER(Alfavit, INDEX)
|
Список
формальных параметров:
Alfavit,
INDEX
Входные
параметры:
INDEX -
матрица символов Плэйфера, величина символьная.
Выходные
параметры:
Alfavit -
хранит координаты символов матрицы Плэйфера, величины целого типа.
Алгоритм
Начало
ПП SHIFR_PLEYFER (Alfavit, INDEX)
Описание
массивов: Alfavit[255], INDEX[6, 6]
I = 1
нет
I <= 6
J = 1
нет
J <= 6
Alfavit[Ord(INDEX[I,
J])].Strok = I
Alfavit[Ord(INDEX[I,
J])].Stolb = J
J = J
+ 1
I = I + 1
Конец
ПП SHIFR_PLEYFER
|
Обозначения
1. Описание
массивов Alfavit, INDEX
2 .. 5, 7,
8 Организация цикла заполнения массива Alfavit типа запись
6. Определение
строк и столбов для символов матрицы INDEX
ПФ SHIFR_TXT производит шифрование строки
<Str> открытого текста.
SHIFR_TXT(Str, Alfavit, INDEX)
|
Список
формальных параметров:
Str,
Alfavit, INDEX
Входные
параметры:
Str -
строка открытого текста, величина строка.
Alfavit -
хранит координаты символов матрицы Плэйфера, величины целого типа.
Выходные
параметры:
SHIFR_TXT -
принимает значение зашифрованной строки, величины строка.
Обозначения
1. Описание
массивов Alfavit, INDEX.
2 .. 7 В
открытом тексте вставляется “-”между одинаковыми символами.
8 .. 9 Добавление
“-” в конец открытого текста, в случае нечет. кол-ва символов в строке
<Str>.
10 .. 13 Организация
по парного перебора символов строки открытого текста.
14 .. 15 Пара
символов находится в одной строке матрицы алфавита Плэйфкра.
16 .. 17 Пара
символов находится в одном столбце матрицы алфавита Плэйфера.
18. Пара
символов находится в разных строках и столбцах матрицы алфавита Плэйфера.
19. Присваивание
ПФ SHIFR_TXT значения новой строки <New>
Продолжение
следует¼
Алгоритм
Начало
ПФ SHIFR_TXT (Str, Alfavit, INDEX)
Описание массивов: Alfavit[255], INDEX[6, 6]
New = “, Dlina_str = Length(Str), I = 1
нет
I
<= Dlina_str
да нет
Str[I] = Str[I + 1]
New = ( New + Str[I] + ‘-’ ) New
= ( New + Str[I] )
I
= I + 1
нет
Odd(Length(Str))
= TRUE
New = New + ‘-’
Str = “, Dlina_new = Length(New)div 2, I = 1
нет
I <= Dlina_new
SIM1 =
New[2*I - 1], SIM2 = New[2*I] SHIFR_TXT = Str
I
= I + 1 Конец ПФ SHIFR_TXT
нет
ALFAVIT[Ord(SIM1)].STROK
= ALFAVIT[Ord(SIM2)].STROK
Str
= Str + INDEX[(ALFAVIT[Ord(SIM1)].STROK), ((ALFAVIT[Ord(SIM1)].STOLB mod 6) +
1)]
+
INDEX[(ALFAVIT[Ord(SIM2)].STROK), ((ALFAVIT[Ord(SIM2)].STOLB mod 6) + 1)]
нет
ALFAVIT[Ord(SIM1)].STOLB
= ALFAVIT[Ord(SIM2)].STOLB
Str
= Str + INDEX[((ALFAVIT[Ord(SIM1)].STROK mod 6) + 1),
(ALFAVIT[Ord(SIM1)].STOLB)]
+
INDEX[((ALFAVIT[Ord(SIM2)].STROK mod 6) + 1), (ALFAVIT[Ord(SIM2)].STOLB)]
Str
= Str + INDEX[(ALFAVIT[Ord(SIM2)].STROK), (ALFAVIT[Ord(SIM1)].STOLB)]
+ INDEX[(ALFAVIT[Ord(SIM1)].STROK),
(ALFAVIT[Ord(SIM2)].STOLB)]
|
ПФ DESHIFR_TXT производит расшифрацию строки
<Str> открытого текста.
DESHIFR_TXT(Str, Alfavit, INDEX)
|
Список
формальных параметров:
Str,
Alfavit, INDEX
Входные
параметры:
Str -
строка открытого текста, величина строка.
Alfavit -
хранит координаты символов матрицы Плэйфера, величины целого типа.
INDEX -
матрица символов Плэйфера, величина символьная.
Выходные
параметры:
DESHIFR_TXT-
принимает значение расшифрованной строки, величины строка.
Обозначения
1. Описание
массивов Alfavit, INDEX.
2 .. 5 Организация
по парного перебора символов строки открытого текста.
6 .. 7 Пара
символов находится в одной строке матрицы алфавита Плэйфкра.
8 .. 9 Пара
символов находится в одном столбце матрицы алфавита Плэйфера.
10. Пара
символов находится в разных строках и столбцах матрицы алфавита Плэйфера.
11 .. 15 Из
расшифрованной строки <New> создается новая строка <Str> без спец.
знак “-”.
16. Присваивание
ПФ DESHIFR_TXT значения новой строки <Str>
Продолжение
следует¼
Алгоритм
Начало
ПФ DESHIFR_TXT (Str, Alfavit, INDEX)
Описание массивов: Alfavit[255], INDEX[6, 6]
New = “, Dlina_str = Length(Str)div 2, I
= 1
нет
I
<= Dlina_str
SIM1 = Str[2*I - 1], SIM2 = Str[2*I]
I = I + 1
нет
ALFAVIT[Ord(SIM1)].STROK
= ALFAVIT[Ord(SIM2)].STROK
New = New + INDEX[(ALFAVIT[Ord(SIM1)].STROK),
(((ALFAVIT[Ord(SIM1)].STOLB + 4)mod 6) + 1)]
+ INDEX[(ALFAVIT[Ord(SIM2)].STROK),
(((ALFAVIT[Ord(SIM2)].STOLB + 4)mod 6) + 1)]
нет
ALFAVIT[Ord(SIM1)].STOLB
= ALFAVIT[Ord(SIM2)].STOLB
New = New + INDEX[(((ALFAVIT[Ord(SIM1)].STROK + 4)mod
6) + 1), (ALFAVIT[Ord(SIM1)].STOLB)]
+ INDEX[(((ALFAVIT[Ord(SIM2)].STROK + 4)mod
6) + 1), (ALFAVIT[Ord(SIM2)].STOLB)]
New = New + INDEX[(ALFAVIT[Ord(SIM2)].STROK),
(ALFAVIT[Ord(SIM1)].STOLB)]
+ INDEX[(ALFAVIT[Ord(SIM1)].STROK),
(ALFAVIT[Ord(SIM2)].STOLB)]
Str = “, Dlina_new = Length(New), I = 1
нет
I
<= Dlina_new
нет
New[I]
¹ ‘-’
Str = Str + New[I]
I = I + 1
DESHIFR_TXT = Str
Конец ПФ DESHIFR_TXT
|
Алгоритм
Начало основного блока программы
Описание
массивов: Alfavit[255], INDEX[6, 6]
Вывод: “Выберите (S)ШИФРОВАТЬ или (D)ДЕШИФРОВАТЬ”
нет Ввод:
K
нет
UpCase(K) = ‘S’
UpCase(K) = ‘D’
Вывод: “Путь к файлу: ”
Ввод: Name1
Assign
(Var_file1, Name1)
Reset (Var_file1)
нет
IOResult = 0
Вывод: “Сохранить как: ”
Ввод: Name2
нет
Length(Name2) ¹
0
Assign
(Var_file2, Name2)
ReWrite (Var_file2)
SHIFR_PLEYFER(ALFAVIT, INDEX)
нет
NOT
EOF(Var_file1)
Ввод из файла Var_file1: Str
нет да
UpCase(K) = ‘S’
Str = DESHIFR_TXT(Str, ALFAVIT, INDEX) Str
= SHIFR_TXT(Str, ALFAVIT, INDEX)
Вывод в файл Var_file2: Str
Close (Var_file1)
Close (Var_file2)
Конец основного блока программы
|
Обозначения
1. Описание массивов Alfavit, INDEX.
2 .. 5 Выбор шифрование или расшифрация файла.
6 .. 9 Определение файла ввода данных.
10 .. 13 Определение файла вывода полученных
результатов.
14. Обращение к ПП SHIFR_PLEYFER(ALFAVIT,
INDEX).
15 .. 16 Перебор строк из файла Var_file1.
17. Выбор действий шифрование либо
расшифрация строки <Str>.
18. Обращение к ПФ DESHIFR_TXT(Str, ALFAVIT,
INDEX).
19. Обращение к ПФ SHIFR_TXT(Str, ALFAVIT,
INDEX).
20. Вывод результата в файл Var_file2.
21. Закрытие файлов ввода и вывода.
PROGRAM SHIFR_PLEYFERA;
USES Crt;
TYPE
path =
STRING[14];
Stroca
= STRING[255];
Simvol
= array [1..6, 1..6] of CHAR;
MATR =
array [1..255] of RECORD
STROK, STOLB: Byte;
END;
CONST INDEX: Simvol = (('А', 'Ж', 'Б', 'М', 'Ц',
'В'), {типизированные константы для матрицы Плэйфера}
('Ч',
'Г', 'Н', 'Ш', 'Д', 'О'),
('Е',
'Щ', ' , ', 'Х', 'У', 'П'),
('
. ', 'З', 'Ъ', 'Р', 'И', 'Й'),
('С',
'Ь', 'К', 'Э', 'Т', 'Л'),
('Ю',
'Я', ' ', 'Ы', 'Ф', '-'));
VAR
Var_file1
,Var_file2: Text;
Name1,
Name2: path;
ALFAVIT:
MATR;
Str:
Stroca;
K:
Char;
{Определение
координат символов матрицы Плэйфера}
PROCEDURE SHIFR_PLEYFER(Var ALFAVIT: MATR; INDEX:
Simvol);
VAR I, J: Byte; {I,
J - счетчики циклов}
BEGIN {Начало
основного блока ПП SHIFR_PLEYFER}
FOR
I:= 1 TO 6 DO for J:= 1 to 6 do
WITH
ALFAVIT[Ord(INDEX[I, J])] DO
begin
STROK:=
I; {строка символа}
STOLB:=
J; {столбец символа}
end;
END; {Конец
основного блока ПП SHIFR_PLEYFER}
{Производится
шифрование строки <Str> открытого текста}
FUNCTION SHIFR_TXT(Str: Stroca; Alfavit: MATR; INDEX:
Simvol): Stroca;
VAR {Объявление
переменных}
SIM1,
SIM2: Char;
New:
STRING;
I,
Dlina_str, Dlina_new: Byte; {I
- счетчик цикла}
BEGIN {Начало
основного блока ПФ SHIFR_TXT}
{В
открытом тексте вставляется спец. знак “-” между одинаковыми символами}
New:=
'';
Dlina_str:=
Length(Str);
FOR
I:= 1 TO Dlina_str DO IF (Str[I] = Str[I+1]) THEN New:= (New + Str[I] + '-')
ELSE New:= (New + Str[I]);
{Добавление
спец. знака “-” в конец открытого текста в случае нечетного количества символов
в строке <Str>}
IF
Odd(Length(Str)) = TRUE THEN New:= New + '-';
{Шифрование
открытого текста по матрице алфавита Плэйфера}
Str:=
'';
Dlina_new:=
Length(New)div 2;
FOR
I:= 1 TO Dlina_new DO
begin
SIM1:=
New[2*I - 1];
SIM2:=
New[2*I];
IF
(ALFAVIT[Ord(SIM1)].STROK = ALFAVIT[Ord(SIM2)].STROK) THEN
{Пара
символов находятся в одной строке матрицы}
Str:= Str + INDEX[(ALFAVIT[Ord(SIM1)].STROK), ((ALFAVIT[Ord(SIM1)].STOLB mod 6)
+ 1)]
+
INDEX[(ALFAVIT[Ord(SIM2)].STROK), ((ALFAVIT[Ord(SIM2)].STOLB mod 6) + 1)]
ELSE
IF
(ALFAVIT[Ord(SIM1)].STOLB = ALFAVIT[Ord(SIM2)].STOLB) THEN
{Пара
символов находятся в одном столбце матрицы}
Str:= Str + INDEX[((ALFAVIT[Ord(SIM1)].STROK mod 6) + 1),
(ALFAVIT[Ord(SIM1)].STOLB)]
+
INDEX[((ALFAVIT[Ord(SIM2)].STROK mod 6) + 1), (ALFAVIT[Ord(SIM2)].STOLB)]
ELSE
{Пара
символов находятся в разных строках и столбцах матрицы}
Str:= Str + INDEX[(ALFAVIT[Ord(SIM2)].STROK), (ALFAVIT[Ord(SIM1)].STOLB)]
+
INDEX[(ALFAVIT[Ord(SIM1)].STROK), (ALFAVIT[Ord(SIM2)].STOLB)];
end;
SHIFR_TXT:=
Str;
END; {Конец
основного блока ПФ SHIFR_TXT}
{Производится
расшифрация строки <Str>}
FUNCTION DESHIFR_TXT(Str: Stroca; Alfavit: MATR; INDEX:
Simvol): Stroca;
VAR {Объявление
переменных}
SIM1,
SIM2: Char;
NEW:
STRING;
I,
Dlina_str, Dlina_new: Byte; {I
- счетчик цикла}
BEGIN {Начало
основного блока ПФ DESHIFR_TXT}
{Дешифрование
открытого текста по матрице алфавита Плэйфера}
New:=
'';
FOR
I:= 1 TO Dlina_str DO
begin
SIM1:=
Str[2*I - 1];
SIM2:=
Str[2*I];
IF
(ALFAVIT[Ord(SIM1)].STROK = ALFAVIT[Ord(SIM2)].STROK) THEN
{Пара
символов находятся в одной строке матрицы}
New:= New + INDEX[(ALFAVIT[Ord(SIM1)].STROK), (((ALFAVIT[Ord(SIM1)].STOLB + 4)
mod 6) + 1)]
+
INDEX[(ALFAVIT[Ord(SIM2)].STROK), (((ALFAVIT[Ord(SIM2)].STOLB + 4) mod 6) + 1)]
ELSE
IF
(ALFAVIT[Ord(SIM1)].STOLB = ALFAVIT[Ord(SIM2)].STOLB) THEN
{Пара
символов находятся в одном столбце матрицы}
New:= New + INDEX[(((ALFAVIT[Ord(SIM1)].STROK + 4) mod 6) + 1),
(ALFAVIT[Ord(SIM1)].STOLB)]
+ INDEX[(((ALFAVIT[Ord(SIM2)].STROK + 4) mod 6) + 1), (ALFAVIT[Ord(SIM2)].STOLB)]
ELSE
{Пара
символов находятся в разных строках и столбцах матрицы}
New:= New + INDEX[(ALFAVIT[Ord(SIM2)].STROK), (ALFAVIT[Ord(SIM1)].STOLB)]
+
INDEX[(ALFAVIT[Ord(SIM1)].STROK), (ALFAVIT[Ord(SIM2)].STOLB)];
end;
{В
открытом тексте убирается спец. знак “-”}
Str:=
'';
Dlina_new:=
Length(New);
FOR
I:= 1 TO Dlina_new DO IF (New[I] <> '-') THEN Str:= (Str + New[I]);
DESHIFR_TXT:=
Str;
END; {Конец
основного блока ПФ DESHIFR_TXT}
{Начало
основного блока программы}
BEGIN
ClrScr;
{Выбор
шифрование или дешифрование файла}
WriteLn
('Выбери: (S)ШИФРОВАТЬ или (D)ДЕШИФРОВАТЬ ?');
REPEAT
K:= ReadKey;
UNTIL
(UpCase(K) = 'S') OR (UpCase(K) = 'D');
{Определение
файла ввода}
{$I-}
REPEAT
Write ('Путь к файлу: ');
ReadLn (Name1);
Assign (Var_file1, Name1);
Reset (Var_file1);
UNTIL
(IOResult = 0);
{$I+}
{Определение
файла вывода}
REPEAT
Write ('Сохранить как: ');
ReadLn (Name2);
UNTIL
(Length(Name2) <> 0);
Assign
(Var_file2, Name2);
Rewrite(Var_file2);
{Обращение
к ПП SHIFR_PLEYFER}
SHIFR_PLEYFER(ALFAVIT, INDEX);
{Цикл
перебора строк открытого текста}
WHILE
NOT EOF(Var_file1) DO
begin
ReadLn
(Var_file1, Str);
{Обращение
к ПФ SHIFR_TXT либо ПФ DESHIFR_TXT}
IF
UpCase(K) = 'S' THEN Str:= SHIFR_TXT(Str, Alfavit, INDEX) ELSE Str:= DESHIFR_TXT(Str,
Alfavit, INDEX);
WriteLn
(Var_file2, Str);
end;
Close
(Var_file2); {Закрытие
файла Name2}
Close
(Var_file1); {Закрытие
файла Name1}
END. {Конец
основного блока программы}
{test.txt} - исходный открытый текст.
ШИФР ПЛЭЙФЕРА
МАЛЬЧИК НА КУХНЕ
УКСУС НАШЕЛ.
С ЧАЙНОЙ ЧАШКОЙ К
ДЕДУ ПРИШЕЛ.
ДЕДУШКА, МИЛЕНЬКИЙ,
СДЕЛАЙ ГЛОТОК...
СТАРЕНЬКИЙ ДЕДУШКА
НА ПОЛ ПОТЕК.
{test.plf} - зашифрованный файл (test.txt)
РДИЫ,-СТ-И.ХЮВ
БЫСВГСТЪБ,ЮБ,ТШ,Ю,Т,ЕТЮКБЧХЧЙС
КЮНЮ.ВШЧ-ЪЕЧЭНПЛБ
НФЧУФ,ЙХДРСПЮЙ
НФЧУДХБСЪБРЦПСКГЪТПЪКЮУЧВС-ЪЬОЛДЛНЮЙЮЙЮЙ
КЮЦСХ.КГЪТ-ЪУЧУИЭНЮББЧ,-П-,-ЛДС,ЮЙ
{test.new} - расшифрованный файл (test.plf)
ШИФР ПЛЭЙФЕРА
МАЛЬЧИК НА КУХНЕ
УКСУС НАШЕЛ.
С ЧАЙНОЙ ЧАШКОЙ К
ДЕДУ ПРИШЕЛ.
ДЕДУШКА, МИЛЕНЬКИЙ,
СДЕЛАЙ ГЛОТОК...
СТАРЕНЬКИЙ ДЕДУШКА
НА ПОЛ ПОТЕК.
1.
Защита информации в
персональных ЭВМ/ А.В.Спесивцев, В.А.Вегнер, А.Ю.Крутяков и др. - М.: Радио и
связь, МП 'Веста',1993.
2.
3ащита программного
обеспечения: Перевод с английского./ Под редакцией Д.Гроувера. - М.: Мир 1992.
3.
Рощин Б.В.Элементы
криптозащиты информации: Учебное пособие. - М.: Издательство МАИ, 1995.
4.
А.В.Петраков. Защита и
охрана личности, собственности, информации: Справное пособие. - М.: Радио и
связь, 1997.