笔记:图片隐写术的原理,以及实际操作实践。
本文最后更新于 347 天前,其中的信息可能已经有所发展或是发生改变。

前言

在这马上到大学的大学的时间时候,翻看书籍,偶然看到了一个叫做图片隐写术的技术,于是学习一下,并且将我了解到的写成笔记记录一下。

隐写术是什么

要弄清除图片隐写术,就得搞清楚隐写术(STEGANOGRAPHY)是什么。我个人理解,隐写术如其名称,就是隐藏的写入,在一个文件(或其他什么东西)里面悄悄的写入一些东西而不让别人发现,只让知情的人知道并取出这些这些数据的一种技术。(其实算一种密码吧)。可以勇于防止资源被盗等等地方。

就如上一段所说,隐写术可以在很多地方发挥其作用,比如说音频,视频,图片,文字等等地方,而今天我主要研究的便是图片隐写术。

简单的例子

想要真正的体会到隐写术,肯定要自己亲身实验一下子才够味。

这我就拿出来一个例子。

就如同下图,比方说下面我的头像(感谢P。站画师 error1980 ,我的头像其实是ta的一个作品,有兴趣和条件的话可以去他的主页看一看。)

原先的图片是没有隐藏信息的,后面的图片是隐藏信息的。后面的图片带了本完整的西游记。跟本看不出来。(因为原图较大,而服务器宽带较小,所以说在线预览的图片是压缩过的,这两张图片的原图我把它们放在了下面操作的程序包中)(注意!这张画作版权归原作者所有!)

隐写术成果对比

更加离谱的事情,请看文件大小,如下图,连文件大小都是一摸一样的。神不神奇?有些人可能不信,可是隐藏的文件中真的藏了一本西游记,不信你自己操作一下

肯定要自己操作一下才够味。

首先,先上工具包。

点此前往蓝奏云下载,密码5ns1

解密

下载下来的是一个压缩包,接下来解压这个压缩包,你将会先看到两张图片,你可以打开好好的对比,看看能不能发现什么端倪。

接下来点开隐写工具中的stools.exe进入如下界面

stool窗口

首先是把隐藏的西游记文件提取出来:

将文件 可莉 隐藏.bmp给拖入到这个窗口,图片较大,可以不用管,然后再那个图片上右键

stool reveal

点击reveal这个按钮,出现这个窗口,再passphrase中填入123 verify填入123 encryption选择idea即可

然后点击ok按钮

stool reveal

稍作等待,就会出现一个新的窗口,如下图,右键这个西游记.txt另存为即可下载隐藏的文件

接下来就是讲解怎么用这个软件来自己往文件里面添加隐藏的信息

加密

这个stool只支持bmp,gif,wav文件,你得先准备一个bmp或者gif文件(小提示,可以用画图的另存为来转化图片格式)

先打开程序的窗口。

然后将要加密的文件拖入窗口打开(小提示,右下角的显示是能隐藏的文件的大小)

(提示1mb=1024kb 1kb=1024b)

接下来再将要藏进去的文件拖进去,接下来会出现以下的窗口,自己设定一下passphrase和verify然后点击ok进行加密,加密出来以后再新出来的窗口右键save as另存为(记得一定要改一下文件名,不然存的文件是一个空的文件,假如存完以后打不开文件(没有后缀名)自己加上即可。)

原理

实际操作完毕以后,就要来了解这个的原理。

现在实现图片隐藏写入现在有很多种实现方法,我先学习其中的一种方法

LSB隐写

lsb全称最低有效位(Least Significant Bits)(最低显著位。。。)。lsb隐写则是一种实现图片隐写的方法

要搞清楚lsb的原理,首先就要知道在计算机中图片是怎么储存的。

计算机中储存一个图片有好多种方法,其中大部分情况下又有两种,空间域(.png .bmp)与频率域(.jpg

我们在这里研究空间域的情况

在空间域的方法下,一张图片可以看作为很多很多个像素点组成的。比方说将刚刚的照片使劲的放大,如下方,这边是将可莉的帽子上的标记使劲的放大。已经可以肉眼可见的看到像素点了

而在空间域中,图片可以看作为一个矩阵,就比如那张可莉的照片,分辨率为2668×2825。这代表这张图片由2668行x2825列像素组成。而这每一个像素都有一个颜色。

而这每个像素的颜色由RGB三个信息构成(red green blue)组合而成(大部分情况下,有的图片格式可能还包含可透明度等等,再此不做讲解),每个颜色可以有256个等级(0-255),三个颜色重叠就可以显示出一个颜色

比如说下面举几个例子

R255 G0 B0

R255 G192 B203

而转化为二进制的话

R 1111 1111 G0000 0000 B0000 0000

R 1111 1111 G1100 0000 B1100 1011

这个样子

而我们假如悄咪咪的将这最后一个字符给该换掉的话,虽然说颜色不是那个颜色了,但是人眼根本就分辨不出来。

比如说对比一下

R 1111 1110 G1100 0001 B1100 1010

看的出区别吗?根本看不出来吧,人眼根本就分辨不出来,接下来我们再来改变,改变两位

R 1111 1100 G1100 0011 B1100 1000

仍然看不出来

接下来是改变3位

R 1111 1000 G1100 0111 B1100 1100

假如你眼睛尖锐,并且屏幕素质极其好,这样说不定能看的出一丢丢的区别

然后4位

R 1111 0000 G1100 1111 B1100 0100

终于看出来区别了吧,再看不出来换一个好一点的屏幕吧。

再将最先和最后的对比一下

,暗了一些吧。

一般情况下好像该变两位数就足够了

在改到第四个字节时候图像会明显的失真。第三个字节也可能失真,所以一般是两个字节。

在这更改的字节的地方就可以藏数据了。而且这样子更改后图片文件的大小不会有变化。

去除与检测

既然有这样的隐藏方式,也就有很多人想着检测或者破坏它,检测它。

检测

检测其比较困难,但是仍然有很多人尝试检测并且破译

人工智能法

此方法再次不在赘述

下面附上一篇论文点此查看来让人了解,这篇是通过深度学习来检测隐写术的

视觉隐写分析

因为由于修改了某些图片的数据,这样可能会导致某些图片失真,假如失真过多那么大概率是用了隐写术(难,一般失真度不大)

chi2测试(卡方检测)

slb隐写术可能会导致图片在统计上出现一些的变化,而通过这种统计的变化即可检测是否采用了隐写术。就比如通过卡方检测来检查

每个图片像素都有灰度值,我们可以计算出每个像素的灰度值,然后画出一个灰度直方图。

首先说明什么是灰度:

灰度值指的是单个像素点的亮度。灰度值越大表示越亮,范围一般从0到255,白色为255 ,黑色为0。常见的算法为某个像素的灰度值 = 0.3R + 0.59G + 0.11B 。

将整个图片的灰度值列为灰度直方图,当然也可以将彩色图片先灰度化然后再读取灰度值

一下是一个python显示灰度直方图的例子,读取的是上文中的两张可莉的照片

需要安装所需要的库。

import cv2
import matplotlib.pyplot
#读图
img1 = cv2.imread(r'g:\1.bmp')
#转换成灰度图
img2 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
#获取直方图,转换成一维数组
matplotlib.pyplot.hist(img2.ravel(),256)
#显示
matplotlib.pyplot.show()
cv2.waitKey(0)

列出灰度直方图后,如下图

原图
隐藏图

在一般的图像中,相邻灰度值的像素块数目的差别很大(大概率)。上面已经看出两张图片是有差别的。

对了,因为我那个头像是一个画作,所以没有那么多色彩信息,其实大部分情况下灰度直方图跟这个长得不太像,我把我博客首页标题后的那个雪中轻轨的照片的灰度直方图附在下面。

对于隐写法隐藏的信息,在我们写入到图片的时候,其实我们写入的信息已经是被加密过的(本文上篇中自己操作隐写入的过程中选择的IDEA就是选的加密算法,输入的字符即为加密密钥),这样子我们加密的信息可以看作是0、1随机分布的一串数据,假如这些数据完全替代了图像的最后一位(就是信息编码的最后一位),那么隐藏后的文件中两个相邻灰度值的像素块数目将会比较接近。我们就可以以此来进行判断,来检测是否被隐写。

首先就是假如整个文件中像素最后一位全部被隐写了,即存了大量的隐藏数据,被改变的位置(像素的一个信号)有三种情况,比如对于上方例子所讲的粉色的r值,改变之后(只隐藏一位),要么rgb值的r这个值是不变,要么加一,要么减一,那么原来相邻两个值本来应该数值相差特别的大,改写后数值的相差就不会那么大了 可以由此检测,具体原理在这不再赘述,后续可能在这里更新

破除

虽然说检测比较困难,但是破除其还是比较简单的,比如说编辑或者再次写入都可以破坏本博客所讲解的隐写方法。

应用场景

企业的加密资源防盗,秘密信息传递等

后记

本文其实还没有写完,对于卡方破解隐写的方法这里描写的不太细致。到时候大概率将会再这里更新。假如有问题的话发送邮件到admin@q2019.org,感谢阅读

特别说明:这篇文章已经被我用来作为计算机导论课的研究报告,请勿复制下载!谢谢

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,记得载明出处,(期待)。 内容有问题?请点此跟我反馈
上一篇
下一篇