【图像加密】基于matlab GUI 正交拉丁方置乱+混沌图像加密解密【含Matlab源码 636期】

104 阅读6分钟

一、简介

1 混沌的解释

顾名思义就是一种无序的、不可预测的、混乱的、摸不到头、摸不到尾的状态。
混沌最大的特性就是对初始值敏感。通俗的说,就是蝴蝶效应,在某某某地方,一个蝴蝶轻轻煽动一下翅膀就会产生很大的飓风。
为什么这个方程可以称作混沌呢?它什么时候是一个混沌系统呢?这个也是有条件的:
0 < X(0) < 1
3.5699456… < u <=4

2 混沌序列的生成
当迭代n次后,我们就得到了X(1)、X(2)、…,X(n)这么n个值。那么这就是一个混沌序列,是一维的暂且称作序列A,也就是我们想要得到的序列,在MATLAB中,可以看出X(i)(i=1,2,…,n)的取值是在(0,1)之间的——这是一个很好地特性,就像图像灰度值是在(0,255)之间一样。那么我们把这个一维序列归一化到(0,255)之间得到序列B。

3 加密过程
对于一幅MN大小的图像(暂且称为Picture),我们需要产生一个同样大小的矩阵来对其进行加密。如此说来,只需要迭代MN次得到序列A,再转成序列B,此时序列B是一维的,将其转化成MXN的二维矩阵(暂且称为Fuck)。因此,用Fuck与Picutre进行异或,便可得到一幅新的图像,称作Rod,如此便完成了一次图像加密,加密后的图像为Rod。
Rod=Picture⊕Fuck(⊕表示异或)

4 加密算法分析
这样我们手中的密钥是:u,X(0);
此种加密方式称作序列加密,可以看出这种加密方式改变了下像素的灰度(直方图变了),没有改变位置。
解密同样道理:Picture = Rod⊕Fuck

二、源代码

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-2011 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=u*x0*(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=u*x0*(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=u*x0*(1-x0);
 key=mod(x0*1000,256);
 %异或操作,结果放到y中
 y(k,j,i)=bitxor(x(k,j,i),uint8(key));
 end
 end
end

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a