Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2011, 23:10   #1
123kiv
Новичок
Джуниор
 
Регистрация: 01.03.2011
Сообщений: 2
По умолчанию шифрование с использованием алгебры матриц

Доброе время суток! Не могли бы вы помочь доработать программу шифрования: необходимо зашифровать текст, вводимый пользователем в 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;
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.
123kiv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка Матриц(Упорядочивание Элементов,Вывод На Экран Матриц При Условии...) timepoka Помощь студентам 8 01.07.2011 13:20
Delphi - шифрование с использованием томика со стихами Robhefist Помощь студентам 3 15.02.2011 11:27
программа с использованием динамических матриц fatefighter Помощь студентам 1 19.10.2010 08:27
Операции реляционной алгебры Mayya SQL, базы данных 5 17.08.2010 13:12
Раздел Алгебры Логики Базиля Помощь студентам 1 23.12.2009 00:13