基于DNA加密和置乱的图像加密方法
该代码实现了基于DNA加密和置乱的图像加密方法,具体步骤如下:
- 读取四幅二维图像,并将它们存储为一个三维矩阵
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;
- 对每幅图像进行哈希处理,得到一个长度为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;
- 将第一幅图像进行补零操作,使其可以被分成大小为
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
- 使用混沌系统生成一个长度为
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));
- 对每个块进行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;
- 使用平均灰度值作为密钥对加密图像进行二次置乱。
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
- 将置乱后的图像输出为
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编码后的块Q1和Q2进行DNA运算,使用Z作为控制参数。DNA_jie(Q,H):对DNA编码后的块Q进行DNA解码,使用H作为控制参数。Zigzag(I):对图像I进行Zigzag变换,将像素值重新排列为一维数组。
总结:
该代码实现了基于DNA加密和置乱的图像加密方法,利用哈希向量和混沌序列对图像进行DNA编码、运算和扩散,并使用平均灰度值作为密钥对加密图像进行二次置乱,实现图像的加密保护。Zigzag变换用于对每个块进行像素值的重新排列,以便进行DNA编码和解码。
原文地址: https://www.cveoy.top/t/topic/n0tf 著作权归作者所有。请勿转载和采集!