该代码实现了基于DNA加密和置乱的图像加密方法,具体步骤如下:

  1. 读取四幅二维图像,并将它们存储为一个三维矩阵 I
I = [];
I1 = imread('scenery1.png','png');
I1 = rgb2gray(I1);

I2 = imread('scenery2.tif','tif');
I2 = rgb2gray(I2);
I3 = imread('scenery3.tif','tif');
I3 = rgb2gray(I3);

I4 = imread('scenery4.tif','tif');

I(:,:,1) = I1;
I(:,:,2) = I2;
I(:,:,3) = I3;
I(:,:,4) = I4;
  1. 对每幅图像进行哈希处理,得到一个长度为4的哈希向量 haxi
[M,N]=size(I1);

haxi_dec1 = haxi(I1);
haxi_dec2 = haxi(I2);
haxi_dec3 = haxi(I3);
haxi_dec4 = haxi(I4);

haxi = [haxi_dec1,haxi_dec2,haxi_dec3,haxi_dec4];

haxi_max = max(haxi);
haxi_min = min(haxi);
haxi_norm = haxi/haxi_max;
  1. 将第一幅图像进行补零操作,使其可以被分成大小为 t*t 的块。
t = size(haxi,2);
M1=mod(M,t);
N1=mod(N,t);

if M1~=0
    I1(M+1:M+t-M1,:)=0;
    I2(M+1:M+t-M1,:)=0;
    I3(M+1:M+t-M1,:)=0;
    I4(M+1:M+t-M1,:)=0;
end
if N1~=0
    I1(:,N+1:N+t-N1)=0;
    I2(:,N+1:N+t-N1)=0;
    I3(:,N+1:N+t-N1)=0;
    I4(:,N+1:N+t-N1)=0;
end
  1. 使用混沌系统生成一个长度为 r 的序列 A,用于控制DNA加密和置乱的过程。
[M,N]=size(I1);
ALL=M*N;
r=(M/t)*(N/t);
X0=round(haxi_norm(1)*10^4)/10^4;
Y0=round(haxi_norm(2)*10^4)/10^4;
Z0=round(haxi_norm(3)*10^4)/10^4;
H0=round(haxi_norm(4)*10^4)/10^4;

A=chen_output(X0,Y0,Z0,H0,r);
X=A(:,1);
X=X(3002:length(X));
Y=A(:,2);
Y=Y(3002:length(Y));
Z=A(:,3);
Z=Z(3002:length(Z));
H=A(:,4);
H=H(3002:length(H));
  1. 对每个块进行DNA编码,并使用哈希向量和混沌序列进行DNA运算和扩散。
I_Zigzag = [];
I1_Zigzag = reshape(Zigzag(I1),512,512);
I2_Zigzag = reshape(Zigzag(I2),512,512);
I3_Zigzag = reshape(Zigzag(I3),512,512);
I4_Zigzag = reshape(Zigzag(I4),512,512);
I_Zigzag(:,:,1) = I1_Zigzag;
I_Zigzag(:,:,2) = I2_Zigzag;
I_Zigzag(:,:,3) = I3_Zigzag;
I_Zigzag(:,:,4) = I4_Zigzag;

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;

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));   %对原始图像每一个分块按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;
  1. 使用平均灰度值作为密钥对加密图像进行二次置乱。
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
    ppx(i+1)=u*ppx(i)*(1-ppx(i));
end
for i=1:N+999
    ppy(i+1)=u*ppy(i)*(1-ppy(i));
end
ppx=ppx(1500:length(ppx));
ppy=ppy(1500: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
  1. 将置乱后的图像输出为 Q_jiami

Zigzag变换的作用:

Zigzag变换的作用体现在第26-29行的代码中,使用Zigzag变换将每个块的像素值重新排列为一维数组,并将排列后的数组通过DNA编码。在解密时,需要对DNA解码后的一维数组进行逆Zigzag变换,将其还原为原始的块状矩阵。

I_Zigzag = [];
I1_Zigzag = reshape(Zigzag(I1),512,512);
I2_Zigzag = reshape(Zigzag(I2),512,512);
I3_Zigzag = reshape(Zigzag(I3),512,512);
I4_Zigzag = reshape(Zigzag(I4),512,512);
I_Zigzag(:,:,1) = I1_Zigzag;
I_Zigzag(:,:,2) = I2_Zigzag;
I_Zigzag(:,:,3) = I3_Zigzag;
I_Zigzag(:,:,4) = I4_Zigzag;

代码中的函数解释:

  • haxi(I):对图像 I 进行哈希处理,得到哈希向量。
  • chen_output(X0,Y0,Z0,H0,r):使用Chen混沌系统生成长度为 r 的序列。
  • fenkuai(t,I,i):将图像 I 分成大小为 t*t 的块,并返回第 i 个块。
  • DNA_bian(I,X):对图像块 I 进行DNA编码,使用 X 作为控制参数。
  • DNA_yunsuan(Q1,Q2,Z):对两个DNA编码后的块 Q1Q2 进行DNA运算,使用 Z 作为控制参数。
  • DNA_jie(Q,H):对DNA编码后的块 Q 进行DNA解码,使用 H 作为控制参数。
  • Zigzag(I):对图像 I 进行Zigzag变换,将像素值重新排列为一维数组。

总结:

该代码实现了基于DNA加密和置乱的图像加密方法,利用哈希向量和混沌序列对图像进行DNA编码、运算和扩散,并使用平均灰度值作为密钥对加密图像进行二次置乱,实现图像的加密保护。Zigzag变换用于对每个块进行像素值的重新排列,以便进行DNA编码和解码。

基于DNA加密和置乱的图像加密方法

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

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