对于多媒体信息,尤其是图像和声音信息,传统的加密技术将其作为普通数据流进行加密,而不考虑多媒体数据的特点,因此有一定的局限性。所以,在信息领域急切希望拥有更加安全、方便、有效的信息保护手段。那么,我们今天就来看看用用VC++是如何实现数字图像迭代混沌加密的。

一、混沌及加密原理

1、混沌概述

现代意义的混沌起源于20世纪60年代。混沌是一种复杂的动力学行为,按混沌定义可以有不同的分类方法,按照动力学系统的性质,可以分为四种类型,第一类为时间混沌,第二类为空间混沌,第三类为时空混沌,第四类为功能混沌。

混沌现象是在非线性动力学系统中出现确定性的、类随机的过程,这种过程非周期、不收敛但有界,并且对初始状态具有极其敏感的依赖性,即初始状态只要有微小的差别的两个同构混沌系统在较短的时间后就会产生两组完全不同的、互不相关的混沌序列值。混沌信号具有天然的随机性,特别是经过一定处理后的混沌信号具有非常大的周期性和优良的随机性,完全可以用来产生符合安全性要求的序列密码。

更重要的是,混沌系统对初始值和参数的敏感性,可以提供数量很多的密钥。所以,从以上的特点可以说明混沌系统可以用来产生序列密码。经过合理设计的混沌密码加密算法可以形成非常简单的设计形式。

2、 Logistic映射

Logistic映射模型是混沌模型中比较简单的一种,它起源于一个经典问题——虫口模型(worm number)。

用VC++实现数字图像迭代混沌加密方法

方程式(1)是原始的虫口模型方程,体现了两代虫子的数量关系。将此方程推导一下,可以得出如下方程:

用VC++实现数字图像迭代混沌加密方法 由方程式(2)可以清楚地得到第n代虫子和第0代虫子的数量关系,但是从中可以看出此方程不能表现自然的虫子变化关系,因为虫子的增长变化不是恒定的,因此这个线性模型完全不能反映虫口的变化规律。

所以考虑到很多负面影响:如虫子太多时,由于食物有限和生存空间有限,还由于疾病等多种原因,使得虫口数目减少,因此,经过数代人的努力提炼出了Logistic方程:

用VC++实现数字图像迭代混沌加密方法 要此Logistic方程产生混沌的效果,根据研究,a的取值范围应该在(3.5699,4)之间。在接近4的范围内产生的混沌序列的随机性比较好。

3、基于Logistic方程的混沌加密设计

假设{ Pn}是明文信息序列,{Kn}是密钥信息序列,{Cn}是密文信息序列。

基于混沌的加密算法设计为:

用VC++实现数字图像迭代混沌加密方法

基于混沌的解密算法设计为:

用VC++实现数字图像迭代混沌加密方法
本系统采用Logistic映射模型方程作为混沌源,其中的a和Yo作为方程的初始系数,也是我们这个混沌加密系统的加密密钥。

基于Logistic映射的数字图像混沌迭代加密算法描述如下:

(1)打开一个BMP图像文件;

(2)顺序读取图像中的像素信息P;

(3)根据Logistic映射方程,输入密钥[ak,yk],连续生成8个位,组成一个字节chaos。

for(i=O;i<8;i++)

{//LoSistic方程

if(Xi>a/6){chaos= (chaos<<1)|1;}else{chaos=chaos <<1;}

(4)混沌序列产生的字节与图像像素进行异或操作:

C=P Xor chaos,获得密文C;

(5)输入下一个密钥[ ak+1,yk+1],转至(3)进行计算。直到没有密钥。

(6)保存密文C到新的文件中;

设有m个密钥,此算法中的密钥量为{[ao,Yo],[a1,y1],…[ am-1,ym-1]},这种设计上增加密钥量来增加图像保密的安全性,由于混沌系统对初始值和参数的敏感性,可以看出,这种增加密钥量的方法是一种有效而更加安全的设计。

用VC++实现数字图像迭代混沌加密方法

上图中图像文件加密所使用的密钥为{[4,0.6],[3.999,0.8],[3.7,0.7],[3.888,0.6]},可以看出,经过迭代加密后的数字图像可以说是完全失去了原图像的信息。

对加密后图像的解密步骤和加密步骤是一样的,只要把密钥的输入方向反向,就可以对加密后的图像进行解密。

2、混沌加密实例函数实现

下面代码ChaosEncode()是用于混沌加密和解密的函数,其中lpDIBBits指向原DIB图像指针,IWidth是原图像宽度(像素数),IHeight是原图像高度(像素数),Xstart和a是输入的密钥变量:

用VC++实现数字图像迭代混沌加密方法

ChaosEncode()函数既可以作为加密函数也可以做为解密函数,以上我们设计的这个加密算法是一种对称加密算法。

三、混沌加密安全性分析

因为混沌系统对初始值和参数的敏感性,只要有非常微小的差别,两个同构混沌系统在较短的时间后就会产生两组完全不同的、互不相关的混沌序列值。根据上面的加密算法我们用一个密钥K1[4,0.6]进行加密,后用K2[3.999999999999999,0.6]进行解密。如图所示。

1c 图像的密钥第一个参数相差10的-15次方的情况下,得不出原来的图像,那么在计算机的位数允许情况下可以拥有很多不同的密钥。密码的分析者和攻击者在如此的情况下,要花费的分析量和攻击量是很大的。而且破译者无法根据截取密文去重构产生序列密码的混沌系统的动力学模型、初始状态等。这对保密是很有利的。

增加了密钥的基于Logistic映射的混沌序列密码加密算法比单个密钥的基于Logistic映射的混沌序列加密算法有更好的安全性能。因为前者的密钥量大,有m个参数和m个初始状态,而后者只有1个参数和1个初始状态。它的量化过程是不可逆的,这个特点对安全性非常有利,因为破译者无法根据截取密文去重构产生序列密码的混沌系统的动力学模型、初始状态等。此外,Logistic映射的加密系统具有很好的运算速度。因此,在实时性要求高的情况下可以采用LogisLic映射的混沌加密方案。和现有的序列密码加密方法相比,基于混沌系统的序列密码加密方法可以说是一种安全、有效的加密方法。

小知识之VC++

Microsoft_Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C++ 2012。