Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.3.2011
Репутация: нет Всего: нет
|
Доброе время суток! Не могли бы вы помочь доработать программу шифрования: необходимо зашифровать текст, вводимый пользователем в memo1. Для этого задаётся ключ - матрица 3*3. Далее введенный тект разбивается на вектора (по 3 числа), состоящие из порядкового значение символа введенного текста. Далее матрица ключ умножается на вектора - полученные матрицы (3*1) вывести в memo2.Для расшифрования необходимо найти определитель матрицы-ключа. Далее определить присоединённую матрицу для матрицы-ключа, каждый элемент которой является алгебраическим дополнением, полученную матрицу транспонировать. разделить каждый элемент транспонированной матрицы на определитель - это будет обратная матрица. Далее надо умножить эту обратную матрицу на вектора полученные из шифр-текста. Числа из полученных матриц являются порядковым значением символа. | Код | type TKey=array[1..3,1..3] of integer; TV=array [1..3] of integer; TMinor=array[1..2,1..2] of integer; TObr=array[1..3,1..3] of real; TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Button1: TButton; Memo3: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
function Mull(x:tv; key:TKey):tv; var v:tv; i,j,L:integer; begin for i:=1 to 3 do begin v[i]:=0; for j:=1 to 3 do v[i]:=v[i]+x[j]*Key[i,j]; end; Mull:=v; end; function MullObr(x:tv; key:TObr):tv; var v:tv; i,j,L:integer; s:real; begin for i:=1 to 3 do begin s:=0; for j:=1 to 3 do s:=s+x[j]*Key[i,j]; v[i]:=round(s); end; MullObr:=v; end; function Endcode(s:string;Key:TKey):String; var i,j,k:integer; c:char; v,x:TV; L:integer; r:string; l1:real; begin r:=''; L:=Length(s); L1:=strtofloat(inttostr(L))/3; for i:=1 to strtoint(floattostr(L1)) do begin for j:=0 to 2 do begin k:=i*3+j; if k<=L then c:=s[k] else c:=char(0); x[i]:=ord(c); v:=Mull(x,Key); if r<>'' then r:=r+' '; r:=r+IntToStr(v[1]); r:=r+' '; r:=r+IntToStr(v[2]); r:=r+' '; r:=r+IntToStr(v[3]); r:=r+' '; end; end; Endcode:=r; end; function Det3(x:TKey):integer; begin Det3:=x[1,1]*(x[2,2]*x[3,3]-x[2,3]*x[3,2])- x[2,1]*(x[1,2]*x[3,3]-x[1,3]*x[3,2])+ x[3,1]*(x[1,2]*x[2,3]-x[1,3]*x[2,2]); end; function Det2(x:TKey):integer; begin Det2:=x[1,1]*x[2,2]-x[1,2]*x[2,1]; end; function Decode(s:string):string; var r,b:string; L,L1,i,j,k:integer; V,x:TV; c:char; Obr:Tobr; begin r:=''; L:=Length(s); i:=0; while (i<L) do begin for j:=1 to 3 do begin b:=''; repeat i:=i+1; c:=s[i]; if c<>' ' then b:=b+c; until ((c<>' ') and (i<L)); x[j]:=StrToInt(b); end; V:=MullObr(x,Obr); c:=char(V[1]); if c<>char(0) then s:=s+c; c:=char(V[2]); if c<>char(0) then s:=s+c; c:=char(V[3]); if c<>char(0) then s:=s+c; end; Decode:=r; end; function GetMinor(Key:TKey; i,j:integer):TMinor; var i1,j1,i2,j2:integer; r:TMinor; begin for i1:=1 to 2 do for j1:=1 to 2 do begin if i1>=i then i2:=i1+1 else i2:=i1; if j1>=j then j2:=j1+1 else j2:=j1; r[i1,j1]:=r[i2,j2]; end; end; function KeyToObr(key:TKey):TObr; var r:TObr; d:real; Minor:TMinor; i,j:integer; begin d:=det3(Key); for i:=1 to 3 do for j:=1 to 3 do begin Minor:=GetMinor(Key,i,j); r[j,i]:=Det2(Minor)/d; end; end;
procedure TForm1.Button1Click(Sender: TObject); var Key:tkey; x, v: tv; s,t: string; i,j,k:integer; begin Key[1,1]:=1;Key[1,2]:=4;Key[1,3]:=8; Key[2,1]:=3;Key[2,2]:=7;Key[2,3]:=2; Key[3,1]:=6;Key[3,2]:=9;Key[3,3]:=5; s:=memo1.Text; memo2.Text:=Endcode(s,Key);
end; procedure TForm1.Button2Click(Sender: TObject); var Key:tkey; x, v: tv; s,t: string; begin t:= memo2.Text; memo3.Text:=Decode(t); end;
end.
|
|