Защита информации в ПЭВМ. Шифр Плейфера — страница 9

  • Просмотров 6414
  • Скачиваний 424
  • Размер файла 31
    Кб

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:= ''; Dlina_str:= Length(Str)div 2; 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)