⛄一、正交拉丁方置乱及混沌系统简介
0 引言
随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要。通常应用于数字图像通信的两种保护技术为:数字水印技术和图像加密技术。前一种保护技术因不改变图像的可见性而不适合用于保密图像的传送。后一种技术通过加密操作, 改变图像的可见性, 使原来的图像成为不可辨别的, 而只能通过相应的解密算法得到原始图像。随着通讯技术的发展, 图像加密技术因其具有良好的保密性而得到越来越广泛的应用。
在加密算法中需要一个随机序列发生器。由于离散的混沌系统容易实现, 同时混沌系统对参数和初始条件极其敏感, 把其作为密钥, 则系统具有优良的密码特性, 同时它在二维相平面内的不规则性使其更适用于图像加密。
本文应用离散混沌动力系统, 针对图像数据的存储特点, 设计了一种图像加密算法。所有的密钥都由离散混沌映射产生, 因此算法没有因为增加密钥设置而影响加密/解密的效率和速度。由于利用了混沌映射, 增加了破译难度, 提高了安全性, 仿真结果表明该算法能够有效地实现对数字图像数的加密/解密。
1 正交拉丁方置乱
1.1 基本概念
定义1由元素1, 2, 3,…,n构成一个n×n的方阵(aij) n×n,使得每行每列中各元素恰好只出现一次,这样的方阵叫做n阶拉丁方。
定义2设A=(aij) n×n, B= (bij) n×n是两个n×n的拉丁方,若方阵( (aij, bij) )n×n中的n2个偶对(aij, bij)互不相同,i, j=1, 2,…,n,则称A与B为互相正交拉丁方,或称A与B为n阶正交拉丁方。
则由A、B构成3×3的偶对方阵
其中没有相同的元素,故A与B是三阶正交拉丁方。
1.2 相关定理
定理1互相正交的n阶拉丁方的个数不超过n-1个,即若A1, A2,…,Ak是两两正交的n阶拉丁方,则k≤n-1。
定理2设n≥3且n=pα,p为一个素数,α是一个正整数,则存在n-1个正交的n阶拉丁方A1, A2,…,An-1,且设
定理3若A1, A2,…,Am为两两正交的拉丁方组,且设
1.3 基于正交拉丁方的数字图像置乱
图像置乱起源于密码学早期所使用的一些密码算法,功能是将图像中像素的位置重新排列,将原始图像变换成一个杂乱无章的新图像,要恢复原始图像必须保证原始图像与变换图像之间的变换是1-1映射(双射),而正交拉丁方正好具备该性质。具体方法是:
由定理3知,对于3维空间中的图像,利用正交拉丁方同样能达到数字图像置乱的目的,由于正交拉丁方组中含有n-1个互相正交的拉丁方,故这种图像置乱方法有n (n-1) 种。而对于三维图像则有n (n-1) (n-2) 种。
1.4 新的图像加密算法
文中提出的算法其主要思想是:根据Logistic映射,利用密钥x0, μ产生混沌序列xk,由xk生成灰度置乱矩阵G*,利用矩阵G*对原图像加密后再对其应用基于正交拉丁方的置乱,完成对图像的双重加密。完整的置乱和复原算法如图1所示。
算法采用异或运算对像素值进行改变是因为异或运算在数学上可逆,可实现算法的逆操作。步骤如下:
(1)根据Logistic映射,利用密钥μ, x0。生成一组混沌序列xk, 从xr (r>0) 开始取M×N个元素构成M×N的矩阵B, B (i, j) ∈[0, 1]。将B (i, j) 按式 (7) 变换生成加密矩阵C, C (i, j) ∈[0, 255]。
(2)原始图像矩阵为A,把A中每个像素的像素值 (i, j) 与C (i, j) 作异或运算,得到一级加密图像M。
(3)对图像M进行正交拉丁方置乱变换,得到最终加密图像I*。解密过程刚好是加密隐藏的逆过程。
(4)对图像I*进行正交拉丁方逆变换, 得到图像M。
(5)根据一维Logistic函数、参数及初始值,得到一维随机序列,形成加密矩阵C。
(6)加密矩阵C与图像M作异或运算,得到原始图像矩阵A。
图1 加密算法模型
2 混沌系统
2.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.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 = pjimage(varargin)
% PJIMAGE MATLAB code for pjimage.fig
% PJIMAGE, by itself, creates a new PJIMAGE or raises the existing
% singleton*.
%
% H = PJIMAGE reurns the handle to a new PJIMAGE or the handle to
% the existing singleton*.
%
% PJIMAGE(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in PJIMAGE.M with the given input arguments.
%
% PJIMAGE(‘Property’,‘Value’,…) creates a new PJIMAGE or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before pjimage_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to pjimage_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 pjimage
% Last Modified by GUIDE v2.5 23-May- 09:56:32
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @pjimage_OpeningFcn, …
‘gui_OutputFcn’, @pjimage_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% — Executes just before pjimage is made visible.
function pjimage_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 pjimage (see VARARGIN)
% Choose default command line output for pjimage
handles.output = hObject;
% 预加载初始数据
load(‘mixparam_data.mat’)
set(handles.edit1,‘string’,num2str(u))
% Update handles structure
guidata(hObject, handles);
setappdata(handles.figure_pjimage,‘img_src’,0);
setappdata(handles.figure_pjimage,‘imCp’,0);
set(handles.text1,‘visible’,‘off’)
set(handles.text2,‘visible’,‘off’)
set(handles.text3,‘visible’,‘off’)
set(handles.text4,‘visible’,‘off’)
set(handles.text5,‘visible’,‘off’)
set(handles.text6,‘visible’,‘off’)
set(handles.text9,‘visible’,‘off’)
set(handles.text10,‘visible’,‘off’)
set(handles.m_image_change,‘enable’,‘off’)
set(handles.m_image_mix1,‘enable’,‘off’)
% UIWAIT makes pjimage wait for user response (see UIRESUME)
% uiwait(handles.figure_pjimage);
% — Outputs from this function are returned to the command line.
function varargout = pjimage_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;
% --------------------------------------------------------------------
function m_file_Callback(hObject, eventdata, handles)
function m_image_Callback(hObject, eventdata, handles)
% --------------------------------------------------------------------
function m_image_change_Callback(hObject, eventdata, handles)
%读取加密的文件
x=imread(‘src_column_jia.bmp’);
%显示图片
axes(handles.axes_srcmix_jia); %使用第二个axes
imshow(x);
set(handles.text9,‘visible’,‘on’)
set(handles.text9,‘String’,‘原图像列加密’);
img_src=getappdata(handles.figure_pjimage,‘img_src’);
[M,N] = size(img_src);
Rm= randsample(M,M)‘;
Mchange = [1:1:M;Rm];
Rn = randsample(N,N)’;
Nchange = [1:1:N;Rn];
%打乱行顺序
img_src (Mchange(1,:)😅 = img_src (Mchange(2,:)😅;
%打乱列顺序
img_src (:,Nchange(1,:)) = img_src (:,Nchange(2,:));
%原图列变换还原
axes(handles.axes_jian_line); %使用第三个axes
imshow(img_src);
set(handles.text2,‘visible’,‘on’)
set(handles.text2,‘String’,‘原图像-列解密’);
%原图行变换还原
img_src (:,Nchange(2,:)) = img_src (:,Nchange(1,:));
axes(handles.axes_jian_column); %使用第三个axes
img_src (Mchange(2,:)😅 = img_src (Mchange(1,:)😅;
imshow(img_src);
set(handles.text3,‘visible’,‘on’)
set(handles.text3,‘String’,‘原图像-解密后图像’);
imwrite(img_src,‘src_change_encop.bmp’,‘bmp’);
%截图
%读取加密的文件
x=imread(‘intercept_column_jia.bmp’);
%显示图片
axes(handles.axes_intercept_mix_jia); %使用第二个axes
imshow(x);
set(handles.text10,‘visible’,‘on’)
set(handles.text10,‘String’,‘截取图列加密’);
%截图
imCp = imcrop( img_src, [212,100,181,168] );
%截图解密开始
[M,N] = size(imCp);
Rm= randsample(M,M)‘;
Mchange = [1:1:M;Rm];
Rn = randsample(N,N)’;
Nchange = [1:1:N;Rn];
%打乱行顺序
imCp (Mchange(1,:)😅 = imCp (Mchange(2,:)😅;
%打乱列顺序
imCp (:,Nchange(1,:)) = imCp (:,Nchange(2,:));
%截取图列解密
imCp (:,Nchange(2,:)) = imCp (:,Nchange(1,:));
axes(handles.axes_intercept_linedest); %使用第三个axes
imshow(imCp);
set(handles.text5,‘visible’,‘on’)
set(handles.text5,‘String’,‘截取图-列解密’);
%截取图列解密
imCp (Mchange(2,:)😅 = imCp (Mchange(1,:)😅;
axes(handles.axes_intercept_columndest); %使用第三个axes
imshow(imCp);
set(handles.text6,‘visible’,‘on’)
set(handles.text6,‘String’,‘截取图-解密后图像’);
imwrite(imCp,‘intercept_change_encop.bmp’,‘bmp’);
% — Executes on button press in gcf.
function gcf_Callback(hObject, eventdata, handles)
% hObject handle to gcf (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%run(image_register);
%set(pjimage,‘Visible’,‘off’);%关闭当前界面
h=figure(image_register);
image_register(‘Visible’,‘on’);
% — Executes on button press in m_image_open.
function m_image_open_Callback(hObject, eventdata, handles)
% hObject handle to m_image_open (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile( …
{ ‘.jpg;.tif;.png;.gif’,‘All Image Files’;…
‘.’,‘All Files’ },‘Pick an image’);
if isequal(filename,0)||isequal(pathname,0)
return; %如果条件成立,则取消操作,返回
end
fpath=[pathname filename]; %合成路径+文件名
img_src=imread(fpath);
imCp = imcrop( img_src, [212,100,181,168] );
axes(handles.axes_src); %使用第一个axes
imshow(img_src);
set(handles.text1,‘visible’,‘on’)
set(handles.text1,‘String’,‘原图像’);
axes(handles.axes_intercept_src);
imshow(imCp);
set(handles.text4,‘visible’,‘on’)
set(handles.text4,‘String’,‘截取图’);
setappdata(handles.figure_pjimage,‘img_src’,img_src);
setappdata(handles.figure_pjimage,‘imCp’,imCp);
set(handles.m_image_change,‘enable’,‘on’)
set(handles.m_image_mix1,‘enable’,‘on’)
function edit1_Callback(hObject, eventdata, handles)
% — Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
end
% — Executes on button press in pushbutton11.
function pushbutton11_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton11 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
u1 = str2num(get(handles.edit1,‘string’));
% pjimage 程序中的数据传入 set_rgb_value 程序;经设定之后,再传回 main 程序
u = set_rgb_value(u1);
set(handles.edit1,‘string’,num2str(u))
save(‘mixparam_data.mat’,‘u’)
% — Executes on button press in m_image_mix1.
function m_image_mix1_Callback(hObject, eventdata, handles)
x=getappdata(handles.figure_pjimage,‘img_src’);
%读取信息存放到m,n,s
[m,n,s]=size(x);
%保存原始图片的数据
y=x;
%密钥
x0=0.2915826302;
%u∈[3.599456……,4 ],越靠近4,混沌效果越好
%u=4.0;
newU=load(‘mixparam_data.mat’);
u=newU.u;
for i=1:s
for j=1:n
for k=1:m
%计算x0
x0=ux0(1-x0);
key=mod(x0*1000,256);
%异或操作,结果放到y中
y(k,j,i)=bitxor(x(k,j,i),uint8(key));
end
end
end
%加密结果写入 文件
imwrite(y,‘b.bmp’);
%读取加密的文件
x=imread(‘b.bmp’);
%显示图片
axes(handles.axes_srcmix_jia); %使用第二个axes
imshow(x);
set(handles.text9,‘visible’,‘on’)
set(handles.text9,‘String’,‘原图像混沌加密’);
%获取到size信息
[m,n,s]=size(x);
%密钥,要和加密的密钥一致
x0=0.2915826302;
%u=4.0;
newU=load(‘mixparam_data.mat’);
u=newU.u;
for i=1:s
for j=1:n
for k=1:m
%计算x0
x0=ux0(1-x0);
key=mod(x0*1000,256);
%再次异或操作执行解密
y(k,j,i)=bitxor(x(k,j,i),uint8(key));
end
end
end
%显示图片
axes(handles.axes_jian_line); %使用第二个axes
imshow(y);
set(handles.text2,‘visible’,‘on’)
set(handles.text2,‘String’,‘原图像混沌解密’);
axes(handles.axes_jian_column); %使用第二个axes
m = size(y, 3);
if m==1
imhist(y);
else
imhist(rgb2gray(y));
end
set(handles.text3,‘visible’,‘on’)
set(handles.text3,‘String’,‘原图像混沌直方图’);
imwrite(y,‘src_mix_encop.bmp’);
%截取图解密开始
img_src=getappdata(handles.figure_pjimage,‘img_src’);
x = imcrop( img_src, [212,100,181,168] );
%读取信息存放到m,n,s
[m,n,s]=size(x);
%保存原始图片的数据
y=x;
%密钥
x0=0.2915826302;
%u∈[3.599456……,4 ],越靠近4,混沌效果越好
%u=4.0;
newU=load(‘mixparam_data.mat’);
u=newU.u;
for i=1:s
for j=1:n
for k=1:m
%计算x0
x0=ux0(1-x0);
key=mod(x0*1000,256);
%异或操作,结果放到y中
y(k,j,i)=bitxor(x(k,j,i),uint8(key));
end
end
end
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
a
2 参考文献
[1]邢顺来,李志斌,周华成.基于Arnold变换和混沌映射的图像加密方法[J].山东广播电视大学学报. ,(01)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除