Страница 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
Большое спасибо что откликнулись и помогли. Кое что ещё не понятно ну я думаю разберусь...Ещё раз огромное спасибо...