本文介绍一种基于混沌映射和DNA加密的图像加密算法,该算法通过对图像进行分块、DNA编码、运算、置乱等步骤,最终实现图像的加密。

算法步骤

  1. 分块和DNA编码

    • 将原始图像的R通道进行分块,并按照X、Y、Z、H四个参数进行DNA编码和运算,得到四个加密后的图像Q1、Q2、Q3、Q4。
    • 对原始图像的G、B通道按照和R通道相同的方式进行分块和加密,得到另外三个加密后的图像。
  2. 合并图像

    • 将四个加密后的图像合并成一个矩阵Q_jiami。
  3. 混沌映射和置乱

    • 使用混沌映射生成随机序列。
    • 按照随机序列对Q_jiami进行行列置换,实现Zigzag逆置乱。
  4. 显示加密图像

    • 将置换后的Q_jiami分别显示出来,得到四个加密后的图像。
  5. 保存加密图像

    • 最后,将四个加密后的图像保存在Q_jiami中。

代码示例

X=mod(round(X*10^4),8)+1;
Y=mod(round(Y*10^4),8)+1;
Z=mod(round(Z*10^4),4);
H=mod(round(H*10^4),8)+1;
e=N/t;  %e表示每一行可以分为多少块

Q2=DNA_bian(fenkuai(t,R,1),Y(1));
%图片1
Q1_1=DNA_bian(fenkuai(t,I1,1),X(1));
Q_last_1=DNA_yunsuan(Q1_1,Q2,Z(1));
Q_1(1:t,1:t)=DNA_jie(Q_last_1,H(1));
%图片2
Q1_2=DNA_bian(fenkuai(t,I2,1),X(1));
Q_last_2=DNA_yunsuan(Q1_2,Q2,Z(1));
Q_2(1:t,1:t)=DNA_jie(Q_last_2,H(1));
%图片3
Q1_3=DNA_bian(fenkuai(t,I3,1),X(1));
Q_last_3=DNA_yunsuan(Q1_3,Q2,Z(1));
Q_3(1:t,1:t)=DNA_jie(Q_last_3,H(1));
%图片4
Q1_4=DNA_bian(fenkuai(t,I4,1),X(1));
Q_last_4=DNA_yunsuan(Q1_4,Q2,Z(1));
Q_4(1:t,1:t)=DNA_jie(Q_last_4,H(1));

for i=2:r
    Q1_1=DNA_bian(fenkuai(t,I1,i),X(i));   %对原始图像R通道每一个分块按X对应的序号进行DNA编码
    Q1_2=DNA_bian(fenkuai(t,I2,i),X(i));
    Q1_3=DNA_bian(fenkuai(t,I3,i),X(i));
    Q1_4=DNA_bian(fenkuai(t,I4,i),X(i));
    
    Q2=DNA_bian(fenkuai(t,R,i),Y(i));   %对R的每一个分块按Y对应的序号进行DNA编码
    %图片1
    Q3_1=DNA_yunsuan(Q1_1,Q2,Z(i));         %对上面两个编码好的块按Z对应的序号进行DNA运算
    Q4_1=DNA_yunsuan(Q3_1,Q_last_1,Z(i));     %运算结果在和前一块按Z对应的序号再一次进行运算,称为扩散
    Q_last_1=Q4_1;
    %图片2
    Q3_2=DNA_yunsuan(Q1_2,Q2,Z(i));
    Q4_2=DNA_yunsuan(Q3_2,Q_last_2,Z(i));
    Q_last_2=Q4_2;
    %图片3
    Q3_3=DNA_yunsuan(Q1_3,Q2,Z(i));
    Q4_3=DNA_yunsuan(Q3_3,Q_last_3,Z(i));
    Q_last_3=Q4_3;
    %图片4
    Q3_4=DNA_yunsuan(Q1_4,Q2,Z(i));
    Q4_4=DNA_yunsuan(Q3_4,Q_last_4,Z(i));
    Q_last_4=Q4_4;
    
    xx=floor(i/e)+1;
    yy=mod(i,e);
    if yy==0
        xx=xx-1;
        yy=e;
    end
    Q_1((xx-1)*t+1:xx*t,(yy-1)*t+1:yy*t)=DNA_jie(Q4_1,H(i));    %将每一块合并成完整的图Q
    Q_2((xx-1)*t+1:xx*t,(yy-1)*t+1:yy*t)=DNA_jie(Q4_2,H(i));
    Q_3((xx-1)*t+1:xx*t,(yy-1)*t+1:yy*t)=DNA_jie(Q4_3,H(i));
    Q_4((xx-1)*t+1:xx*t,(yy-1)*t+1:yy*t)=DNA_jie(Q4_4,H(i));
end
Q_1=uint8(Q_1);
Q_2=uint8(Q_2);
Q_3=uint8(Q_3);
Q_4=uint8(Q_4);

Q_jiami(:,:,1) = Q_1;  %将四个矩阵存入Q中
Q_jiami(:,:,2) = Q_2;
Q_jiami(:,:,3) = Q_3;
Q_jiami(:,:,4) = Q_4;

xx0=sum(I2(:))/(255*SUM);    
xx0=floor(xx0*10^4)/10^4;     
xx1=sum(I3(:))/(255*SUM);     
xx1=floor(xx1*10^4)/10^4;     
ppx=zeros(1,M+1000);        
ppy=zeros(1,N+1000); 
ppx(1)=xx0;
ppy(1)=xx1;
for i=1:M+999                 %进行SUM+999次循环,共得到SUM+1000点(包括初值)
    ppx(i+1)=u*ppx(i)*(1-ppx(i));
end
for i=1:N+999                 %进行SUM+999次循环,共得到SUM+1000点(包括初值)
    ppy(i+1)=u*ppy(i)*(1-ppy(i));
end
ppx=ppx(1001:length(ppx));            %去除前1000点,获得更好的随机性
ppy=ppy(1001:length(ppy));

[~,Ux]=sort(ppx,'descend');
[~,Uy]=sort(ppy,'descend');

for i=1:M
    temp = Q_1(i,:);
    Q_1(i,:) = Q_1(Ux(i),:);
    Q_1(Ux(i),:) = temp;
    temp = Q_2(i,:);
    Q_2(i,:) = Q_2(Ux(i),:);
    Q_2(Ux(i),:) = temp;
    temp = Q_3(i,:);
    Q_3(i,:) = Q_3(Ux(i),:);
    Q_3(Ux(i),:) = temp;
    temp = Q_4(i,:);
    Q_4(i,:) = Q_4(Ux(i),:);
    Q_4(Ux(i),:) = temp;
end

for i=1:N
    temp = Q_1(:,i);
    Q_1(:,i) = Q_1(:,Uy(i));
    Q_1(:,Uy(i)) = temp;
    temp = Q_2(:,i);
    Q_2(:,i) = Q_2(:,Uy(i));
    Q_2(:,Uy(i)) = temp;
    temp = Q_3(:,i);
    Q_3(:,i) = Q_3(:,Uy(i));
    Q_3(:,Uy(i)) = temp;
    temp = Q_4(:,i);
    Q_4(:,i) = Q_4(:,Uy(i));
    Q_4(:,Uy(i)) = temp;
end

figure;subplot(2,2,1);imshow(I1,[]);subplot(2,2,2);subplot(2,2,3);imshow(Q_1,[]);subplot(2,2,4);
axis([0 255 0 2000]);
figure;subplot(2,2,1);imshow(I2,[]);subplot(2,2,2);subplot(2,2,3);imshow(Q_2,[]);subplot(2,2,4);
axis([0 255 0 2000]);
figure;subplot(2,2,1);imshow(I3,[]);subplot(2,2,2)subplot(2,2,3);imshow(Q_3,[])
axis([0 255 0 2000]);
figure;subplot(2,2,1);imshow(I4,[]);subplot(2,2,2);subplot(2,2,3);imshow(Q_4,[])
axis([0 255 0 2000]);
Q_jiami(:,:,1)=Q_1;
Q_jiami(:,:,2)=Q_2;
Q_jiami(:,:,3)=Q_3;
Q_jiami(:,:,4)=Q_4;

代码解释

  • X=mod(round(X*10^4),8)+1; 等代码片段用于生成用于DNA编码的参数。
  • Q2=DNA_bian(fenkuai(t,R,1),Y(1)); 等代码片段用于对图像进行分块并进行DNA编码和运算。
  • xx0=sum(I2(:))/(255*SUM); 等代码片段用于生成混沌映射的初始值。
  • ppx(i+1)=u*ppx(i)*(1-ppx(i)); 等代码片段用于生成混沌映射序列。
  • [~,Ux]=sort(ppx,'descend'); 等代码片段用于对混沌映射序列进行排序并获取排序后的索引。
  • temp = Q_1(i,:); Q_1(i,:) = Q_1(Ux(i),:); Q_1(Ux(i),:) = temp; 等代码片段用于对Q_jiami进行行列置乱。

Zigzag逆置乱

Zigzag逆置乱体现在对Q_jiami进行行列置换的过程,该过程通过对混沌映射序列排序并获取索引,然后按照索引对Q_jiami进行重排,从而实现类似Zigzag的置乱效果。

总结

该算法使用混沌映射和DNA加密对图像进行加密,通过分块、DNA编码、运算、置乱等步骤,最终实现图像的加密。该算法具有较高的安全性和效率,可用于图像安全保护等领域。

混沌映射和DNA加密的图像加密算法详解

原文地址: https://www.cveoy.top/t/topic/n0jc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录