让我们来看看现代密码体系应用于图像加密,图像加密有两种,一种是confusion(改变像素位置),一种是diffusion(改变像素值)
AES介绍
全称:Advanced Encryption Standard,高级加密标准,属于对称加密算法
加密步骤一
将明文分组,每组长度相等,每次加密一组数据,加密完整个明文,在标准规范中,分组长度只能是128位,密钥长度为128位、192位或256位,由此有AES-128、AES-192、AES-256,AES的处理单位为字节
加密步骤二
我们按照密钥长度128位进行,针对每一组明文,加密过程中,会重复执行10次轮函数(最后一轮,不执行列混合)
加密步骤三
针对每组明文分组(128位-16字节),用以字节为单位的正方形矩阵描述,称为状态矩阵,我们上面提到的10次轮函数就是针对这个状态矩阵来进行操作,最后的结果为密文
例如明文分组为“abcdefghijklmnop”,我们与之对应生成的状态矩阵如下:
顺序为:从上到下,从左到右
类似地,我们采用的128位密钥也是类似同样的处理办法,只不过需要额外的处理和用途
加密步骤四
例如密钥现在是“abcdefghijklmnop”,按相同的处理生成同样的矩阵,不过这时我们需要根据此矩阵生成一个序列W[44]
该序列前4个元素为原始密钥
第1、2、3、4列生成W[0]、W[1]、W[2]、W[3],例如W[0]=”abcd”,W[0],W[1],W[2],W[3]是原始密钥,后面40个分为10组,每组4个分别用于之前所提10轮加密中的轮密钥加,后40个根据如下方法生成:
(i为第几个)
1.如果i不是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁W[i-1]
2.如果i是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下:
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
轮常量Rcon[j]是一个字
示意图:
加密步骤五
明文及密钥处理后,明文和原始密钥(W[0]、W[1]、W[2]、W[3])进行一次异或加密操作,后进行10次轮函数(第10次不执行列混合):
轮函数包括以下加密过程:
- 字节代换
- 行移位
- 列混合
- 轮密钥加
字节代换
字节代换本质上是一个查表操作,AES定义了一个S盒和一个逆S盒(解密时用)
状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出,产生一个新的状态矩阵。
行移位
行移位本质上是一个对行按一定规则的矩阵左循环移位操作
因为我们选取的是128位的密钥,按照规则是状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节。
列混合
注意,进行第10次轮函数时,不执行该操作
该操作执行的是状态矩阵与固定的矩阵相乘,得到一个新的状态矩阵
其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。
轮密钥加
像之前所说的对于密钥的处理所生成的10小组序列,在每一次进行轮函数时(进行10次轮函数),将状态矩阵与所对应的序列组进行逐位异或操作
使用openssl中的aes对图片进行加密
首先提出一个问题也是我最开始犯的错误:能直接对图像文件加密吗?
答案是不能,因为图像文件一般有对应的文件头,如果对整个文件加密,会导致文件不能被识别为图像文件,所以需要文件头信息与图像数据分开
测试文件如下:(1.bmp)
bmp文件是典型的位图格式,格式结构较简单,前54字节为文件头信息
环境:ubuntu16.0.4head -c 54 1.bmp > header.txt
这个命令就是将文件头信息输出到header文件中tail -c +55 1.bmp > body.bin
这条命令的意思就是从第55字节到文件末尾的数据输出到body文件中
然后使用ecb模式对数据进行加密openssl enc -aes-128-ecb -e -in body.bin -out body.ecb.bin -k 123456 -iv 0102030405060708
进行数据合并cat header.txt body.ecb.bin > test-ecb.bmp
结果如下:
我们发现效果不是很好,图片的大体轮廓还是可以看见的
接下来使用cbc模式进行加密,与ecb模式进行比较,并进行分析
ECB-CBC两种加密效果比较
使用ecb模式加密的效果并不好,接下来使用cbc模式:openssl enc -aes-128-cbc -e -in body.bin -out body.cbc.bin -k 123456 -iv 0102030405060708
进行数据合并cat header.txt body.cbc.bin > test-cbc.bmp
结果如下:
我们发现图片的轮廓已经基本上看不出来了,效果显著
那为啥这两种模式加密后的效果会差这么多呢?
其实比较好理解:
ecb中每块的加密是独立分开的,相同部分加密后得到相同结果,在图像中显得更为明显
图像加密的好不好,是由混论程度决定的,也就是我们常说的熵
一维熵
pi是指图像中灰度值为i的像素所占比例,越接近于8,代表效果越好
图像加密效果考量
像前面提到的熵是一种描述图像随即程度的方法,还有几种方法来考量图像的加密效果
视觉
视觉上出现像电视没有信号的那种均匀白雪花一样,其实就是灰度直方图分布非常均匀,与上面所说的熵接近于8类似
联系
选自论文A novel chaos-based bit-level permutation scheme for digital image encryption
加密前邻近像素之间一般联系度高,一个好的加密应该邻近像素之间联系减小
可以绘制相邻像素分布图,可以从水平、垂直和对角线三个方向分别进行绘制,比如从水平方向,找到图中任何两个相邻的像素作为二维图像中的一个点进行绘制
绘制的图形越接近一条y=x,说明像素之间关联度高,越分散,关联度低
如下图是从水平方向绘制的原图与加密后的分布图:
a是原图所绘制的分布图,b是加密后的图所绘制的分布图,加密前趋向一条y=x直线,加密后比较分散
另外一种度量方式,可以采用下述公式
该公式从上往下计算,依然适用于从水平、垂直和对角线方向上分析
例如水平方向,x、y指图像中任意一对水平相邻的像素,N指所有的相邻对数
rxy越趋近于0代表越不相关
AES用于图像加密简单思考
图像数据量大,冗余度高,并且各块之间相关性强,这是图像加密必须要考虑到的问题,aes用于图像加密,如果单纯把图像像素逐行拼成字节,效率会比较低,所以需要改进和优化
改进和优化
在ECB模式中,相同模块会加密成相同结果,但是又因为ECB可以并行,所以为了克服这个限制,直接的方法就是让相同的部分变得不同
先压缩图片后进行加密
在两篇论文中对其有所探讨
The Five Modes AES Applications in Sounds and Images
Image Observation on the Modified ECB Operations in Advanced Encryption Standard
需用校园网或挂学校vpn访问,感谢学校!
加密前先压缩,压缩后相同部分就没了,而且速度要比直接加密要快
选自论文图片:
可以看到因为尺寸减小,速度也并没有因为增加了压缩过程而减慢
在相同部分添加数字序列
Image Observation on the Modified ECB Operations in Advanced Encryption Standard
在这篇论文中提到,首先生成三个数字序列可以分别与明文异或后再加密
三个数字序列有:
- Arithmetical sequence:计数器产生,Tj=IV+j for j=1…n
- Arithmetical series:累加器产生,Sj=IV+∑ j for j=1…n
- Random sequence:与CFB模式相同
IV是一个初始向量,initial vector
Tj模式很类似于CTR模式,只不过CTR模式先将数字序列串加密后再与明文异或
Tj是顺序连续的,Sj非序列性
这样对明文进行操作的话,会使明文中相同的部分变得不同
与Arnold变换相结合
将图片先采用Arnold置乱后加密
参见此篇论文Chaotic and AES cryptosystem for satellite imagery
论文作者先对图片使用Arnold置乱后,然后采用chaotic henon map生成密钥
DCT压缩与调整行移位变换
参见论文Security of Image in Multimedia Applications
DCT压缩(离散余弦变换)
调整行移位变换
在传统的AES中,按照规则是状态矩阵的第1行左移0字节,第2行左移1字节,第3行左移2字节,第4行左移3字节,论文作者所做的改变是:
首先判断像素[0][0]是偶数还是奇数
如果是奇数:第一行与第三行不变,第二行左移1字节,第四行左移3字节
如果是偶数:第一行与第四行不变,第二行右移3字节,第三行右移2字节
作者只是通过实验说明这样更安全,没有解释为什么
修改S盒
参见论文Gray S-box for Advanced Encryption Standard
S盒是需要精心设计的,需要综合的代数知识