⛄一、正交拉丁方置乱及二维Arnold置乱简介

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 Arnold置乱
2.1Arnold变换
将N*N图像上的点 (x, y) 通过如下变换转成 (x′, y′) 如式 (1) , 该变换即称为Arnold变换.通过变换公式可发现, 其变换的本质是点的位置的变换, 并且这种变换保证变换前后的点保持一一对应的关系。

如果将一次变换的输出作为下一次变换的输入, 这就是迭代变换如式 (2) .当一次变换置乱效果不佳时, 往往需要迭代变换获得更好的置乱效果。

2.2 基于Arnold变换的图像加解密
图像加密也称图像置乱, 是对图像的像素进行混乱和扩散, 使加密后的图像在视觉上无法获得有效信息.空域加密是常用的方法, 分为空域置乱和序列加密.空域置乱是对像素坐标进行变换使其混乱, 解密时恢复原像素坐标.图像的加密既可以作为独立的信息隐藏方法, 也可以用来作为数字水印技术中图像水印的预处理。

加密图像可以是灰度图像也可以是彩色图像, 如果是灰度图像则需要将各点的灰度值带到新的坐标点, 如果是彩色图像则需要将各点的RGB值带到新的坐标点.本文所加密的图像为彩色图像, 因此首先保存原图点 (x, y) 处的RGB值, 然后使用Arnold变换改变点 (x, y) 位置到 (x′, y′) , 同时将原图点 (x, y) 处的RGB值带到 (x′, y′) 处.我们采用256*256的彩色图像作为原始图像如图1a所示, 在Visual Studio2008平台下运用式 (1) 对原图进行一次Arnold变换, 变换后的效果如图1b所示.

由图1可知, 对图像进行一次Arnold变换后仍会留下较多信息, 故在此基础上继续使用Arnold变换, 通过5次变换后 (见图2b) 其结果在视觉上就很难再获得什么有价值的信息, 在视觉上起到了图像加密的作用.同时变换的次数往往可以作为密钥, 从而在一定程度上提高安全性。

图1 原图和一次Arnold变换结果

图2 第2次和第5次Arnold变换结果
然而此时的加密并不完全可靠, 若已知采用Arnold变换作为加密方式, 则通过暴力求解法, 经过若干次的变换还是可以解密出原图.因此在一般情况下, 我们往往需要在Arnold变换中加入密钥 (ku, kv) , 以提高安全性, 其公式如下:

当需要对图像进行解密时, 则根据加密后的图像中的像素点与原图中的像素点是一一对应的关系进行解密, 因此图像解密的过程为:根据原图中像素点的坐标 (x, y) 按照Arnold变换算出新图中像素点的坐标 (x′, y′) , 获取新像素点 (x′, y′) 的RGB值, 将该值归还给 (x, y) .根据加密过程使用的变换次数, 解密时则要将以上过程重复相应的次数就可以恢复原图 (见图3) 。

2.3 基于三维Arnold变换的图像加密
前面提到的图像置乱是通过打乱像素点位置而达成目标, 图像的颜色分量值是保持不变的.因此为了提高加密效果, 我们可以在像素点位置已乱的前提下, 再通过改变RGB颜色分量的值对图像进行加密.采用如下三维Arnold变换 (如式4) 进行RGB分量值的改变。

我们将一次Arnold变换后的图像作为原始图像, 在此基础上对各像素点的RGB采用以上公式进行扰乱, 获得如图4所示结果.通过两种加密方式的综合, 则进一步提高了加密图像的安全性.式4中的值可以做相应的改变, 同时可以将变换的次数作为密钥提高安全性。

图3 第五次Arnold变换结果, 恢复后的加密图像

图4 第一次Arnold变换结果, RGB扰乱后的加密图像

⛄二、部分源代码

function varargout = ladingfang(varargin)
% LADINGFANG M-file for ladingfang.fig
% LADINGFANG, by itself, creates a new LADINGFANG or raises the existing
% singleton*.
%
% H = LADINGFANG returns the handle to a new LADINGFANG or the handle to
% the existing singleton*.
%
% LADINGFANG(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in LADINGFANG.M with the given input arguments.
%
% LADINGFANG(‘Property’,‘Value’,…) creates a new LADINGFANG or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before ladingfang_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to ladingfang_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 ladingfang

% Last Modified by GUIDE v2.5 05-Jan-2005 22:18:40

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @ladingfang_OpeningFcn, …
‘gui_OutputFcn’, @ladingfang_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin & isstr(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 ladingfang is made visible.
function ladingfang_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 ladingfang (see VARARGIN)

% Choose default command line output for ladingfang
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% This sets up the initial plot - only do when we are invisible
% so window can get raised using ladingfang.
if strcmp(get(hObject,‘Visible’),‘off’)
% plot(rand(5));
end
global h1 h2
h1=handles.axes1;
h2=handles.axes2;
%-----------------初始化界面属性
set(handles.edit1,‘string’,‘1’);
set(handles.edit2,‘string’,‘2’);
set(handles.edit3,‘string’,‘125’);
set(handles.pushbutton2,‘Visible’,‘off’);
G=imread(‘LENA256.BMP’);
set(gcf,‘CurrentAxes’,h1);
imshow(G);
title(‘原图像’);
set(h2,‘Visible’,‘off’);

% UIWAIT makes ladingfang wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = ladingfang_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 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)
axes(handles.axes1);
cla;

global h1 h2
%------------更新并获取各对象属性
Times = str2num(get(handles.edit1, ‘string’));
X= str2num(get(handles.edit2, ‘string’));
Y= str2num(get(handles.edit3, ‘string’));
popup_sel_index = get(handles.popupmenu1, ‘Value’);
switch popup_sel_index
case 1
G=imread(‘lena256.bmp’);
set(gcf,‘CurrentAxes’,h1);
imshow(G);
title(‘原图像’);
%-----验证输入数据的有效性
N = str2double(get(handles.edit1,‘String’));
Errstr = ‘’;

  Errstr = '变换次数必须为正整数!';

end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
D(1) =str2double(get(handles.edit2,‘String’));
D(2) =str2double(get(handles.edit3,‘String’));
Errstr = ‘’;
if isnan(D(1)) | ~(floor(D(1)) == D(1)) | (D(1) < 1)| (D(1)>255)
Errstr = ‘参数1必须为1至255正整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
Errstr = ‘’;
if isnan(D(2)) | ~(floor(D(2)) == D(2)) | (D(2) < 1)| (D(1)>255)
Errstr = ‘参数2必须为1至255正整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end

if D(1) == D(2)
Errstr = ‘参数1与参数2必须不同!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
%-----------验证结束
%-----------计算期间,禁用部分控件
mousefrm(0,‘watch’);
set(handles.popupmenu1,‘enable’,‘off’);
set(handles.popupmenu2,‘enable’,‘off’);
set(handles.edit1,‘enable’,‘off’);
set(handles.edit2,‘enable’,‘off’);
set(handles.edit3,‘enable’,‘off’);
set(handles.pushbutton1,‘enable’,‘off’);
set(handles.pushbutton2,‘enable’,‘off’);
%----------------------------------------
set(gcf,‘CurrentAxes’,h2);
I=G;
[u,v]=zhengjiaodui(X,Y);

    %----------恢复控件的可用性set(handles.popupmenu1,'enable','on');set(handles.popupmenu2,'enable','on');set(handles.edit1,'enable','on');set(handles.edit2,'enable','on');set(handles.edit3,'enable','on');set(handles.pushbutton1,'enable','on');set(handles.pushbutton2,'enable','on');mousefrm(0,'arrow'); %--------------------------------------case 2G=imread('LENA256.BMP');set(gcf,'CurrentAxes',h1);imshow(G);title('原图像');%-----验证输入数据的有效性

N = str2double(get(handles.edit1,‘String’));
Errstr = ‘’;
if isnan(N) | ~(floor(N) == N) | (N <= 0)
Errstr = ‘变换次数必须为正整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
D(1) =str2double(get(handles.edit2,‘String’));
D(2) =str2double(get(handles.edit3,‘String’));
Errstr = ‘’;
if isnan(D(1)) | ~(floor(D(1)) == D(1))
Errstr = ‘参数1必须为整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
Errstr = ‘’;
if isnan(D(2)) | ~(floor(D(2)) == D(2))
Errstr = ‘参数2必须为整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
%-----------验证结束
mousefrm(0,‘watch’);
set(gcf,‘CurrentAxes’,h2);
positiontrans(G,Times,X,Y);
title(‘加密后’);
mousefrm(0,‘arrow’);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%% 解密函数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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)
axes(handles.axes1);
cla;
global h1 h2
Times = str2num(get(handles.edit1, ‘string’));
X= str2num(get(handles.edit2, ‘string’));
Y= str2num(get(handles.edit3, ‘string’));
Times = str2num(get(handles.edit1, ‘string’));
UNCODE=imread(‘code.bmp’);
set(gcf,‘CurrentAxes’,h1);
imshow(UNCODE);
title(‘解密前’);
%-----验证输入数据的有效性
N = str2double(get(handles.edit1,‘String’));
Errstr = ‘’;
if isnan(N) | ~(floor(N) == N) | (N <= 0)
Errstr = ‘变换次数必须为正整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
D(1) =str2double(get(handles.edit2,‘String’));
D(2) =str2double(get(handles.edit3,‘String’));
Errstr = ‘’;
if isnan(D(1)) | ~(floor(D(1)) == D(1)) | (D(1) < 1)| (D(1)>255)
Errstr = ‘参数1必须为1至255正整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end
Errstr = ‘’;
if isnan(D(2)) | ~(floor(D(2)) == D(2)) | (D(2) < 1)| (D(1)>255)
Errstr = ‘参数2必须为1至255正整数!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end

if D(1) == D(2)
Errstr = ‘参数1与参数2必须不同!’;
end
if ~isempty(Errstr)
errordlg(Errstr);
return
end

⛄三、运行结果


⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]赵雨,杨真,雍江萍,展爱云,张跃进.基于混沌映射的图像加密算法研究[J].华东交通大学学报. 2022,39(06)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

【图像加密】基于matlab GUI正交拉丁方+二维Arnold置乱图像加密【含Matlab源码 813期】相关推荐

  1. 【图像加密】正交拉丁方+二维Arnold置乱图像加密【含GUI Matlab源码 813期】

    ⛄一.正交拉丁方置乱及二维Arnold置乱简介 0 引言 随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要.通常应用于数字图像通信的两种保护技术为: ...

  2. 二维 Arnold 的图像置乱加密及解密——Matlab实现

    二维 Arnold 的图像置乱加密及解密--Matlab实现 二维 Arnold 的图像置乱加密及解密(1):RGB图像的处理 基于Arnol变换的图像置乱 Arnold变换是俄国数学家Vladimi ...

  3. 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf

    二维有限体积法计算热传导及源码 //#include "stdafx.h" #include #include #include #include #include using n ...

  4. 【时钟识别】基于matlab GUI Hough变换指针式时钟识别【含Matlab源码 2085期】

    ⛄一.简介 1 仪表示数识别流程 基于刻度准确定位的指针式仪表示数识别方法包括预处理.指针检测.刻度定位.油位计表盘中心拟合与仪表读数计算5个部分.该方法无需预先添加任何表盘信息,算法流程如图2所示. ...

  5. 【数字信号调制】基于matlab GUI PCM编码和QAM调制系统【含Matlab源码 2080期】

    ⛄一.PCM编码+QAM调制简介 1 PCM 数字信号是对连续变化的模拟信号进行抽样.量化和编码产生的,称为PCM(Pulse Code Modulation),即脉冲编码调制. 脉冲编码调制就是把一 ...

  6. C++旋转二维MxN矩阵的算法(附完整源码)

    C++旋转二维MxN矩阵的算法 C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) #include < ...

  7. 【图像融合】基于matlab GUI高斯金字塔+拉普拉斯金字塔彩色图像融合【含Matlab源码 1506期】

    一.区域分割图像融合简介 图像的分解 对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解. 1 高斯金字塔分解 记源图像为G0,G ...

  8. 【车辆计数】基于matlab GUI背景差分法道路行驶多车辆检测【含Matlab源码 1911期】

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

  9. 基于java开发的健身器材电商管理系统.rar(含项目源码前后端项目)

    功能:健身器材信息管理.健身器材分类管理.公告管理.个人中心.订单管理.健身器材入库管理.健身器材出库管理.收获评价管理.系统管理等 前端页面展示 后端管理: 源码下载地址:>>>

最新文章

  1. wrs-arcface虹软人脸识别
  2. linux内存使用统计,Linux 中free命令检查内存使用情况
  3. Python代码提取时间序列特征基于tsfeature
  4. IntelliJ Idea 常用快捷键 列表
  5. [Apple开发者帐户帮助]八、管理档案(2)创建临时配置文件(iOS,tvOS,watchOS)...
  6. 修改hadoop中yarn的webui中显示的任务时间为中国时间
  7. 昆计计算机管理专修学院,昆明昆计高中的师资怎么样,学校是民办还是公办的...
  8. web2.0网站的四大特性简述
  9. 山东大学软件学院2022数据化企业期末复习总结
  10. 论文公式编号右对齐_毕业论文详细排版,看这一篇就够了!
  11. 网络表情NLP(一)︱颜文字表情实体识别、属性检测、新颜发现
  12. 看看淘宝的工程师如何评论12306
  13. kika平台广告sdk集成问题
  14. java使用nmap工具进行端口扫描,简单学习
  15. 寒假集训大作业(一)
  16. java怎么修改支付宝步数_支付宝怎么修改运动步数?刷步数最新方法
  17. Fragment的懒加载与生命周期详解
  18. 某移动端防作弊产品技术原理浅析与个人方案构想
  19. 【一头扎进JMS】(4)----RabbitMQ概述
  20. 程序员的数学【线性代数基础】

热门文章

  1. 图像特征(三)——纹理特征(GLCM、LBP)
  2. Kubernetes网络技术解析之Pod基于路由模式的通信实现
  3. 夜里的天空 是蓝色的吗?
  4. 天很蓝,应该不会下雨
  5. Scratch少儿编程案例-植物大战僵尸完整版
  6. 瞬变电磁检测原理和特点
  7. 瞬变电磁数据读取显示,正演计算,及基础处理DLL文件调用
  8. c语言求10000以内的质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  9. 51单片机 ADC0809模数转换与显示+Proteus仿真
  10. KVM-2、虚拟化基础