有趣的图片隐写技术 揭秘图片背后更多的秘密

前言

之前我们有讲过图片的exif属性,能够从中获取定位等信息

今天我们来聊聊图片隐写技术!盲水印就是图片隐写技术其中的一种。

盲水印

演示

首先,我们先上图

本图为加密后的demo.jpg

图片[1]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

本图为加密前的ggbond.jpg

图片[2]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

然后,使用我们写好的python脚本(详细代码在制作过程,评论获取),运行下面的命令进行解密

 python fancypig.py --action decode --origin demo.jpg --im ggbond.jpg --result res.jpg

我们可以在res.jpg图片中隐约看到猪猪侠 663962的字样,是不是还蛮神奇的!

图片[3]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

制作过程

盲水印的制作过程如下,附相关代码

用途

那我们不禁会问了?盲水印这玩意有啥用呢?

对于版权保护,可以说用处太大了!

隐藏式的水印是以数字数据的方式加入音频、图片或影片中,但在一般的状况下无法被看见。隐藏式水印的重要应用之一是保护版权,期望能借此避免或阻止数字媒体未经授权的复制和拷贝。

1.不同人加相同水印

  • 某些画师、摄影师、设计师会在其作品中加入水印。

13年左右有位自称是“超写实主义”的画家,声称自己纯手工画的画写实程度可以超过摄影机,并开办培训班敛财。

后被一位加了盲水印的摄影师戳穿,原来其“画作”都是直接将照片用ps处理成手绘质感的图。

  • 淘宝防盗图功能

淘宝卖家图会被淘宝自动打上水印,如果有别的卖家存图作为自己的图上传会被检测出。

2.不同人加不同水印

将某份保密数字资料发送给不同人时,可加上不同标识,如果资料被复制、传播可根据解码出的唯一标识来追究责任人。

  • 电影刚刚公映时,每个影院,影厅的 电影底片里都会加入不同的不可见水印, 如果电影流出,就可追究相关影院责任。
  • 阿里,华为等公司内部论坛、平台会在HTML页面中加入足够数量及不被发现的唯一标识。当有内部敏感信息通过截图等方式流出,也可追踪到个人。比如著名的“阿里月饼门”。
图片[4]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

原理

原理图

图片[5]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

傅里叶变换

  • 简单复习下傅里叶变换

傅里叶变换简单地说就是将信号在时域空域的函数转变到频域表示,在和工程学中有许多应用。因其基本思想首先由法国学者约瑟夫·傅里叶系统地提出。

  • 再理解下时域和频域
图片[6]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog
图片[7]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

那么,傅里叶变换有什么用呢,

  • 先在纸上画一个sin(x),不一定标准,意思差不多就行。不是很难吧。
  • 好,接下去画一个sin(3x)+sin(5x)的图形。这个就很难能画得出来。

现在把sin(3x)+sin(5x)的曲线给你,只看图是看不出这整个曲线的方程式是怎样的,现在需要将把sin(5x)从图里拿出去,看看剩下的是什么。这基本是不可能做到的。

但是在频域呢?则简单的很,无非就是几条竖线而已。

这是最简单的一种用法,其他复杂用法不在此赘述。

频谱图

一维信号的变换理解之后,那么图像的频谱图长什么样呢。

图片[8]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog
图片[9]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

图片中明亮的部分就是低频(平缓)部分,暗点的是高频(突变交界)部分。一般为了展示会把频谱图低频的部分移到中心。频谱图上的点跟原图不存在一一对应关系,频谱图的每一点都来自于全部的图像(类似于时域曲线的点,和频域图的点)。

这样可能还不够直观,接下来看这张图。

图片[10]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

这是一张400×400的图,共有16 万个像素点。

我们平时怎么来表示一张图片呢,首先是在笛卡尔坐标系中用x,y来定位某一确定的点。那么,我们怎么来描述这个点呢?

我们知道,所有的色彩都是由三原色组成。生活中经常说的红、黄、蓝(青),其实是一种消减型的三原色,光学中的三原色是红、绿、蓝,也就是R、G、B。

通常我们用来描述图像点的方法就是RGB的值,其实图像处理中用的是灰度(Gray scale)来表示图片,但是为了便于理解,下面用的是RGB演示 。

图片[11]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

上图是截取了某一行RGB的值做成的曲线图,可以看到,每条曲线都在不停的上下波动,且波动的频率是相同的。有些区域的波动比较小,有些区域突然出现了大幅波动。

对比一下图像就能发现,曲线波动较大的地方,也是图像出现突变的地方。

图像的频谱可以理解为将一维的频谱绕着纵轴旋转一圈,形成一个3维的数学函数图(原图中心对称、镜像对称才可以这样干,其他类似),x、y轴代表两个方向的频率,z轴代表该频率的幅值,只不过频谱图像是一个2维图,所以用亮度来表示幅值了。

二维傅里叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数。

盲水印的特性

鲁棒性一般要能抗(压缩 、裁剪、涂画,旋转)。

特性
  1. 隐蔽性由于不希望被察觉、不希望干扰用户体验、不希望被模仿等等原因,我们的水印不可见,也就是隐匿性。
  2. 不易移除性不易移除性跟鲁棒性有些相似, 不同的是:鲁棒性更加强调的是数字资源在传播过程中不要被不自觉地干扰和破坏。不易移除性是在别有用心者察觉了盲水印的存在后,不被他们自觉地移除或者破坏。
  3. 强健性强健性通常也被称作鲁棒性,来自于其英文名称(Robustness)的音译。简单地说就是耐操性。需要说明的一点是,鲁棒性和隐蔽性通常不可兼得。
  4. 明确性没什么可说的,就是盲水印需要表示出明确的信息。

引申

图种

图片[13]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

例如这是一张相貌平平的图片, 你可以保存下来,将后缀改为zip或者直接用解压工具打开,就可以看到神秘福利。

制作方法也很简单,在win下输入以下命令就可以做一张图种

图片[14]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog
copy /b ggbond.jpg + fuli.zip res.jpg

在文件>查看>启用文件扩展名

图片[15]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

然后将上面的图片修改为.zip后缀

图片[16]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

解压缩,就可以看到隐藏的fuli.txt文件

图片[17]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

是不是这操作还挺骚的?!

据说大约十年以前,图种被广泛上传到论坛等地用来传播资源。后来由于许多网站在上传图片时会判断图片结尾标识,这种方式的图片也不能支持上传了。

与之类似的还可以通过copy命令制作图片马,我们之前讲过

隐藏文件

图片可以跟种子文件结合,当然也可以和其他文件结合。18年还有人因此出过事

图片[18]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

其实隐藏文件盲水印都属于图片隐写术

图片隐写术

隐写术(Steganography)也是数字水印的一种应用,双方可利用隐藏在数字信号中的信息进行沟通。

数字照片中的注释数据能记录照片拍摄的时间、使用的光圈快门,甚至是相机的厂牌等信息,这也是数字水印的应用之一。

某些文件格式可以包含这些称为“metadata”的额外信息。

用途

规避敏感词过滤

​ 所谓的“敏感词过滤”,常翻墙的同学,应该都很熟悉了。用图片来隐藏信息,可以规避GFW的敏感词过滤。

规避肉眼审查

​ 国内的很多网站,对于上传的图片,都会进行人工审查。如果能通过技术手段把信息隐藏在图片中,而图片本身又看不出什么异样,人工审核就看不出来。

传递加密信息

​ 不希望被别人看到的资料、信息等。

常见方法

图片[19]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

原理

内容覆盖法

通常来说,图片文件都有包含2部分:文件头和数据区。

而“内容覆盖法”,就是把要隐藏的文件,直接【覆盖】到图片文件的【数据区】的【尾部】。

比方说,某图片有 100KB,其中文件头占 1KB,那么,数据区就是 99KB。也就是说,最多只能隐藏 99KB 的文件。

切记:覆盖的时候,千万不可破坏文件头。文件头一旦破坏,这个图片文件就不再是一个合法的图片文件了。   

使用这种方法,对图片文件的格式,是有讲究的——最好用【24位色的 BMP 格式】。

  • BMP 格式本身比较简单,数据区随便覆盖,问题不大;
  • 24位色的 BMP 相对其它的格式 BMP,文件尺寸更大,可以隐藏更多内容。
import sys

def embed(container_file, data_file, output_file) :
    """代码没有严格计算 BMP 的文件头尺寸,只是大致预留了 1024 字节"""
    
    container = open(container_file, "rb").read()
    data = open(data_file, "rb").read()

    if len(data)+1024 >= len(container) :
        print("Not enough space to save " + data_file)
    else :
        f = open(output_file, "wb")
        f.write(container[ : len(container)-len(data)])
        f.write(data)
        f.close()

if "__main__" == __name__ :
    try :
        if len(sys.argv) == 4 :
            embed(sys.argv[1], sys.argv[2], sys.argv[3])
        else :
            print("Usage:\n%s container data output" % sys.argv[0])
    except Exception as err :
        print(err)

LSB最低有效位

很多商业软件使用的原理都是这个方法。

图片[20]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

例如在PNG图片的储存中,每个颜色会有8bit,LSB(Least Significant Bit)隐写就是修改了像数中的最低的1bit,在人眼看来是看不出来区别的,也把信息隐藏起来了。(每个像数可以携带3bit的信息。)

图片[21]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

譬如我们想把’A’隐藏进来的话,如下图,就可以把A转成16进制的0x61再转成二进制的01100001,再修改为红色通道的最低位为这些二进制串。

图片[22]-有趣的图片隐写技术 揭秘图片背后更多的秘密-FancyPig's blog

附录:CTF中的图片隐写技术 三部曲

无论基础好不好,掌握好下面三部曲,图片隐写70%基本拿下!!!!


Part I : 基础编辑器-notepad++、010Editor、winhex
使用编辑器直接打开图片看看里面是否存在隐藏的 flag


Part II : 图像隐写的必备工具-stegsolve.jar
能够对常见的图片格式进行偏移,LSB 提取、帧提取、像素偏移、数据提取,对两张图片进行结合等等。


Part III : 命令行反隐写工具-binwalk、foremost
binwalk:用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具。
foremost:隐藏文件分离工具,与 binwalk 相结合效果更甚

© 版权声明
THE END
喜欢就支持一下吧
点赞25
分享
评论 共31条

请登录后发表评论