1,构造静态密钥树
Yi是该码字,Yic是该码字的不相似码字,Yi’是该码字的相似码字。
详细过程
接下来准备根据不相似对和相似对构造静态密钥树。
不相似对:G0和G1,它们各有128列,是16*256的矩阵,把两个矩阵中的元素一一对应起来,构成不相似对。
相似对:通过穷尽搜索,比较欧氏距离得出一个码字的最相似码字。例:要计算码字1的最相似码字,需要对除码字1的其他255个码字分别进行计算欧式距离,从而进行比较,得出最相似码字。
将[码字 该码字的不相似码字 该码字的最相似码字] 三个值关联起来,构造静态解密树。
先关联 码字和该码字的不相似码字:构造不相似数组,该数组中有256个元素,每个元素都是16行2列的矩阵。
1-128: 1 2 3 ……126 127 128
129-256:129 130 131 ……254 255 256
静态解密树:一个数组中有256个元素,每个元素都是一个16行3列的矩阵,
试建立一个2行256列的矩阵,第一行存储不相似码字的索引;第二行存储最相似码字的索引。SidisCode_index=zeros(2,256);
把不相似索引的矩阵的行赋值给SidisCode_index的第一行
把相似索引矩阵的第2行赋值给SidisCode_index的第2行;
2,matlab代码实现
(此处可能存在错误)
%构造静态密钥树
%根据排序后的码书mu2,将码书等分为两个部分,G0和G1,
%G0:0-126 ; G1:127-255 它们对应构成不相似对
%相似对通过欧氏距离穷尽搜素得到
%利用求出的相似对和不相似对构造静态密钥树
%计划使用256个数组来存放 [ 码字 该码字的相似码字 该码字的不相似码字]
%先求码字及其该码字的不相似码字
%G0取码书的前128列,16*128
%G1取码书的后128列,16*128
[B_dim,B_num]=size(mu2);%16*256
L=B_num;
G0=mu2(:,1:128);
G1=mu2(:,129:256);
%不相似码字矩阵disimilar_code
disimilar_code=zeros(B_dim,B_num);
for i=1:256
if i<=128
% mu1(:,[i j])=mu1(:,[j i]);
disimilar_code(:,[i i+128])=mu1(:,[i+128 i]);
else
% disimilar_code=mu1(:,i-128);
disimilar_code(:,[i i-128])=mu1(:,[i-128 i]);
end
end
%求最相似码字,通过比较两个码字的欧式距离获得
%找到最相似码字,记录索引位置
% D_similar=zeros(1,B_num);%D_similar是1行B_num(256)列的矩阵
% for j=1:B_num %j从1到B_num(256)
% center = mu(:,j); %将mu的第j列元素赋值给center
% D_similar(j) = sqrDist(double(b_v),double(center)); % calculate sqrDist from x to center
% %计算每个16*1的元素和码书中每列元素的欧式距离
% end
%比较欧氏距离 for 1:256 第i个码字到其他255码字的欧式距离,欧式距离的数组,求出其中的最小值,定位该码字在码书中的索引位置
%D_similar=zeros(L,L);
D_similar=zeros(L,L);
%存储码字到其他256码字(包括本身码字)的欧式距离,
%每行都表示该码字和其他256码字的欧式距离,因为有256个码字,所以矩阵是256行256列
%for i=1:L
for i=1:L
% D_similar(i,:)=;
for j=1:L
D_similar(i,j)= sqrDist(double(mu1(:,i)),double(mu1(:,j)));
end
end
% D_similar矩阵每行中除0外的最小的即是该码字的最相似码字
%将主对角元素设置为无穷大
D_similar(D_similar==0)=inf;
%求矩阵每行的最小值,并记录下标
%函数min可以取矩阵每一列的最小值,所以将矩阵转置,求转置矩阵的最小列值,即为原矩阵的最小行值
% [max,index_max]=max(C1);
% [min,index_min]=min(C1);
D_similar1=D_similar';
%D_similar2存储256个码字 欧式距离的最小值
D_similar2=min(D_similar1);%计算每行的最小值
%初始化2*256列的矩阵,第一行用来存储欧式距离最小值,第二行用来存储最小码字所在的下标
minSimilar=zeros(2,L);
for i=1:L
[minSimilar(1,i),minSimilar(2,i)]=min(D_similar1(i,:));
end
%把minSimilar矩阵的第2行读出来,放在一个新的矩阵中,新矩阵为1行256列
minSimilar_index=minSimilar(2,:);
%初始化similar_code矩阵,16行256列
similar_code=zeros(B_dim,B_num);
%读出最小码字的下标,构成新的最相似码字矩阵similar_code
for i=1:L
index_similar=minSimilar_index(i);
similar_code(:,i)=mu1(:,index_similar);
end
keyTree=zeros(3,256);
for i=1:L
keyTree(1,i)=i;
end
for i=1:L
if keyTree(1,i)<=128
keyTree(2,i)=keyTree(1,i)+128;
else
keyTree(2,i)=keyTree(1,i)-128;
end
end
for i=1:L
keyTree(3,i)=minSimilar(2,i);
end