Страница 1 из 1

Шифрование методом матричной алгебры

Добавлено: 16 окт 2009, 22:37
Combustion
Доброе время суток! Не могли бы вы помочь решить следующую задачу: необходимо зашифровать слово, для этого пользователь создаёт ключ - матрицу 3*3. Далее введенное слово разбивается на вектора (по 3 числа), состоящие из порядковых номеров букв в алфавите введенного слова. Далее матрицы ключ умножается на вектора - полученные матрицы (3*1) вывести в виде строки. (реализация на delphi) Заранее спасибо...

Re: Шифрование методом матричной алгебры

Добавлено: 20 окт 2009, 07:51
atavin-ta
А расшировывать как?

Re: Шифрование методом матричной алгебры

Добавлено: 20 окт 2009, 19:49
Combustion
Большое спасибо что откликнулись..
Для расшифрования необходимо найти определитель матрицы-ключа. Далее определить присоединённую матрицу для матрицы-ключа, каждый элемент которой является алгебраическим дополнением, полученную матрицу транспонировать. разделить каждый элемент транспонированной матрицы на определитель - это будет обратная матрица. Далее надо умножить эту обратную матрицу на вектора полученные из шифр-текста. Числа из полученных матриц - являются порядковым номером в алфавите.

Re: Шифрование методом матричной алгебры

Добавлено: 21 окт 2009, 10:46
atavin-ta

Код: Выделить всё

type TKey=array[1..3,1..3] of integer;
       TV=array [1..3] of integer;
function Mull(c:int; Key:TKey):TV;
var v:tv;
 i,jLinteger;
begin
 for i:=1; to 3 do
 begin
        v[i]=0;
        for j:=1 to 3 do
            v[i]:=c*Key[i,j];
 end;
 Mull:=v;
end;
function CharToInt (c:char):integer;
var r:integer;
begin
       if (c>='a') and (c<'я') then r:=ord(c)-ord('a')+1;
       if (c>='А') and (c<'Я') then r:=ord(c)-ord('А')+1;
       CharToInt:=r;
edn;
function Endcode(s:string;Key:TKey):String;
var i:integer;
    c:char;
    v:TV;
    L:integer;
    r:string;
begin
       r:='';
       L:=Length(s); 
       for i:=1, to L do
       begin
              c:=s[i];
              v:=Mull(CharToInt(c),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;
       Endcode:=r;
end;
Если расшифруешь, что такое алгебраическое дополнение, то дам функцию Decode, которая будет расшифровывать. И лучше вместо порядкового номера в алфавите брать код символа. Тогда вызов CharToInt(c) заменяется на ord(c), а саму функцию CharToInt можно вообще выбросить.

Re: Шифрование методом матричной алгебры

Добавлено: 21 окт 2009, 19:08
Combustion
Спасибо большое...безмерно вам благодарна :)
Алгебраическое дополнение a(i,j) из матрицы-ключ стоит в присоединённой матрице на пересечении j-й строки и i-го столбца.
Алгебраическим дополнением к элементу матрицы А называется детерминант его дополнительного минора, взятый со знаком "+" или "-" в зависимости от того, четна или нечетна сумма номеров всех строк и столбцов, в которых расположен элемент матрицы А.
т.е. например элемент A11=(-1)^(1+1){матрица полученная вычеркиванием первой строки первого столбца матрицы ключа}=-1^2*детерминант матрицы. Далее А21(вычеркивание второй строки первого столбца), А31, А12, А22, А32, А13,А23,А33.
Спасибо про совет про ord я попробую....

Re: Шифрование методом матричной алгебры

Добавлено: 22 окт 2009, 07:43
atavin-ta
Извини, был немного невнимателен, допустил ошибки. Правильно так (с предложенной мной модификацией заменой алфавитного номера кодом символа):

Код: Выделить всё

type TKey=array[1..3,1..3] of integer;
TV=array [1..3] of integer;function Mull(x,Key:TKey):TV;
     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,l1:integer;
     r:string;
begin
       r:='';
       L:=Length(s);
       L1:=L/3; 
       for i:=1 to 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;
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:TKety; i,j:integer):TMinor;
var i1,j1,i2,j2:integer;
     r:TMinor;
begin
       for i1:=1 to 2 do
           for j:=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;
     m: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;
Если ты хочешь всётаки исспользовать алфавитный номер, верни функцию CharToInt - она правильная. Но придётся модифицировать функцию расшифровки. Если у тебя нет функций StrToInt и IntToStr, то опередели их так:

Код: Выделить всё

function StrToInt(s:string):integer;
var i,c:integer;
begin
       val(s,i,c);
       StrToInt:=i;
end;
function IntToStr(i:integer):string;
var s:string;
begin
       str(i,s);
       IntToStr:=s; 
end;

Re: Шифрование методом матричной алгебры

Добавлено: 22 окт 2009, 20:25
Combustion
Большое спасибо что откликнулись и помогли. Кое что ещё не понятно ну я думаю разберусь...Ещё раз огромное спасибо...