论文链接
序言部分主要讲的是本文提出了一种新的基于现代密码学的遗传机制方面的“选择—交叉—变异”结构,主要着眼于遗传算子的构建。生成混沌序列的方式采用交织Logistic 映射。主要的方法就是把需要加密的图像的每个元素看成一个个体,然后用遗传算法对其进行选择 、交叉、变异的操作。
这一部分首先讲了现在这个世界是个高度信息化的世界,所以图像加密很重要。
接着文章对现有的一些加密技术做了一些总结,并提出了一些弊端。所以作者提出了这种基于遗传算法的一种图像加密技术。
遗传算法故名思义,就是模拟生物进化过程中的遗传现象的一种算法。主要就有三个过程:选择(基因复制)、交叉(重组)、变异。这三个过程也就是所谓的三个遗传算子,每个遗传算子都需要我们进行良好的设计才能很好的解决许多具体的问题。
本文陈述的重点不是在遗传算法上,而是在于给出在设计出好的遗传算子的经验上。
选择也就是在亲本群体中选择个体。你可以理解成就是从你父母的那一代人中选出你们这一代人。怎么来选择呢?本文采取的方式是随机选择,这种方法随机的配对不同的个体。
交叉算子是用来产生新的个体的,也就是用刚刚选择出来的配对的个体,让他们的基因相互交叉重组,从而产生新的个体。例如你有两个1,我有两个0,我们一交换,都变成了01,01就是一个新的个体。
1. 单点交叉
选取配对的个体中的单个点的基因进行交换产生新的个体。
比如有两个个体 A = 1001 1001; B = 0100 1101
对这两个个体进行单点交叉,假设取第四个点,那么得到的结果是:
A’ = 1000 1001; B’ = 0101 1101
简单来说就是A对B说我拿我第四位置的1想跟你第四个位置上的0换,你换不换?B说换就换呗,然后就换了,换完之后A就不是原来的A了,B也不是原来的B了。
2. 多点交叉
选取配对的个体中的多个点的基因进行交换产生新的个体。
3. 均匀交叉
均匀交叉引入了一个掩码的概念,你可以吧掩码理解成是产生新个体的命令或者规则
比如A = 001111; B = 111100,mask_word(掩码)= 010101
怎么产生A的孩子A’呢?A对孩子A’说,你看着掩码,看到0你就继承我的优点,看到1你就继承B的优点,然后A’就照做,掩码第一位是0,它第一位就取了A的第一位基因;掩码第二位是1,它第二位就取了B的第二位基因。就这样得到了A’的前两位:01,以此类推最后得到A’ = 011110; B’=101101.
变异算子对应的就是生物学中变异的现象,他对于产生新个体来说只是一种辅助的手段,毕竟生物学上的变异发生的概率其实并没有那么大的。变异算子有许多种方法,下面只介绍一种基本的方法:
1.对每个个体的基因进行随机选择,选择出准备进行变异操作的基因
2.采用非运算进行变异操作。也就是0变成1,1变成0。
这个方法在这个论文中被用作随机的选择个体。这个方法基于概率统计学,它使用随机数解决了许多计算的问题。
了解过混沌学的人应该都知道Logistic混沌映射这个最最基础的映射,它的表达式很简单:
x n + 1 = μ x n ( 1 − x n ) ( 1 ) x_{n+1} = \mu x_n(1-x_n) \ \ \ \ (1) xn+1=μxn(1−xn) (1)
μ \mu μ的取值范围是(0,4)在大概大于3.6时产生混沌现象,产生的 x n x_n xn的范围在(0, 1)
Logistic映射的缺点:
稳定窗口、空窗、分布不均匀、密钥安全性弱。
这里的稳定窗口我没太理解他为啥是缺点,但是空窗可能就是混沌空间中的空白太大,而分布不均匀也可以在原文的图上看到,密钥安全性弱主要是密钥空间小,说白了就是密钥的组合数太少,容易被破解。
这个就是这个论文使用的混沌映射,也可以说就是改进加强版本的Logistic映射,公式如下:
x n + 1 = [ μ × k 1 × y n × ( 1 − x n ) ] m o d 1 x_{n+1} = [\mu \times k_1 \times y_n \times (1 -x_n)]mod 1 xn+1=[μ×k1×yn×(1−xn)]mod1
y n + 1 = [ μ × k 2 × y n + ( z n + 1 ) / ( 1 + x n + 1 2 ) ] m o d 1 y_{n+1} = [\mu \times k_2\times y_n + (z_n +1) /(1+x_{n+1}^2)]mod 1 yn+1=[μ×k2×yn+(zn+1)/(1+xn+12)]mod1
z n + 1 = [ μ × ( x n + 1 + y n + 1 + k 3 ) × s i n ( z n ) ] m o d 1 z_{n+1}=[\mu \times(x_{n+1}+y_{n+1}+k_3)\times sin(z_n)]mod 1 zn+1=[μ×(xn+1+yn+1+k3)×sin(zn)]mod1
0 < μ ≤ 3.999, |k1| > 33.5, |k2| >37.9,|k3| > 35.7
以上的公式记作公式(2)
这个映射原文中 y n y_n yn的式子有点小问题,我在这里做了更正。
这个映射的性能很好,李雅普诺夫指数也很高。
在现存的许多图像加密的系统中,都有着这样两个步骤:置乱和扩散,事实证明这两步对于图像加密的效果是十分明显的。本文提出的这个“选择—交叉—变异”结构,也可以看成是这两步,选择和交叉代表了置乱这一步,而变异则是扩散这一步。
对于一张M × \times ×N的图像P,我们把他的每一个像素都当成一个个体,然后进行遗传算法的操作。
在选择阶段,我们采用蒙特卡罗方法来选择个体。在交叉阶段我们用上文提到过的一些方法对所选个体的基因进行交叉。最后变异阶段再对个体进行一些改变。
具体步骤如下:
第一步:
先上公式:
x 0 ′ = x 0 − ( δ / 1 0 14 − [ δ / 1 0 14 ] ) / 1 0 2 ( 3 ) x_0' = x_0 -(\delta/10^{14}-[\delta/10^{14}])/10^2 \ \ \ (3) x0′=x0−(δ/1014−[δ/1014])/102 (3)
这一步的目的主要是通过这个公式得到产生混沌序列的Logistic映射的初始值 x 0 ′ x_0' x0′和 x 0 ′ ′ x_0'' x0′′,之所以要得到 x 0 ′ , x 0 ′ ′ x_0',x_0'' x0′,x0′′,是因为他们是与我们要加密的明文图像是有关系的。
公式中的 x 0 x_0 x0在本文中使用的值为0.36, δ \delta δ是原始图像所有像素的灰度值之和,这样我们利用了公式(3)计算出来了 x 0 ′ x_0' x0′,接着让 δ = 2 δ \delta=2\delta δ=2δ,带回(3)计算出 x 0 ′ ′ x_0'' x0′′,将 x 0 ′ x_0' x0′和 x 0 ′ ′ x_0'' x0′′作为交织的Logistic映射的初始值。
原文中所使用的初始值的表如下:
第二步:
这一步进行的是选择操作,怎么选择呢?其实就是得到两个个体的坐标。
首先我们通过 x 0 ′ x_0' x0′作为初值(其他两个初值为 y 0 y_0 y0、 z 0 z_0 z0,在上面的表格中有)的交织Logistic映射产生混沌序列 ( u 1 , u 2 . . . u M N ) (u_1,u_2...u_{MN}) (u1,u2...uMN),再通过交织序列产生混沌序列 ( v 1 , v 2 . . . v M N ) (v_1,v_2...v_{MN}) (v1,v2...vMN),这里要强调的是,交织的Logistic 映射一次是可以 产生三个混沌序列的,我们这一步取其中的两个就可以(方便起见可以就直接取前两个)。
因为产生的混沌序列都是小数,还不能作为坐标,我们通过下面的式子将他转换为 x , y x,y x,y坐标:
u i = ( u i × 1 0 14 ) m o d M + 1 u_i =(u_i\times10^{14})modM+1 ui=(ui×1014)modM+1
v i = ( v i × 1 0 14 ) m o d N + 1 v_i =(v_i\times10^{14})modN+1 vi=(vi×1014)modN+1 (4)
这个式子中的M,N就是图像的宽和高, u i u_i ui和 v i v_i vi都是大于1的。
就这样,我们选择 p i j p_{ij} pij为第一个个体,选择 p u i v i p_{u_iv_i} puivi为与它配对的第二个个体。
第三步:
这一步当然要进行的就是交叉操作,对第二步得到的两个个体(实际就是两个像素的灰度)进行交叉。交叉的方法之前提过,这里直接采用个最简单的方法,就是把基因从中间劈成两半,然后两个个体交换后一半,就产生了两个新的个体: p i j ′ p_{ij}' pij′和 p u i v j ′ p_{u_iv_j}' puivj′。这里的 i i i是从1到M, j j j是从1到N。
因为图像像素的灰度(也就是我们的个体)是个8位的整型,所以就是把一个8位中间劈开,后四位进行交换即可。
这一步其实就是变异的操作,也就是对上一步产生的 p i j ′ p_{ij}' pij′进行变异操作。首先我们用 x 0 ′ ′ , y 0 , z 0 x_0'',y_0,z_0 x0′′,y0,z0作为初值通过交织Logistic 映射产生一组序列(选择三组中的一组就行),这个序列记作: ( w 11 , w 12 . . . w M N ) (w_{11},w_{12}...w_{MN}) (w11,w12...wMN)。接着引入一个公共变异码(Common Mutated Word)的概念,缩写就是CMW,如果你还记得那个初始值的表,一定会知道这里作者选择的初始值为100,接着就是套用下面公式的事情了:
w i j = ( w i j × 1 0 14 ) / 256 w_{ij}=(w_{ij}\times10^{14})/256 wij=(wij×1014)/256
c i j = p i j ′ ⊕ w i j ⊕ C M W c_{ij}=p_{ij}'\oplus w_{ij}\oplus CMW cij=pij′⊕wij⊕CMW
C M W = c i j CMW=c_{ij} CMW=cij
其中 ⊕ \oplus ⊕代表按位异或的意思,这样变异接受得到的 c i j c_{ij} cij就是最终的加密图像。
论文剩下的部分就是分析性能的部分了,在这里就不做笔记陈述了。话说原文好像并没有写如何解密,后面我会用实际的代码验证一下。