一、混沌系统简介

0 引言
随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要。通常应用于数字图像通信的两种保护技术为:数字水印技术和图像加密技术。前一种保护技术因不改变图像的可见性而不适合用于保密图像的传送。后一种技术通过加密操作, 改变图像的可见性, 使原来的图像成为不可辨别的, 而只能通过相应的解密算法得到原始图像。随着通讯技术的发展, 图像加密技术因其具有良好的保密性而得到越来越广泛的应用。
在加密算法中需要一个随机序列发生器。由于离散的混沌系统容易实现, 同时混沌系统对参数和初始条件极其敏感, 把其作为密钥, 则系统具有优良的密码特性, 同时它在二维相平面内的不规则性使其更适用于图像加密。
本文应用离散混沌动力系统, 针对图像数据的存储特点, 设计了一种图像加密算法。所有的密钥都由离散混沌映射产生, 因此算法没有因为增加密钥设置而影响加密/解密的效率和速度。由于利用了混沌映射, 增加了破译难度, 提高了安全性, 仿真结果表明该算法能够有效地实现对数字图像数的加密/解密。

1 混沌系统
混沌现象是一种有界的内在的随机过程, 具有时间遍历性, 这种过程既非周期性, 又不收敛任意相近的两点经过若干次混沌迭代之后, 都会呈现指数发散, 所以很难预测混沌系统的初值和参数。另外, 混沌轨道极其不规则, 系统输出类似于随机噪声, 这些特点均使混沌映射很适用于设计密码系统。

Lyapunov指数是判断系统处于混沌状态的重要判据。Lyapunov指数小于零时, 系统运动状态稳定, 对初始条件不敏感;Lyapunov指数大于零时, 系统状态不稳定, 且对初始条件敏感;Lyapunov指数为零则对应于一种临界状态。由于系统最大Lyapunov指数决定系统的主要演化趋势, 因此可以时间序列的最大Lyapunov指数是否大于零来判断系统是否处于混沌状态。

以简单的一维离散混沌系统Logistic为例, 其动力学系统为:

其中, μ为控制参数。混沌状态如图1所示。
由图可知, 在 3<μ<3.5699456之间, 系统处于周期状态, 当 3.5699456<μ<4时, 系统开始进入混沌状态。
针对Logistic混沌系统, 这里提出一种一维逐段线性混沌系统 (pwlcm) , 其动力学方程为:

其中, x∈I=[0, 1) , p∈ (0, 1/2) , p为控制参数, F是一个在L-bit有限精度下实现的逐段线性混沌映射。其混沌状态如图2所示。

图2 Pwlcm混沌状态图

图3 序列量化性能比较

图4 加密算法流程图
由图所示, (a) 表示Pwlcm的线性分段关系; (b) 是混沌序列图, 说明Pwlcm动力系统是一个混沌的动力学系统; © 、 (d) 分别是其周期倍增分叉与Lyapunov指数谱, 可知Pwlcm系统在控制参数p的整个取值范围内Lyapunov均大于零, 与Logistic系统相比具有更大的密钥取值空间, 同时由图 (b) 可知, Pwlcm系统具有均匀的不变分布与很高的遍历性, 混合性和确定性, 因此可产生很强的随机序列, 适合用于加密系统。

2 混沌量化
对于Pwlcm动力学系统, 采用以下方式进行序列量化, 以产生计算机标准二进制的0-1序列流 {Sm (t) }。

其中m>0为任意正整数, Im0, Im1, Im2…是区间[0, 1]的2m个连续的等分区间。由于混沌序列{x (t) }具有良好的随机统计特性[3,4], 这样生成的{Sm(t)}在理论上具有均衡的0-1比和δ-like的自相关等优良的统计特性。其量化结果如图3所示。
图3中,
(a) 表示0-1序列流的自相关函数, 可见其表现了δ-like的自相关特性, 说明该混沌系统在一定的计算精度下的非周期性。
(b) 表示初值相差0.00000015的两个序列流的互相关函数。由图可知, 经量化后的序列流具有很强的随机性, 在初值相差很小的情况下, 其序列流是完全不相关的, 也充分表现了其初值敏感性。
© 表示量化后序列0-1值的个数比。可见系统在经过若干次迭代进入混沌状态后, 其比值近似为1, 充分说明了其混沌系统的遍历性。
(d) 表示随机序列的线性复杂度。

从密码学的观点看, 序列的线性复杂度曲线是表征序列不可预测性和随机性的一个非常有效的度量指标, 对于n位随机序列的线性复杂度期望约等于n/2, 则说明其随机性能良好。这里采用B-M综合算法, 假设混沌二值序列为标准的m序列, 计算得到该序列阶数最小的线性移位寄存器的阶数, 即为该混沌序列的线性复杂度。由图可知, 该混沌序列的随机性能良好, 可满足系统加密要求。
4 图像加密

基于上述的特点, 采用Pwlcm系统应用于图像加密算法。将待加密的图像数据转换为二进制数据, 与量化后的混沌二值序列进行逐位异或计算, 使混沌信号与加密信息信号相互缠绕, 掩盖信息的可视性, 以达到保密的目的。

解密过程与此一致, 解密方采用相同的初值及控制参数, 生成相同的混沌序列, 与接收的加密信号进行逐位异或, 将结果输出还原, 以得到原始信息信号。具体加密过程如图4所示。

虽然Pwlcm系统具有它独特的优势, 但可以发现针对固定的控制参数p很容易被破解。如图2 (a) 所示, 对于 (2) 式迭代生成的混沌序列, 只要得到位于同一分段上的任意两个点对 (x (t) , x (t+1) ) 和 (x (t′) , x (t′+1) ) , 就可以确定参数p= (x (t′) -x (t) ) / (x (t′+1) -x (t+1) ) 。

为了避免参数p被攻破, 可以改变一般对于流密码加密一次一密钥的方式, 采用加密过程中定时更换控制参数p的方法, 以增强抗攻击的能力。

图5 加密解密仿真
这里把所有的密钥都由离散混沌映射产生, 系统由随机函数rand () 产生初值x, 根据x的量化值及p的取值空间来选取p, 假设参数p的分辨率L=10, p的可能的不同值为 p1, p2, p3, …, pn, n=2L, p的选取顺序依x量化值的顺序。算法仿真结果如图5所示。

整个加密过程中, 将初值的量化结果根据控制参数p的取值范围进行转化, 其结果作为p的值进行混沌过程的迭代。本文考虑到读取原始数据进行二进制转换过程中, 单个数值转为8位二进制字符, 图像矩阵最后变为n×8的矩阵, 因此将混沌序列每产生n个值进行一次p值改变。

由仿真结果 (b) 可知, 经加密后的图像信息已完全被打乱, 达到保密效果, 由 © 图可知, 正确的密钥经解密过程, 加密信息可被完全重构, 效果良好。由 (d) 图可知, 即使在初值相差10-17的情况之下, 也不能将加密数据重构出来, 说明其抗攻击性强。

二、部分源代码

function varargout = encrypt(varargin)
% ENCRYPT MATLAB code for encrypt.fig
%      ENCRYPT, by itself, creates a new ENCRYPT or raises the existing
%      singleton*.
%
%      H = ENCRYPT returns the handle to a new ENCRYPT or the handle to
%      the existing singleton*.
%
%      ENCRYPT('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in ENCRYPT.M with the given input arguments.
%
%      ENCRYPT('Property','Value',...) creates a new ENCRYPT or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before encrypt_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to encrypt_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help encrypt% Last Modified by GUIDE v2.5 24-Dec-2019 21:56:19% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @encrypt_OpeningFcn, ...'gui_OutputFcn',  @encrypt_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before encrypt is made visible.
function encrypt_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to encrypt (see VARARGIN)% Choose default command line output for encrypt
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes encrypt wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = encrypt_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[filename,filepath] = uigetfile({'*.bmp;*.jpg;*.png;*.jpeg;*.tif','文件类型 (*.bmp,*.jpg,*.png,*.jpeg,*.tif)';'*.*', '所有文件(*.*)'},'Pick an image');
file = strcat(filepath,filename);
im = imread(file);
axes(handles.axes1);
imshow(im);
imwrite(im,'snap.bmp'); % --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
obj = videoinput('winvideo',1,'YUY2_1280x720')%1280x720 160x120 176x144 320x240 352x288 640x480
% vidRes = get(obj, 'VideoResolution');
% nBands = get(obj, 'NumberOfBands');
% preview(obj);%getsnapshot(obj);
vidRes = get(obj, 'VideoResolution');
nBands = get(obj, 'NumberOfBands');
hImage = image( zeros(vidRes(2), vidRes(1), nBands),'parent',handles.axes1);
preview(obj, hImage);
frame = getsnapshot(obj);
frame = ycbcr2rgb(frame);
imwrite(frame,'snap.bmp','bmp');
pic = imread('snap.bmp');
axes(handles.axes1);
imshow(pic);
title(date,'color','r');function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double
% input = str2num(get(hObject,'String'));%这里get后面要注意
% if(isempty(input))
%     set(hObject,'String','0')
% end
guidata(hObject,handles)% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
a=imread('snap.bmp');
R=a(:,:,1);                           %取图像的R层像素
G=a(:,:,2);                           %取图像的G层像素
B=a(:,:,3);                           %取图像的B层像素
[M1,N1]=size(R);
[M2,N2]=size(G);
[M3,N3]=size(B);
h=0.01;    %混沌序列初始化
x=zeros(1,40001);x(1)= str2num(get(handles.edit1,'String'));
y=zeros(1,40001);y(1)=0;
z=zeros(1,40001);z(1)=0;
w=zeros(1,40001);w(1)=0;
v=zeros(1,40001);v(1)=0;
for n=1:40000         %产生混沌序列初始化,欧拉法 x(n+1)=x(n)+h*(3.5*(y(n)-x(n)-(-1.2+0.3*(w(n)*w(n)))*x(n))); y(n+1)=y(n)+h*(2.1*y(n)-z(n)-0.2*(y(n)-x(n))-0.2*(1.2+7*abs(v(n)))*y(n)); z(n+1)=z(n)+h*(2.1*y(n)-z(n));w(n+1)=w(n)+h*(x(n));v(n+1)=v(n)+h*(y(n));
end
for n=1:40000  %对3个序列进行改进 x(n)=x(n)*1000000-round(x(n)*1000000); y(n)=y(n)*1000000-round(y(n)*1000000); z(n)=z(n)*1000000-round(z(n)*1000000);w(n)=w(n)*1000000-round(w(n)*1000000); v(n)=v(n)*1000000-round(v(n)*1000000);
end % %对R通道进行加密for j=1:N1  %用位异或法对像素进行置乱 aa=(uint8((M1*N1*(x(N1+j)+0.5))*ones(M1,1))); g1(:,j)=bitxor(R(:,j),aa); h1(:,j)=bitxor(g1(:,j),aa); %对像素置乱进行解密
end
for i=1:M1 %行置乱t(1:N1)=y(1:N1);[t1,index1]=sort(t(1:N1));t1=flipud(t1);g2(i,:)=g1(i,index1);h2(i,index1)=g2(i,:);
end
for j=1:N1 %列置乱t(1:M1)=z(1:M1);[t1,index1]=sort(t(1:M1));index1=flipud(index1);g3(:,j)=g2(index1,j);h3(index1,j)=g3(:,j);
end% %对G通道进行加密for j=1:N2  %用位异或法对像素进行置乱 bb=(uint8((M2*N2*(x(N2+j)+0.5))*ones(M2,1))); j1(:,j)=bitxor(G(:,j),bb); k1(:,j)=bitxor(j1(:,j),bb); %对像素置乱进行解密
end
for i=1:M2 %行置乱t(1:N2)=x(1:N2);[t2,index2]=sort(t(1:N2));t2=flipud(t2);j2(i,:)=j1(i,index2);k2(i,index2)=j2(i,:);
end

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

【图像加密】基于matlab GUI混沌系统灰色图像加密解密(带面板)【含Matlab源码 1240期】相关推荐

  1. matlab 混沌信号,基于五维混沌系统的图像加密方法

    大家都知道混沌信号作为加密信号源,可以应用于图像加密,文本文件加密,语音加密,系统加密等诸多领域,那么接下来,我给大家介绍一种基于五维混沌系统的图像加密方法,该方法不仅可以实现对图像加密,而且与其它加 ...

  2. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab GUI butterworth+中值+维纳+小波图像去噪[含Matlab源码 520期] 获取代码方式2: ...

  3. 【物理应用】基于matlab GUI气象参数计算综合指标和IAQI【含Matlab源码 2116期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[物理应用]基于matlab GUI气象参数计算综合指标和IAQI[含Matlab源码 2116期] 点击上面蓝色字体,直接付费下载,即可 ...

  4. 【目标检测】基于matlab GUI背景差分算法视频运动物体跟踪【含Matlab源码 1915期】

    一.背景差分法和帧间差分法的车辆运动目标检测简介 1 引言 运动目标检测是从图像序列中检测运动目标.通过运动目标检测可以得到图像中的运动目标,获取图像中的运动信息.运动目标检测在医学辅助诊断.航天航空 ...

  5. 【语音处理】基于matlab GUI低通滤波器语音信号加噪与去噪【含Matlab源码 1708期】

    ⛄一.语音处理简介(附课程作业报告) 1 语音信号的特点 通过对大量语音信号的观察和分析发现,语音信号主要有下面两个特点: ①在频域内,语音信号的频谱分量主要集中在300-3400Hz的范围内.利用这 ...

  6. 基于JavaWeb Mybatis+MVC(JSP + servlet + javabean)的高校就业管理系统(含项目源码)

    基于JavaWeb Mybatis+MVC的高校就业管理系统 项目简介 基本功能简介 项目要求 概要设计 数据模型(E-R图) 数据库结构设计 主要页面展示 项目实现 创建项目 项目结构展示 项目关键 ...

  7. 【目标跟踪】基于matlab GUI帧差法结合卡尔曼滤波行人姿态识别【含Matlab源码 1127期】

    ⛄一.基于人体特征识别和卡尔曼滤波的行人跟踪算法简介 1 基于体型和行为姿态特征的人体识别算法 从红外图像中可以得到目标与背景之间的灰度级差别,从而区分出有生命特征的运动物体,但仅从亮度特征无法区别出 ...

  8. 【口罩识别】基于matlab GUI RGB滤波+YCbCr+肤色标定口罩识别【含Matlab源码 1895期】

    ⛄一.口罩识别简介 口罩规范佩戴识别是基于人脸口罩检测结果进行的,该部分的输入是人脸口罩检测的输出且是有佩戴口罩的人脸.首先,将人脸部分的图像提取出来:然后映射到YCrCb颜色空间并进行非线性变换,经 ...

  9. 【ACO三维路径规划】基于matlab GUI蚁群算法无人机三维路径规划【含Matlab源码 254期】

    一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下 ...

  10. 【图像分割】基于matlab GUI医学图像均值聚类+OUST+区域生长法图像分割【含Matlab源码 2210期】

    一.图像分割简介 1 图像分割技术 图像分割 : 根据灰度 , 颜色 , 纹理等,将图像进行分割. 2 常用的分割技术 2.1 边缘检测法 边缘是图像的最重要的特征.边缘是指周围像素灰度有阶跃变化或屋 ...

最新文章

  1. java内存溢出的定位和分析
  2. python-桶排序
  3. 如何能让mediawiki实现共享
  4. 用STM32做个东京奥运奖牌榜
  5. p4: php5ts.dll p5: 5.6.14.0,服务器httpd.exe 应用程序错误
  6. 5G手机产业链将带动多少A股上市公司?
  7. HSPA+系列之“下行增强F-DPCH +下行增强CELL_FACH
  8. dd 转换和拷贝复制文件
  9. 同学,你这简历上没项目啊!
  10. 嵌入式平台 STM32 libqrencode 移植 二维码生成
  11. R语言数据可视化-条形图
  12. 分布式学习之一:事务
  13. python调用程序call_Python调用外部程序——os.system()和subprocess.call()
  14. 基于遗传算法的电动汽车有序充放电优化问题
  15. 喜讯 | 经纬恒润荣获一汽红旗 “攻坚克难·旗志奖”
  16. 阿里quick_bi和biee报表工具的对比
  17. 第六天:机器视觉-深度学习
  18. 【虹科】处理激光雷达数据实现目标检测
  19. 写一个基于知识图谱的古诗词问答系统的背景意义,500字
  20. Java UUID 的 和 oracle的 sys_duid的用法比较

热门文章

  1. PHP人民币金额数字转中文大写的函数
  2. (扫盲)WebSocket 教程
  3. 自定义cobbler安装系统菜单界面
  4. 使用 github + jekyll 搭建个人博客
  5. 【Linux开发】linux设备驱动归纳总结(四):3.抢占和上下文切换
  6. HttpClient 4.0.x Tips
  7. 20191118每日一句
  8. Leap手心发射线,碰撞点用小球表示,并用Line Renderer画出来
  9. 扇贝有道180917每日一句
  10. unity Rigidbogy组件