議事録
平成19年8月7日
記録者:佐藤 祐希
プロジェクト名:暗号化プロジェクト
メンバー:
B4:佐藤祐希(リーダ)、小橋川美共
議題:
直交座標展開を使った暗号化と復号化
議事:
直交座標展開を使った暗号化と複合化
数列が直交しているということは,1つの数列に対して直交する2つの数列の内積を求めることで,元の1つの数列を2つの互いに干渉しない数値に変換することが出来ることを意味する.
数列x={x1, x2, x3, x4}があるとき,それを別の空間に射影する行列が互いに直交するベクトルで構成されるならば,射影された値は,各ベクトルの要素を元の数列xがどの程度含んでいるかを示す値となる.すなわち,復元するには,射影行列の逆行列を用いることで,射影先の値を元の数列に戻すことが可能なはずである.
ここでは,4個の要素を持つ直交数列を使い,暗号化するプログラムと復号化するプログラムを作成する.
data1=[* * * *];
data2=[* * * *];
data3=[* * * *];
data4=[* * * *];
DATA=[data1' data2' data3' data4']; % これが変換行列
moto=[1 2 2 1]; % 元となる数列を設定する
D=moto*DATA; % 元となる数列を変換行列を使って射影する
disp(D); % 射影して得られた数列を表示
rev=D/DATA; % 復元するため,変換行列の逆行列計算を行う
disp(rev); % 復元したデータを表示する
ここで重要なポイントは,1)変換行列が直交するベクトルで構成されていること,2)復元は変換行列の逆行列計算を行う,です.
これを文字に適用すると,元々文字は整数の数字と対応しているので,次のプログラムとなる.
data1=[* * * *];
data2=[* * * *];
data3=[* * * *];
data4=[* * * *];
DATA=[data1' data2' data3' data4'];
moto='abcd';
D=moto*DATA;
disp(D);
rev=D/DATA;
char(rev)
この変換行列を使うには,要素数が4個の数列であればよく,文字列を4つずつに区切れば変換および復元が可能である.そこで文字列を変換することを考える.
文字列を4文字づつ区切り,4文字づつ変換するプログラムを作成すると次の通りとなる.
function henkansaki=henkan(moto)
data1=[* * * *];
data2=[* * * *];
data3=[* * * *];
data4=[* * * *];
DATA=[data1' data2' data3' data4'];
%moto='Hello, Mr.Sato.';
max_loop=floor(length(moto)./4);
nokori=mod(length(moto),4);
for p=1:max_loop
tmp=zeros(4,1);
tmp=moto((p-1)*4+1:(p-1)*4+4);
henkansaki((p-1)*4+1:(p-1)*4+4)=tmp*DATA;
end;
if(nokori>0)
for p=1:nokori
tmp(p)=moto(max_loop*4+p);
end;
for p=nokori+1:4
tmp(p)=' ';
end;
t=tmp*DATA;
henkansaki(max_loop*4+1:max_loop*4+4)=t(1:4);
end;
これの逆変換が複合になるので,そのプログラムは次の通りとなる.
function rev=fukugou(henkansaki)
data1=[* * * *];
data2=[* * * *];
data3=[* * * *];
data4=[* * * *];
DATA=[data1' data2' data3' data4'];
max_loop=floor(length(henkansaki)./4);
nokori=mod(length(henkansaki),4);
for p=1:max_loop
tmp=zeros(4,1);
tmp=henkansaki((p-1)*4+1:(p-1)*4+4);
rev((p-1)*4+1:(p-1)*4+4)=tmp/DATA;
end;
if(nokori>0)
for p=1:nokori
tmp(p)=henkansaki(max_loop*4+p);
end;
for p=nokori+1:4
tmp(p)=' ';
end;
t=tmp/DATA;
rev(max_loop*4+1:max_loop*4+4)=t(1:4);
end;
なお,複合時には,全て数字が返り値となるので,文字を変換した場合は数字を文字に変換するchar命令を使い
char(rev)
となる.
使用例は次の通りとなる.
d=henkan('Hello, world. I am the Mr.Sato!');
r=fukugou(d);
char(r)
**
・このプログラムは文字を対象としているため,数字を暗号化し復号すると数字の数が4の倍数でないと最後に32という数字が追加される.これは空白文字が文字コード番号で32だからである.
・空白を消すにはどうしたらよいだろうか?
・直交ベクトルでなかったらどうなるか?
・直交ベクトルが1つでも不足していたらどうなるか?
・音楽を暗号化すると「質の悪い原曲」になるので,質を調整することが出来れば応用分野が広がるのではないか?