MATLAB-Logistic混沌序列-灰度图-RGB彩色图-异或加密

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原图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayne_Fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值