0x00 隐写原理
Jphide是基于最低有效位LSB的JPEG格式图像隐写算法,使用JPEG图像做为载体是由于相比其余图像格式更不容易发现隐藏信息,由于JPEG图像在DCT变换域上进行隐藏比空间域隐藏更难检测,而且鲁棒性更强,同时Blowfish算法有较强的抗统计检测能力。html
因为JPEG图像格式使用离散余弦变换(Discrete Cosine Transform,DCT)函数来压缩图像,而这个图像压缩方法的核心是:经过识别每一个8×8像素块中相邻像素中的重复像素来减小显示图像所需的位数,并使用近似估算法下降其冗余度。所以,咱们能够把DCT看做一个用于执行压缩的近似计算方法。由于丢失了部分数据,因此DCT是一种有损压缩(Loss Compression)技术,但通常不会影响图像的视觉效果。linux
0x01 隐写过程
Jphide隐写过程大体为:先解压压缩JPEG图像,获得DCT系数;而后对隐藏信息用户给定的密码进行Blowfish加密;再利用Blowfish算法生成伪随机序列,并据此找到须要改变的DCT系数,将其末位变为须要隐藏的信息的值。最后把DCT系数从新压回成JPEG图片,下面是我的对隐写过程理解画出的大体流程图。git
0x02 隐写实现
(1)Stegdetectgithub
实现JPEG图像Jphide隐写算法工具备多个,好比由Neils Provos开发经过统计分析技术评估JPEG文件的DCT频率系数的隐写工具Stegdetect,它能够检测到经过JSteg、JPHide、OutGuess、Invisible Secrets、F五、appendX和Camouflage等这些隐写工具隐藏的信息,而且还具备基于字典暴力破解密码方法提取经过Jphide、outguess和jsteg-shell方式嵌入的隐藏信息。算法
(2)JPHSshell
而这里介绍另外一款JPEG图像的信息隐藏软件JPHS,它是由Allan Latham开发设计实如今Windows和Linux系统平台针对有损压缩JPEG文件进行信息加密隐藏和探测提取的工具。软件里面主要包含了两个程序JPHIDE和JPSEEK, JPHIDE程序主要是实现将信息文件加密隐藏到JPEG图像功能,而JPSEEK程序主要实现从用JPHIDE程序加密隐藏获得的JPEG图像探测提取信息文件,Windows版本的JPHS里的JPHSWIN程序具备图形化操做界面且具有JPHIDE和JPSEEK的功能。app
1.Windows用户请下载JPHS-05 for Windows,同时也提供下载Linux版本。编辑器
2.分别准备一个JPEG格式的图片(example.jpg)和一个文本文件(flag.txt)。ide
因为JPEG文件使用的数据存储方式有多种不能一一演示,这里用最经常使用的JPEG格式-JPEG文件交换格式(JPEG File Interchange Format,JFIF)做为示例。函数
这里简单介绍JPEG文件交换格式的JPEG图片的图像开始标记SOI(Start of Image)和应用程序保留标记APP0(Application 0),JPEG文件交换格式的JPEG图片开始前2个字节是图像开始标记为0xFFD8,以后2个字节接着即是应用程序保留标记为0xFFE0,应用程序保留标记APP0包含9个具体字段,这里介绍前三个字段,第一个字段是数据长度占2个字节,表示包括本字段但不包括标记代码的总长度,这里为10个字节,第二个字段是标识符占5个字节0x4A46494600表示“JFIF0”字符串,第三个字段是版本号占2个字节,这里是0X0101,表示JFIF的版本号为1.1,但也可能为其它数值,从而表明了其它版本号。
3.Windows版本可使用具备图形化操做界面的Jphswin,选择“Open jpeg”打开示例JPEG格式图片example.jpg
若是你选择的不是JPEG格式的图片程序会自动退出,你能够16进制编辑器如Winhex查看图片的图像开始标记SOI和应用程序保留标记APP0,当载入JPEG格式图片会显示一些图片的属性。
4.选择“Hide”选项以后在两次文本框输入相同的密码,这里以输入flag做为密码为例,而后输入要包含隐藏信息的文本。
5.选择将要隐藏的信息如flag.txt。
6.选择“Save jpeg as”选项将图片另存为jpeg格式并输入文件的名称为新的图像文件如C4n-u-find-f14g.jpg。
7.以后即可以看到生成结果和相关信息。
8.第2步到第7步作的是Jhide方式信息隐藏,接下来咱们从C4n-u-find-f14g.jpg图片提取出隐藏信息。
9.若是以前你并不知道图片是基于什么方式进行信息隐藏,你可使用Stegdetect先进行探测。
Stegdetect的主要选项以下:
-q 仅显示可能包含隐藏内容的图像。
-n 启用检查JPEG文件头功能,以下降误报率。若是启用,全部带有批注区域的文件将被视为没有被嵌入信息。若是JPEG文件的JFIF标识符中的版本号不是1.1,则禁用OutGuess检测。
-s 修改检测算法的敏感度,该值的默认值为1。检测结果的匹配度与检测算法的敏感度成正比,算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。
-d 打印带行号的调试信息。
-t 设置要检测哪些隐写工具(默认检测jopi),可设置的选项以下:
- j 检测图像中的信息是不是用jsteg嵌入的。
- o 检测图像中的信息是不是用outguess嵌入的。
- p 检测图像中的信息是不是用jphide嵌入的。
- i 检测图像中的信息是不是用invisible secrets嵌入的。
-V 显示软件版本号。
若是检测结果显示该文件可能包含隐藏信息,那么Stegdetect会在检测结果后面使用1~3颗星来标识
隐藏信息存在的可能性大小,3颗星表示隐藏信息存在的可能性最大。
从下图能够看出极可能是Jphide的信息隐藏方式:
10.在知道隐藏方式以后能够开始进行信息提取,和使用JPHS进行信息隐藏过程相似,打开须要提取隐藏信息的图片C4n-u-find-f14g.jpg,输入对应密码(在不知道密码的状况不能够尝试Stegdetect工具里的Stegbreak程序进行基于字典的暴力攻击)flag,密码验证经过JPHS会自动提取隐藏信息,以后即可以另存提取出的信息。
11.打开提取获得的find.txt即可以获得咱们想要的隐藏信息。