вот само условие :
Можно использовать и усложненную перестановку. Для
этого открытый текст записывается в матрицу по определенному ключу k1,
определяющему порядок записи открытого текста в строки матрицы при
шифровании. Шифртекст образуется при считывании из этой матрицы по
ключу k2, определяющему, в каком порядке записывается информация из
столбцов матрицы. Для реализации такого варианта перестановки можно не использовать непосредственно матрицу, а осуществлять перерасчет коэф- фициентов.
Код:
Var
q,k: integer;
SS: Array[1..k] of String;
Text,Text_1,Text_2,Text_3,S: String;
Textmatr: Array[1..q,1..k] of Char;
i,j,kolsimvolov,code: integer;
key1: array[1..q] of Byte;
key2: array[1..k] of Byte;
p,m: Boolean;
Begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
//-------------------------------------------------------------
write ('Введите количество строк в матрице: ');
readln (q);
write ('Введите количество столбцов вматрице: ');
readln (k);
repeat
Write('Введи текст для кодировки: ');
Readln(Text);
kolsimvolov:=Length(text);
m:=True;
if kolsimvolov>q*k then m:=False;
if not(m) then writeln('количество символов не должно превышать ', q*k);
until m;
//-------------------------------------------------------------
If kolsimvolov< q*k then //если кол-во символов текста не кратно кол-ву символов в блоке дополняем его пробелами
repeat
text:=text+' ';
Inc(kolsimvolov);
until kolsimvolov=q*k;
//------------------------------------------------------------
Repeat
Write('Введите ключ1 ', q,' цифр(ы) без пробелов): ');
Readln(S);
for i:=1 to q do
Val(S[i],key1[i],Code);
p:=true;
for i:=1 to 5 do
for j:=i+1 to 6 do
if (key1[i]=key1[j]) then p:=false;
If Not(p) then writeln('Все цифры должны быть различными!');
Until p;
//-------------------------------------------------------------
Repeat
Write('Введите ключ2 ', k, ' цифр(ы) без пробелов): ');
Readln(S);
for i:=1 to k do
Val(S[i],key2[i],Code);
p:=true;
for i:=1 to k-1 do
for j:=i+1 to k do
if (key2[i]=key2[j]) then p:=false;
If Not(p) then writeln('Все цифры должны быть различными!');
Until p;
Writeln;
//------------------------------------------------------
For i:=1 to q do
For j:=1 to k do
Textmatr[key1[i],j]:=Text[(i-1)*k+j];
Writeln(' k1\k2 1 2 3 4');
For i:=1 to q do
begin
Write(' ',i,' ');
For j:=1 to k do
write(' ',textmatr[i,j],' ');
Writeln;
end;
//------------------------------------------------------
Text_1:='';
For j:=1 to k do
for i:=1 to q do
begin
S:=textmatr[i,key2[j]];
Text_1:=Text_1+S;
end;
Writeln('Закодированный текст: ',text_1);
//-------------------------------------------------------
Text_2:='';
For j:=1 to k do
SS[key2[j]]:=Copy(Text_1,(j-1)*q+1,q);
For j:=1 to 4 do
Text_2:=Text_2+SS[j];
//-------------------------------------------------------
Text_3:='';
For i:=1 to q do
For j:=1 to k do
begin
S:=Copy(Text_2,(j-1)*q+key1[i],1);
Text_3:=Text_3+S;
end;
Writeln('Раскодированный текст: ',Text_3);
//-------------------------------------------------------
writeln ('Нажмите "Enter" для завершения.');
Readln
End.