Шифрование методом матричной алгебры
-
- Сообщения: 4
- Зарегистрирован: 16 окт 2009, 22:12
Доброе время суток! Не могли бы вы помочь решить следующую задачу: необходимо зашифровать слово, для этого пользователь создаёт ключ - матрицу 3*3. Далее введенное слово разбивается на вектора (по 3 числа), состоящие из порядковых номеров букв в алфавите введенного слова. Далее матрицы ключ умножается на вектора - полученные матрицы (3*1) вывести в виде строки. (реализация на delphi) Заранее спасибо...
А расшировывать как?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
-
- Сообщения: 4
- Зарегистрирован: 16 окт 2009, 22:12
Большое спасибо что откликнулись..
Для расшифрования необходимо найти определитель матрицы-ключа. Далее определить присоединённую матрицу для матрицы-ключа, каждый элемент которой является алгебраическим дополнением, полученную матрицу транспонировать. разделить каждый элемент транспонированной матрицы на определитель - это будет обратная матрица. Далее надо умножить эту обратную матрицу на вектора полученные из шифр-текста. Числа из полученных матриц - являются порядковым номером в алфавите.
Для расшифрования необходимо найти определитель матрицы-ключа. Далее определить присоединённую матрицу для матрицы-ключа, каждый элемент которой является алгебраическим дополнением, полученную матрицу транспонировать. разделить каждый элемент транспонированной матрицы на определитель - это будет обратная матрица. Далее надо умножить эту обратную матрицу на вектора полученные из шифр-текста. Числа из полученных матриц - являются порядковым номером в алфавите.
Код: Выделить всё
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;
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
-
- Сообщения: 4
- Зарегистрирован: 16 окт 2009, 22:12
Спасибо большое...безмерно вам благодарна 
Алгебраическое дополнение a(i,j) из матрицы-ключ стоит в присоединённой матрице на пересечении j-й строки и i-го столбца.
Алгебраическим дополнением к элементу матрицы А называется детерминант его дополнительного минора, взятый со знаком "+" или "-" в зависимости от того, четна или нечетна сумма номеров всех строк и столбцов, в которых расположен элемент матрицы А.
т.е. например элемент A11=(-1)^(1+1){матрица полученная вычеркиванием первой строки первого столбца матрицы ключа}=-1^2*детерминант матрицы. Далее А21(вычеркивание второй строки первого столбца), А31, А12, А22, А32, А13,А23,А33.
Спасибо про совет про ord я попробую....

Алгебраическое дополнение a(i,j) из матрицы-ключ стоит в присоединённой матрице на пересечении j-й строки и i-го столбца.
Алгебраическим дополнением к элементу матрицы А называется детерминант его дополнительного минора, взятый со знаком "+" или "-" в зависимости от того, четна или нечетна сумма номеров всех строк и столбцов, в которых расположен элемент матрицы А.
т.е. например элемент A11=(-1)^(1+1){матрица полученная вычеркиванием первой строки первого столбца матрицы ключа}=-1^2*детерминант матрицы. Далее А21(вычеркивание второй строки первого столбца), А31, А12, А22, А32, А13,А23,А33.
Спасибо про совет про ord я попробую....
Извини, был немного невнимателен, допустил ошибки. Правильно так (с предложенной мной модификацией заменой алфавитного номера кодом символа):
Если ты хочешь всётаки исспользовать алфавитный номер, верни функцию CharToInt - она правильная. Но придётся модифицировать функцию расшифровки. Если у тебя нет функций StrToInt и IntToStr, то опередели их так:
Код: Выделить всё
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;
Код: Выделить всё
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;
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
-
- Сообщения: 4
- Зарегистрирован: 16 окт 2009, 22:12
Большое спасибо что откликнулись и помогли. Кое что ещё не понятно ну я думаю разберусь...Ещё раз огромное спасибо...