Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шифрование с использованием алгебры матриц 
:(
    Опции темы
123kiv
Дата 18.3.2011, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.