《信息隐藏》课程中实现的基于2D-FFT的变换域信息隐写,希望对你的课设或者项目有所帮助
摘要 本文提出一直基于FFT变换域的信息隐写,包括图片水印抗攻击的嵌入隐写、基于Logistics图像混沌加密以及AES加密文件流的信息隐写。其中加密过程的Logistics密钥流用于图像加密,AES密钥用于加密文件比特流信息。实验结果显示,该算法中分别兼顾了安全性、隐蔽性以及鲁棒性的需求,可针对不同应用场景灵活使用。
关键词:FFT;图像加密;信息隐写;Logistics;AES
信息隐藏是自20世纪90年代开始便一直发展至今的一种新兴技术,而有关图像的信息隐写术是它的其中一个分支。鉴于人们对混沌系统的研究,利用它典型的遍历性、随机性的特征可以在图像加密的领域产生很好的效果。傅立叶变换产生一个复数值输出图像,该图像可以用两个图像显示,要么带有实部和虚部,要么带有幅值和相位。在有关FFT傅里叶变换的图像处理中,通常只显示变换幅度,因为它包含了空间域图像载体所在几何结构的大部分的重要信息。若我们想在频域中进行一些特殊处理后将傅立叶图像重新转换到正确的空间域,需要保留傅立叶图像的幅度和相位。傅里叶域图像的范围比空间域中的图像大得多。因此,为了足够准确,它的值通常被计算并存储在浮点值中。AES加密标准又称为高级加密标准,是美国的国家标准技术研究所NIST旨在取代DES的21世纪的加密标准,后经常被利用在文件加密等相关方面。
文章目录
一、主要算法介绍
1.1、FFT简介
傅立叶变换是一种重要的图像处理工具,用于将图像分解为其正弦和余弦分量。变换的输出代表傅立叶或频域中的图像,而输入图像则是等价的空间域。在傅立叶域图像中,每个点代表空间域图像中包含的特定频率。傅立叶变换用于广泛的应用,例如图像分析、图像滤波、图像重建和图像压缩。
1.2、FFT在图像处理上的具体实现
DFT 是离散傅立叶变换,不包含形成图像的所有频率而是以采样的形式,并且仅包含足够大以完整描述空间域图像的一组样本。频率数对应于空间域图像中的像素数,即空间域和傅立叶域中的图像大小相同。
对于大小为 N×N 的正方形图像,二维DFT由下式给出:
其中f(a,b)是空间域中的图像,公式中指数项是傅立叶空间中每个点F(k,l)对应的基函数。该方程可以理解为:每个点F(k,l)的值是通过将空间图像与相应的基函数相乘并求和得到的。
基函数是频率增加的正弦和余弦波,即 F(0,0)代表图像的 DC 分量,它对应于平均亮度,而F(N-1,N-1)代表最高频率。
以类似的方式,傅立叶图像可以重新转换到空间域。傅里叶逆变换由下式给出:
其中 是逆变换中的归一化项,这种归一化有时应用于正向变换而不是逆变换,但不应同时用于两者。为了获得上述等式的结果,必须为每个图像点计算双倍值。然而因为傅立叶变换是可分离的,它可以写成
使用这两个公式,首先使用N 个一维傅立叶变换将空间域图像转换为中间图像。然后将该中间图像转换为最终图像,再次使用N 个一维傅立叶变换。用一系列2N一维变换表示二维傅立叶变换减少了
傅立叶变换产生一个复数值输出图像,该图像可以用两个图像显示,要么带有实部和虚部,要么带有幅值和相位。对图像进行傅里叶变换,是将图像信号变换到频域进行分析,它不仅反应图像的灰度结构特征,而且能使快速卷积、目标识别等许多算法更加易于实现
1.3、程序实现
本程序采用C#算法实现,关键步骤在于如何将水印图片嵌入到载体图像的傅里叶系数中去,下面给出具体实现细节。
由于图像在经过2D-FFT变换后的图像包含所有频率的分量,但它们的幅度随着频率的升高而变小。因此,低频比高频包含更多的图像信息。傅立叶图像中有两个主要的分布:一个垂直穿过中心,一个水平穿过中心,这是由载体图像中图案的规则决定的。
图B是载体图像A经过2D傅里叶变换后的频谱分布图,中心是低频系数,角落是高频系数。主要思想是先将水印图像的系数提取出来,然后替换到载体图像频谱分布图的高频系数区域,然后将该载体频谱图进行2D傅里叶后变换回原来的原始图像。因此至于如何嵌入,即嵌入的规则也同时决定了图像提取的方法
图C是嵌入前的载体图像的傅里叶系数频谱图,图D是嵌入后的载体图像的傅里叶系数频谱图。
针对不同的应用场景有不同的嵌入方法,只要分一下两种:以牺牲安全性而保留鲁棒性的数字水印,以牺牲鲁棒性而保留安全性的信息隐写
1.3.1、以牺牲安全性而保留鲁棒性的数字水印隐写算法:
通过使用类似螺旋矩阵的方法嵌入到频谱图中的。
对于给定的图像,若不是长度为2的幂次方形式,则首先将其扩展成NN的形式
下面以88形式的像素图像为例,描述具体的嵌入细节:
在将载体图像进行2D-FFT变换后,其中心是高频的傅里叶系数,偏向四个角落的部分是低频系数。
设计一个递归函数:
每一层递归函数的操作依次为向右嵌入、向下嵌入、向左嵌入、向上嵌入四个子操作,每一层依次执行四次嵌入操作的长度的公式为:
Layer表示当前嵌入操作所在的层数,Width表示载体图像的宽,N表示当前递归层数下每个子操作需嵌入数据的长度,从频谱图的左上角开始,每一次递归都是将本最外层的高频系数替换成需嵌入的图片的系数,当前层级完成嵌入操作后继续执行下一层递归,直到信息图片的系数完全嵌入到载体中。在嵌入操作完成后,对频谱图像进行逆变换即可变回原始图像的模样。由于在嵌入前会事先计算能够被嵌入的载体高频系数的容量并与信息图片进行比较,所以嵌入过程并不会产生诸如容量的问题。
提取过程与嵌入过程类似,是上述的逆过程。该水印嵌入之后,理论上只要原图的傅里叶系数足够完整,大概保留大于等于一半的傅里叶系数左右,就能够从图片中恢复出足够的信息辨别隐藏的图片,后面会介绍到对该算法嵌入的图片进行一系列攻击还原的情况。
该嵌入操作函数在C#中的实现如下:
public bool EmbedInfo(ComplexF[,] data,
int x, int y, int N, ComplexF[] flow, int count)
//data是存取载体图像傅里叶系数的数组,包括虚部和实部
{
//向右嵌入
tee = y;
for (; y < tee + N && (count < flow.Length); y++)
{
data[x, y].Re = flow[count].Re;//嵌入信息图片的实部到载体中
data[x, y].Im = flow[count].Im;//嵌入信息图片的虚部到载体中
count++;
}
xss = x;
//向下嵌入
for (; x < xss + N && (count < flow.Length); x++)
{
data[x, y].Re = flow[count].Re;
data[x, y].Im = flow[count].Im;
count++;
}
//向左嵌入
tee = y;
for (; y > tee - N && (count < flow.Length); y--)
{
data[x, y].Re = flow[count].Re;
data[x, y].Im = flow[count].Im;
count++;
}
xss = x;
//向下嵌入
for (; x > xss - N && (count < flow.Length); x--)
{
data[x, y].Re = flow[count].Re;
data[x, y].Im = flow[count].Im;
count++;
}
Curren_X = ++x;
Curren_Y = ++y;
//当前递归层执行完后下一个起始位置是当前位置的右下位置
if (count == flow.Length)
{
return true;
}
//直到count计数到信息图片的最后一个位置递归结束
else
{
N -= 2;
if (EmbedInfo(data, Curren_X, Curren_Y, N, flow, count))//递归进行
{ return true; }
else
{
return false;
}
}
完整的程序流程图:
1.3.2、以牺牲鲁棒性而保留安全性的信息隐写
1.3.2.1、对图像的加密:
该过程主要分为对图片的加密和对文件流的加密,主要用到的是前几次作业中采用的方案。使用Logistics算法产生一个混沌序列流,再将该秘钥流依次与信息图片的R、G、B通道进行迭代的异或。
与上次实现logistics不同的是,本次对logistics混沌序列加密有一定的改进。
1.3.2.2、Logistic 映射
原先使用的Logistic 映射维混沌映射[[[] 严春来. 一种基于Logistic映射的混沌图像加密算法。表达式为:
其中参数μ的范围是[3. 57,4].但是这个区间范围内不是所有的值都能够满足混沌的效果,最初使用的Logistic 映射的李雅普诺夫指数较小,其混沌的序列分布不均匀。
1.3.2.3、正弦映射
上式的参数μ在[3. 48,4]范围内则处于混沌状态,其参数区间依旧有限制,也呈现了混沌序列分布不均匀的特点。
1.3.2.3、Logistic-正弦映射
若上式的参数μ在区间( 0,4]则处于混沌状态与最初的Logistic 映射和后来的正弦映射不同,Logistic-正弦映射参数可取范围更大,其混沌的序列分布也更均匀,而且具有更大的李雅普诺夫指数用经过改进的Logistics加密方法实现对图片的加密。
基于改进的Logistics混沌加密流程如图,其中上述流程的嵌入操作简化成“基于FFT的嵌入”
1.3.3、对文件的加密:
若要将文件嵌入到信息中,需要先将文件内容转换为比特流的形式,再将该比特流依次替换到目标图像的傅里叶频谱系数中去,理论上能够嵌入的长度是之前进行的LSB算法嵌入长度的 2/3倍,因为频谱系数分为实部和虚部两部分,而LSB嵌入的信息是R、G、B三通道部分。
对加密后的文件或图像是不能抵抗攻击的,主要原因在于图片中隐藏的信息流是不能抵抗“雪崩效应的”,雪崩效应就是一种不稳定的平衡状态同时也是用于描述加密算法的一种特点,它是指明文或密钥的极小的变化会也引起密文的巨大变化,因此无论是经过混沌加密后图像的像素位还是AES密钥加密后的密文比特流,只要少量消息位的变化会引起信息摘要的许多位变化,从而导致根本不能恢复信息。
但是经过加密的文件或图像在安全性上有了保证,只要攻击者不掌握相应的密钥,理论上是不能提取出信息的。
在实际隐写场景中,嵌入的信息并非全是图像,也有txt文档、ppt等二进制比特流形式的文件,实现的主要思想是将文件分为文件名、文件长度、文件比特流三个组成部分,生成比特流后依次按上述的嵌入函数嵌入到图片的傅里叶系数中去。
下图是该方法的具体流程图,嵌入流程与上述傅里叶系数嵌入一致,这里简化为“嵌入”流程
二、水印测试
首先,选用的载体图片和水印图像如图所示
载体原图:
水印图像:
其次,本攻击测试是针对没有加密的水印嵌入后的图片而言。
主要进行了下列几种攻击:
2.1、在图像上手动涂改
提取出来的水印:
2.2、拉普拉斯锐化
提取出来的水印
2.3、裁剪中心
提取出来的水印
2.4、白化处理
提取出来的水印
2.5、旋转180°
提取出来的水印
三、结果分析
从直观上看上述攻击测试的结果,本算法的鲁棒性相对来说还是可以的,相比于空间域替换信息的LSB嵌入算法,FFT变化域的嵌入在鲁棒性上有较大的提升的同时也满足了隐蔽性。
3.1、分析水印提取前后图片相似度
通过PSNR和MSE计算上述攻击前后的水印图像:
本程序是在 Windows 10下Microsoft Visual C# 实现的。为了衡量提出算法的效果,采用峰值信噪比
(PSNR)和均方误差(MSE)来度量.
为了计算 PSNR,先计算均方误差(MSE) ,其公式为
PSNR公式为:
其中,M,N分别表示图像的长与宽
:代表图像中像素的最大灰度值,一般采用255,即2^8-1
I(i,j)和K(i,j):
整理出来的结果表格如图所示:
3.2、分析不足之处
本次测试的水印图片格式有png、jpg、icon、jpeg、bmp,均能实现。本攻击测试7种攻击均是高强度的攻击,对于攻击后的水印的提取情况来看,主观上在肉眼可区分范围内还是能够读取到信息的,在通过计算前后相似度对比后发现数值差距还是挺大的,一方面是因为攻击的强度原因,另一方面是由于嵌入的算法的问题,本程序采用类似螺旋矩阵的嵌入式方式,在一定程度上可以避免替换傅里叶频谱图中能量高的低频区域。
但是本程序实现的只是灰度图像单通道的FFT隐写,可以改进的地方之一是实现彩色图像的FFT隐写,需要对RGB图像进行通道分解后才能做傅里叶变换。
另外此程序的鲁棒性还有待提高,本程序的鲁棒性是由嵌入算法决定的,改进的地方有对嵌入方法的调整,因为载体图像频谱系数是由中心向水平和竖直方向上延伸的,本程序的算法在一定程度上可能并不能完美地避开低频系数的区域,需要进一步改进嵌入方法。
由于人眼对亮度的敏感性大于对色彩的敏感性,所以尚可改进的方法之一是实现亮度-色度分离策略,将RGB模式转换成LAB模式,其中L是亮度通道,A和B是色度通道,只在A、B通道中嵌入信息,同时增加了可嵌入图片的容量又提高了图像的不可感知性
参考文献
DAVIS C C. Characterization of a liquid –filled turbulence simulator[J]. SPIE, 1998, 3432: 38-49
Rabie T . Digital Image Steganography: An FFT Approach[J]. Springer, Berlin, Heidelberg, 2012.
严春来. 一种基于Logistic映射的混沌图像加密算法[J]. 电脑编程技巧与维护, 2014, 000(006):88-89.
杜翠霞, 张定会, 张宗楠,等. 基于正弦映射和Logistic混沌序列的图像加密方法:, CN103530571A[P]. 2014.
Zhou Y , Long B , Chen C . A new 1D chaotic system for image encryption[J]. Signal Processing, 2014, 97(apr.):172-182.