基于MATLAB的混沌密码与数字图像加密应用、信息隐藏

本文介绍了一种基于MATLAB的Logistic混沌模型用于图像加密的方法,包括混沌的定义、Logistic混沌模型的原理,以及加密、解密的步骤。实验展示了加密前后图像的对比,证实了加密的有效性。同时,提到了C语言实现混沌效应的代码示例,以及信息隐藏技术在文件加密中的应用。

基于MATLAB的混沌密码与数字图像加密应用、信息隐藏

实验目的:利用Matlab软件基于Logistic映射的加密算法对图像进行加密和解密,以及利用DEV C++软件、Excel表格绘制图像基于Logistic映射的算法产生的混沌现象。理解Logistic加密算法,掌握加密过程。

一、实验原理

1.混沌的定义

混沌(Chaos)是非线性确定性系统中具有的内在随机现象,具有运动轨迹的不可预测性、对系统初值和控制参数的敏感性以及运动轨迹的遍历特性等。

第一种定义是基于混沌的“蝴蝶效应”,即倘若一个非线性系统的行为对初始条件的微小变化具有高度敏感的依赖性,则称混沌运动。这就是说,一个系统的混沌行为对初始条件的变化具有高度敏感性,表现出极端的不稳定性。这种高度不稳定性,是指在相空间内初始极其邻近的两条轨道,随着时间的推进,两条轨道的距离彼此以指数形式迅速分离而永不相遇,它们的行为具有局部不稳定性。

第二种混沌定义是基于Li-Yorke定理,从数学上严格定义。Li-Yorke定理为:设f(x)是[a,b]上的连续自映射,若f(x)有3个周期点,则对任何正整数n,f(x)有n周期点。混沌定义如下:闭区间I上的连续自映射f(x),倘若满足条件,则一定出现混沌现象:

(1)f周期点的周期无上界;

(2)闭区间I上存在不可数子集S。

2. Logisitc 混沌模型

由于混沌系统具有伪随机性、不确定性和对初始条件与系统参数的极为敏感性,其自身的动力学特性使混沌现象天生具备了应用于保密安全的条件,在图像加密领域表现出良好的应用前景。Logistic混沌系统有一个自变量,是一维混沌系统。含有两个自变量的混沌系统是二维的,含有三维系统及多于三维的混沌系统是高位混沌系统。Logistic混沌系统由下式给出:


v2-14c59d441fec7fd6d4654d833a9aaf91_b.jpg

,n=1,2,…… (1)

研究表明,式(1)这个看似极为简单的方程当参数λ变化时有极复杂的动态行为。当0<λ≤3时,该模型性态简单;当3<λ≤3.75时,系统处于倍周期状态;当λ>3.57时,系统处于混沌状态。

二、实验步骤

下面以一副256×256的图像test.gif 为例,利用MATLAB软件进行图像加密,加密程序如下:

%混沌加密Logisitc加密算法,图片像素为256*256,可直接放在work子文件夹中

clc;

clear all;

global M;

global N;

global Ximage;

global Yimage;

global sy;

Ximage=double(imread('test.gif'));

key1=0.1;

key=4;

[M,N]=size(Ximage);

figure(1)

imshow(Ximage,[]);

Ximage=double(Ximage);

for(i=1:M)

for(j=1:N)

key1=key*key1*(1-key1);

a(i,j)=key1;

end

end

key2=0.2;

for(i=1:M)

for(j=1:N)

key2=key*key2*(1-key2);

b(i,j)=key2;

end

end

x=0.4*a+0.6*b;

e=round(x*256);

tt=0.01;

Yimage=tt*Ximage+(1-tt)*e;

figure(2)

imshow(Yimage,[]);

figure(3)

imhist(uint8(Ximage));

title('原图像的直方图');

figure(4)

imhist(uint8(Yimage));

title('加密之后的直方图');


%%置乱度分析

Yimage=double(Yimage);

sx=sum(sum((Ximage-256*rand(M,N)).^2));

DD=sy/sx %置乱度

global M;

global N;

global Ximage;

global Yimage;

key1=input('请输入密钥key1:');

key=4;

for(i=1:M)

for(j=1:N)

key1=key*key1*(1-key1);

a(i,j)=key1;

end

end

key2=input('请输入密钥key2:');

for(i=1:M)

for(j=1:N)

key2=key*key2*(1-key2);

b(i,j)=key2;

end

end

x=0.4*a+0.6*b;

e=round(x*256);

tt=0.01;

Zimage=(Yimage-(1-tt)*e)/tt;

figure(5)

imshow(Zimage,[]);


加密过程:

  1. 首先将要加密的图片test.gif保存在d盘中,如下图1所示:


v2-e99f18d5238e0ba3ef8de7a1ada7d098_b.jpg


图1存在d盘中的test图片

  1. 打开Matlab软件并把上面的加密程序输入软件环境窗口,如下图2所示:


v2-37d4795e9e76c3918669e1c803ae02b7_b.jpg


图2在Matlab中输入的编程

  1. 程序输入完成后,按回车键,程序会运行得出5张图片,分别为加密前的原图和加密后的图片、加密前的直方图和加密后的直方图。如下图3、图4、图5、图6所示:


v2-301dffd7038f720f5c9fce9b8a257620_b.jpg


图3加密前的原图


v2-96fe05039a685ff6bc8bdefb7baa2937_b.jpg


图4加密后的图片


v2-796ecee6bf02004c25982fc6f5773a01_b.jpg


图5加密前的直方图


v2-1a2241684ecebe2c68bde41a5ea4c6ab_b.jpg


图6加密后的直方图

说明:加密后的灰度直方图分析可以用来衡量加密算法的扰乱性。上图3、图4、图5、图6是加密前后的图像以及它们的直方图的对比。可见,加密后的直方图呈均匀分布,未保留任何明文信息。图6加密后的直方图的图像越均匀说明混沌效应越好,上图6总体上来说是均匀的,只是在编程的时候考虑的只是黑白色的点,所以直方图看起来全部的点不是绝对的均匀。

解密过程:

⑦如果想得到原图(解密),必须在MATLAB界面窗口输入两个密钥, “请输入密匙key1:0.1 请输入密匙key2:0.2”; 如下图7所示:


v2-0708817a3428092cc19ce0057848d06d_b.jpg


图7解密之后得到的原图

从上图可以看出,加密后的图像没有留下原图的痕迹,而解密后的图像看不出差别,此方法加密效果良好。

换一副带有彩色256×256的图像111.gif 为例,利用MATLAB软件进行图像加密,加密程序跟上面的差不多,只是把图片名称改了,步骤以上的也一样如下所示:

  1. 把修改图片名称后的程序输入Matlab软件中,如下图8所示:


v2-40c666a0ecb51644fb036a55a5346b1e_b.jpg


图8修改图片的名称

  1. 运行之后得出来的结果如下图9、图10、图11、图12所示:


v2-53cba41a6a0ab1315b46c8dcd0a9cd99_b.jpg


图9加密的原图



v2-749962a317403e29ce99927b706f952d_b.jpg


图10加密后的图


v2-f1a20c914cb76251a118ef0f7fcba2b4_b.jpg


图11 加密前的图像直方图


v2-c7916ec7b6782d47bcfa867853efbe92_b.jpg


图12加密后的图像直方图


v2-b376a63be8fc6cabaea6eb7f4a411e93_b.jpg


图13解密后的到的图像

说明:由上图9、图10、图11、图12、图13可知,彩色图片加密后的图片跟原先用的黑白图片加密的图像一样都是由黑白的点组成的。而且彩色图片加密后的图像直方图总体上来说也是符合混沌效应现象的。



C语言代码实现混沌效应,加密程序如下:

//简单模拟LOGISTIC模型C++源程序

#include<iostream>

#include<math.h>

#define N 300

using namespace std;

void fun(float x0,float u,int k,float result[])

{ int i=0;

float temp_1,temp_2,temp_3;

temp_1=x0;

while(k)

{

result[i++]=temp_1;

temp_2=1-temp_1;

temp_3=u*temp_1;

temp_1=temp_2*temp_3;

k--;

}

}

int main()

{

int i,k;

float x0,u,*result,*ratio,sum=0.0,ave,s=0.0,st;

cout<<"How many logistic sequence do you wanna output?"<<endl;

cin>>k;

while(k<1||k>N)

{

cout<<"Input a positive integer from 1 to "<<N<<":"<<endl;

cin>>k;

}

result=new float[k];

ratio=new float[k-1];

cout<<"Input a float value between 0 and 4 :"<<endl;

cin>>u;

cout<<"Input a float value between 0 and 1 :"<<endl;

cin>>x0;

fun(x0,u,k,result);

for(i=0;i<k;i++)

{

cout<<result[i]<<endl;

}

}

  1. 据老师提供的C语言代码,为了方便后续的数据统计工作,进一步更改代码的输出格式,然后把修改后的代码输入DEV C++软件环境窗口中。如下图1中绿色圈圈所示:


v2-abe2a35ef0ae4c40a9464c5c9e4efee3_b.jpg


图1修改输出语句后的代码

  1. 然后点击编译并运行按钮,在弹出来的窗口中输入你想要的数据数量100、λ的取值(λ≥3.57)3.59还有初始值0.23456,并回车后得出数据。如下图2所示:


v2-0fdcc61004bdbdb244fdf2af2928cc7b_b.jpg


图2运行得出的数据

  1. 接下来把得出的数据复制到Word文档中并绘制成表格的形式以便导入Excel中统计数据。如下图3所示:





v2-fa4a6097adb17b8e0d9a53fe27ccb8fc_b.jpg


图3通过拷贝在Word中的数据

  1. 然后再利用复制、粘贴功能把数据导入Excel中,并绘制折线图,观察混沌效应。如下图4所示:


v2-e4bbbd2c189bcb62a05b6f7b1f17da11_b.jpg


图4Excel中的数据与绘制的折线图

说明:从图4折线图中可以看出图像中点的分布总体上是满足混沌现象的。

二、实验原理(信息隐藏)

1.数字信息隐藏技术已成为信息科学领域研究的一个热点。被隐藏的秘密信息可以是文字、密码、图像、图形或声音,而作为宿主的公开信息可以是一般的文本文件、数字图像、数字视频和数字音频等。

2.信息隐藏系统的模型可以用下图1-1来表示。我们把待隐藏的信息称为秘密信息,它可以是版权信息或秘密数据,也可以是一个序列号;而公开的信息则称为宿主信息,如视频、音频片段等。这种信息隐藏过程一般由密钥来控制,通过嵌入算法将秘密信息隐藏于公开信息中,而隐蔽宿主则通过通信信道传递,然后对方的检测器利用密钥从隐蔽宿主中恢复/检测出秘密信息。

密钥

密钥




秘密信息

隐蔽宿主

秘密信息

宿主信息

检测器

宿主信息

编码器


图1-1 信息隐藏系统模型

由此也可以看出,信息隐藏技术主要有下述两部分组成:

  1. 信息嵌入算法(编码器),它利用密钥来实现秘密信息的隐藏。
  2. 隐藏信息监测/提取算法(检测器),它利用密钥从隐藏宿主中检测/恢复出秘密信息。在密钥未知的前提下,第三者很难从隐藏宿主中得到或删除,甚至发现秘密信息。

实验步骤如下:

  1. 利用Easycode Boy Plus加密工具对文件进行加密、解密(可对多个文件进行加密):
  2. 首先打开Easycode Boy Plus加密工具实验环境窗口,然后点击加密命令把需要的加密文件添加到其中,并输入密码,确认密码,然后点击开始加密,最后会弹出加密成功的窗口,如下图1所示:


v2-ae450c84466e8f8b22836edfa588fd2c_b.jpg

图1对文件加密成功

  1. 接下来对刚刚加密的文件进行解密。只要记住刚刚在加密时候设立的密码就可以进行解密,同样的在Easycode Boy Plus加密工具实验环境窗口点击解密命令,把要解密的文件拖入其中,并输入加密时设的密码,点击开始解密命令即可,如下图2所示:


v2-a93f7349ac3b7593a30f9a40a02488c0_b.jpg


图2解密成功

  1. 利用Easycode Boy Plus加密工具将文件编译为EXE自解密文件:
  2. 在Easycode Boy Plus加密工具实验环境窗口点击编译EXE命令,选择“将文件编译为EXE自解文件”按钮,并把要编译的EXE文件添加在其中,输入密码,确认密码,然后点击开始编译/加密命令即可,如下图3所示:


v2-c5cd1e948edc5ab0c380c945da4cf0fa_b.jpg


图3加密成功


  1. 现在已经很明显的发现文件已成了应用程序,并在打开的时候要要输入之前设的密码,然后勾选解密后删除自解文件即可自解密并得到原来的文件类型,如下图4、图5、图6所示:


v2-535be6d9c9de01c44214d6c4ab9ff256_b.jpg


图6解密过程


v2-5e8dd1e57eb67ba290d18382dc50e5e1_b.jpg


图7自解密完成


v2-d6ca41a899ddcf9934a6345f856a3b7e_b.jpg


图8得到原来的文件类型

说明:根据多次实验得出对EXE文件加密保护以及去除EXE文件密码保护或自解密壳操作步骤其实是差不多的。

  1. 利用Easycode Boy Plus加密工具对文件进行嵌入:
  2. 以下是两张不同格式的图片,把静态图(左)嵌入动态图(右)中,如下图1所示:


v2-9b7fc77754de1f6ae3d632042b9cbbbe_b.jpg


图1嵌入之前的原图

  1. 在Easycode Boy Plus加密工具实验环境窗口点击文件嵌入按钮,并把静态图拖入作为记住文件,把动态图拖入作为嵌入文件;并设置密码,确认密码,然后点击嵌入文件命令即可嵌入成功,并发现嵌入文件(动态图)通过我们的肉眼看不出有什么变化,如下图2、图3所示:


v2-a6f75d12ec0123d5a8dae2ebd12c755f_b.jpg


图2信息隐藏成功


v2-83e9563f1c0b0045393088a036e0d345_b.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值