混沌图像加密算法原理及matlab实现
引言
混沌作为一种非线性动力学过程,对初始状态具有高度敏感性,且不可预知,是一种天然的物理密码。因此在密码学,随机数产生,保密通信及图像加密领域具有广泛的应用。本文基于最基本的Lorenz混沌系统实现了图像加密,并利用Matlab演示了这一加密和解密过程。
1、Lorenz混沌系统原理
一个混沌系统可以由一个微分方程或微分方程组进行表示,我们对这个微分方程或微分方程组进行求解就可以求得相应的混沌序列,一个Lorenz混沌系统可以简单由如下图所示的微分方程组进行表示。
描述一个混沌系统最直观的方式就是相空间图,相空间图以系统的状态变量为坐标,图中的每一个点都代表相应时间节点系统所处的状态,因此从相空间图可以清楚地看到非线性动力学系统的演化轨迹,混沌系统的相空间表现为奇异吸引现象, 在有限的区域内,相空间图受到空间中的特定点的吸引,轨迹永不重复,永不交叉。如下图所示的就是Lorenz系统的相空间图。
2、混沌图像加密
Matlab中提供了ode45()函数可以很方便地对一个微分方程或微分方程组进行数值求解,Lorenz混沌系统的求解代码如下所示。
function dy=odefun(t,y) dy=zeros(3,1); dy(1)=16*(y(2)-y(1)); dy(2)=y(1)*(46-y(3))-y(2); dy(3)=y(1)*y(2)-4*y(3); end
function [component_one,component_two,component_three]=Lorenz(initial_value)%1E-17 tspan=[20,30000];%时间截断范围 [~,Y0]=ode45(@odefun,tspan,initial_value); component_one=Y0(:,1); component_two=Y0(:,2); component_three=Y0(:,3); figure(1); plot3(Y0(:,1),Y0(:,2),Y0(:,3)); xlabel(x); ylabel(y); zlabel(z); title(Lorenz混沌系统相空间图); grid on; end
通过对如上所述的Lorenz系统进行数值求解并得到相应的混沌序列后,需要对其进行归一化并量化到[0,255]范围内,然后通过将原始图像按像素点与混沌序列进行位异或即可得到加密图像,过程如下。
clc; clear; lenna = imread(lenna.jpg);%读入图像 % 生成混沌序列 initial_value = [0.001,0.005,0.002]; [~,~,A] = Lorenz(initial_value); % 由于起始时刻的数据都比较小,因此剔除起始时刻的数据 A = A(100:end); figure(2) subplot(1,3,1); imshow(lenna); title(原始图像); % 归一化混沌序列 A_normal = (A-min(A))./(max(A)-min(A)); % 控制范围为[0,255] A_uint8 = uint8(A_normal*255); A_encry = reshape(A_uint8(1:512*512),512,512); % 执行图像加密 for i = 1:512 for j = 1:512 lenna_encry(i,j) = bitxor(lenna(i,j),A_encry(i,j)); end end subplot(1,3,2); imshow(lenna_encry); title(加密图像); % 执行图像解密 for i = 1:512 for j = 1:512 lenna_decry(i,j) = bitxor(lenna_encry(i,j),A_encry(i,j)); end end subplot(1,3,3); imshow(lenna_decry); title(解密图像);
加密解密前后对比结果如下图所示。
下一篇:
win10环境下cmake使用方法