基于矢量量化图像的联合指纹解密及其matlab实现(1)

文章大致介绍
这篇文章的标题是基于矢量量化图像的联合指纹解密,保护媒体分发的传统架构中解密和嵌入指纹的过程容易被攻击者攻击,从而产生漏洞。为了解决这个泄露问题,文章提出一种新的模式:联合指纹解密。这个模式有两种实现:第一种是基于静态密钥树和置乱,主要用到混沌映射和密钥树;第二种是基于会话密钥和动态密钥树,主要用到的是会话密钥和码本。对码本进行主成分分析,得到排序后的新码本,用主成分分析得到的新码本来表示图像的矢量量化图像,接着对矢量量化图像进行加密的操作,先使用Cat Map映射对矢量量化图像进行块位置的置乱,然后根据构造的静态密钥树,对其进行不相似码字的替换,得到加密图像。根据静态密钥树和指纹嵌入对加密图像进行联合指纹解密,然后对其进行反置乱,得到指纹图像。可根据指纹嵌入的算法,从指纹图像中提取指纹,根据指纹比对,可判断是否是叛徒和进行叛徒追踪。
创新点:联合指纹解密、会话密钥和主密钥;
文章提出的会话密钥和主密钥加密解密过程如下:
加密:用会话密钥加密原始图像,用主密钥加密会话密钥,所以发送方将加密图像和主密钥发送给接收方;
解密:接收方收到主密钥和加密图像,接收方用主密钥恢复会话密钥,用会话密钥解密加密图像。
通过实验分析可知,该方案具有较高的感知安全性和指纹的不可感知性,在噪声对抗分析中,该方案能够较好地对抗传输过程中产生的噪声。

文章提出了一种基于矢量量化的联合指纹解密方案。在传统的体系结构中在指纹和解密的过程中容易产生漏洞,使得解密图像被拦截,所以文章提出一种将指纹和解密过程同时进行的联合指纹解密方案。加密的方式:(1)、基于静态密钥树和置乱:使用混沌映射来置乱VQ图像的块位置,使用静态密钥树来进行码字替换,(根据不相似对,用码字的不相似码字来进行替换码字)使得图像具有更强的不可感知性(2)、基于会话密钥和动态密钥树:使用会话密钥来加密原始图像,使用主密钥来加密会话密钥,使用动态密钥树来使得图像具有更强的不可感知性。
矢量量化编码解码方式:w*h维向量用Y表示,通过比较欧式距离,最邻近码字的码字可以在码书中找到。经过编码,原始图像可以通过这些相邻码字的索引得以表示。VQ解码器也需要使用和VQ编码器相同的版本。VQ解码器使用相应的码字重构图像,因此VQ压缩图像的质量收到码本质量的显著影响。

定义一种加密方式:
码书分类的方式:主成分分析,将16维码字进行降维,降到一维空间,找到第一主成分值,这些值用于分类码字。两个码字之间的差异随着它们对应索引之间的差异的增大变得更加显著。
将码本分成两类: 0-2/L-1和2/L-L-1,
对于本文,码书的大小是256,故分成0-127和128-255
其中这两类对应构成不相似对,比如: (0, 128)、(1, 129)、(2, 130)… (126, 254)、(127, 255)
而相似对可以通过穷尽搜素,比较欧式距离大小得到。
根据以上的相似对和不相似对来构造静态密钥树。
通过不相似对负责生成难以理解的图像
通过相似对来负责解密,保留解密的视觉质量。
发送端的加密过程即使用混沌映射按块置乱VQ图像的块位置,通过Eq(3) 公式来计算块的位置。
再根据静态密钥树的不相似对来替换码字,从而实现加密的过程。
动态密钥树:不相似对动态生成,相似对静态生成(通过穷举搜索,比较欧氏距离得出最相似码字)。
VQ图像加密方式:
混沌映射按块置乱VQ图像的块位置,通过Eq(3)公式计算块的位置,实现置乱块的位置;
通过不相似对来使图像变得更加乱。用Y_i的不相似对Y_ic来替换Y_i。
叛徒追踪:
图像所有者可以根据p_k和原始图像P之间的比较来提取指纹序列,相同为1,不同为0。
评估提取的指纹与某人指纹的相关性。
通过比较T的临界值来辨别是否为叛徒。
实验结果
知觉安全性
方法1:图像通过混沌映射置乱和码字替换来加密;
方法2:通过动态密钥树加密
图像质量由峰值信噪比测量,PSNR peak-signal-to noise 该方案确实具有较高的感知安全性。
指纹的不可感知性
指纹副本中的指纹是不可感知的,在感知上是不可检测的。指纹图像的质量取决于码本的大小。码本越大,指纹图像质量越高。
置乱过程
置乱过程增强了知觉安全性。
噪声对抗分析
传统的JFD模式没有对抗传输错误或认为修改的噪声干扰的能力。换句话说,在现有的JFD方法上添加噪声,噪声在解密后仍然存在,会造成识别不同用户身份的不明确。也就是说,如果指纹失去了它的精确性,那么身份线索就会丢失,可能没法抓住真正的叛徒。
相反,在提出的方法中,在指纹解密后噪声可以被容易地清除,因为每一个码字是通过密钥树来解密和恢复。在噪声小于5时,抗噪性能不受码本的大小所影响,当噪声逐渐变大后,码本越大,抗噪性能越差
图像矢量量化函数代码

%将图像的矢量量化写成一个函数
function [index_image,I_qu] = VQ(I)
    %% 矢量量化 %block_pixel 是根据码书生成的还原图像,每一列是图像的一块,
    %block_index是索引序列,index_image 是索引生成的图像
    %替换原有码书mu2,使用新码书mu2,mu2是mu2经过主成分分析得到的
    mu2 = evalin('base', 'mu2');
%     I=imread("D:\qxn\标准测试图片\pepper.bmp");
    %I0=rgb2gray(I);
    I0=I;
    mu2=uint8(mu2);%mu2为码书
    [B_dim,B_num]=size(mu2);%16*256
    [m,n]=size(I0);%m行n列 512*512   *3 后面的3是RGB通道值存储
    Kbook_size=4;%码字的块大小

    block_row=Kbook_size*Kbook_size;%块大小:4*4=16
    block_col=m*n/block_row;%块数:图像大小/块大小=512*512 / 16=16384
    block_Kpixel=zeros(block_row,block_col);%块总像素大小=块大小*块数=16*16384
    block_index=zeros(1,block_col);%块索引 每一个4*4块对应索引
    nn=1;

    for x=1:m/Kbook_size%512 / 4
        for y=1:n/Kbook_size
            b=I0((1+(x-1)*Kbook_size):(x*Kbook_size),(1+(y-1)*Kbook_size):(y*Kbook_size));
            %从矩阵IO中取第1+(x-1)*Kbook_size行到x*Kbook_size行,和1+(y-1)*Kbook_size到y*Kbook_size列作为新矩阵
            %将其赋值给b
            b_v=b(:);%将4*4的元素排成16行1列的元素,将b中所有的元素排成一列
        
        
            D=zeros(1,B_num);%D是1行B_num(256)列的矩阵
            for j=1:B_num      %j从1到B_num(256)
                center = mu2(:,j);     %将mu2的第j列元素赋值给center
                D(j) = sqrDist(double(b_v),double(center)); % calculate sqrDist from x to center
                %计算每个16*1的元素和码书中每列元素的欧式距离
            end
        
            [Dmin,index] = min(D);%[1615,133]=min(D)
            %把D中的最小值赋值给
            block_index(nn)=index;
            %
            block_Kpixel(:,nn)=mu2(:,index);
            %将码书的第index列赋值给block_Kpixel的第nn列
            nn=nn+1;
            if(mod(nn,100)==0)
                nn
            end
        end
    end



    index_image=reshape(block_index,m/Kbook_size,n/Kbook_size);
    %(16384,128,128)把block_index的1行16384列重塑为128行128列的矩阵
    %512*512矩阵中 共有16384个 4*4 的块,便于还原图像,将其恢复成原图像的比例大小
    nn=1;
    %使用block_Kpixel来恢复图像
    for x=1:m/Kbook_size
        for y=1:n/Kbook_size
            b_v=block_Kpixel(:,nn); %将block_Kpixel的第nn列赋值给b_v
            b=reshape(b_v,Kbook_size,Kbook_size);
            %将 16行1列的b_v矩阵 重塑为 4*4 的块,为复原图像做准备 将新矩阵赋值给b
            I_qu((1+(x-1)*Kbook_size):(x*Kbook_size),(1+(y-1)*Kbook_size):(y*Kbook_size))=b;
            %将b 赋值给I_qu的第1+(x-1)*Kbook_size行到x*Kbook_size行 和1+(y-1)*Kbook_size列到y*Kbook_size列
            nn=nn+1;
        end
    end

    I_qu=uint8(I_qu);%
    imwrite(I_qu, 'D:\qxn\标准测试图片\I_qu.jpg')
    % figure(3)
    %
    % imshow(I_qu)
    % y=zeros(1,Kbook_size*Kbook_size);%初始化

%     figure(1);
%     subplot(121);
%     imshow(I0)
%     title('原始图像');
%     subplot(122);
%     imshow(I_qu)
%     title('矢量量化图像');

    % 矢量量化和原图像的误差
    %error_qu=mean(mean((double(I_qu)-double(I0)).^2));
end

上一篇:ORA-16401: archivelog rejected by RFS


下一篇:Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2) A-C