基于矢量量化的联合指纹解密方案及其matlab实现(5)-构造静态密钥树

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






  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值