Demo1:灰度图加密
clc,clear,close all;
pic1 = imread("lenna.jpg");
pic1 = rgb2gray(pic1); #转灰度
imshow(pic1)
[M,N] = size(pic1(:,:,1));
x0 = 0.5;
u = 0:0.008:4;
xn = ft_logistic(x0,length(u)-1,u); %生成混沌序列
figure()
plot(u(2:end),xn,'b.',"linewidth",1.2)
grid on
L_xn = zeros(1,M*N);
L_xn(1) = xn(1,end); %将混沌状态的最后一个值作为初值
for i = 1:M*N-1 %生成新的混沌序列用于加密
L_xn(i+1) = 4*L_xn(i)*(1-L_xn(i));
end
L_xn = uint8(255*L_xn); %混沌序列反归一化
xnn = reshape(L_xn,[M,N]); %xnn为混沌秘钥
mixed_pic = bitxor(pic1,xnn); %异或操作加密
figure()
imshow(mixed_pic)
remix_pic = bitxor(mixed_pic,xnn); %异或操作解密
figure()
imshow(remix_pic)
function [yn] = ft_logistic(x0,num_len,u)
xn = x0;
for j = 1:num_len
u_i = u(j);
for i = 1:j
xn(i+1) = u_i*xn(i).*(1-xn(i));
end
yn(1,j) = xn(j);
end
end
未加密前:
加密后:
解密后:
Demo2:彩色图加密
clc,clear,close all;
pic1 = imread("lenna.jpg");
imshow(pic1)
[M,N] = size(pic1(:,:,1));
x0 = 0.5;
u = 0:0.008:4;
xn = ft_logistic(x0,length(u)-1,u); %生成混沌序列
figure()
plot(u(2:end),xn,'b.',"linewidth",1.2)
grid on
L_xn = zeros(1,M*N);
L_xn(1) = xn(1,end); %将混沌状态的最后一个值作为初值
for i = 1:M*N-1 %生成新的混沌序列用于加密
L_xn(i+1) = 4*L_xn(i)*(1-L_xn(i));
end
L_xn = uint8(255*L_xn); %混沌序列反归一化
L_xn = reshape(L_xn,[M,N]); %xnn为混沌秘钥
xnn(:,:,1) = L_xn;
xnn(:,:,2) = L_xn;
xnn(:,:,3) = L_xn;
mixed_pic(:,:,1) = bitxor(pic1(:,:,1),xnn(:,:,1)); %异或操作加密
mixed_pic(:,:,2) = bitxor(pic1(:,:,2),xnn(:,:,2));
mixed_pic(:,:,3) = bitxor(pic1(:,:,3),xnn(:,:,3));
figure()
imshow(mixed_pic)
imwrite(mixed_pic,"code.jpg")
% mixed_pic = imread("code3.jpg");
remix_pic(:,:,1) = bitxor(mixed_pic(:,:,1),xnn(:,:,1)); %异或操作解密
remix_pic(:,:,2) = bitxor(mixed_pic(:,:,2),xnn(:,:,2));
remix_pic(:,:,3) = bitxor(mixed_pic(:,:,3),xnn(:,:,3));
figure()
imshow(remix_pic)
imwrite(remix_pic,"decode.jpg")
function [yn] = ft_logistic(x0,num_len,u)
xn = x0;
for j = 1:num_len
u_i = u(j);
for i = 1:j
xn(i+1) = u_i*xn(i).*(1-xn(i));
end
yn(1,j) = xn(j);
end
end
效果:
加密前:
加密后:
解密后:
加密后的Lena原图: