【转】用图片隐藏信息的技术实现

上一个帖子,介绍了“用图片传播FQ工具”。今天,来聊一下其中的技术原理。如果你对IT技术没啥兴趣,可以略过本文。

★图片隐藏信息的用途

  先来说说信息隐藏的目的。俺大致总结了一下,信息隐藏可以用于如下几种场合。

◇规避敏感词过滤

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

◇规避肉眼审查

  俺在上一个帖子介绍的方法(把FQ工具嵌入图片中),主要是为了躲开网站管理人员的人工审查。国内的很多网站,对于上传的图片,都会进行人工审查。如果能通过技术手段把信息隐藏在图片中,而图片本身又看不出什么异样,人工审核就看不出来。

◇传递加密信息

  最后,图片还可以用来隐藏加密的信息。关于加密的用途及重要性,俺在“文件加密的扫盲介绍”中,已经强调过加密性。用图片来隐藏加密信息,除了具有加密的效果,还具有很大的欺骗性——因为外人难以知道一张图片是否包含有加密信息。

★准备工作——先压缩

  下面,俺会介绍几种不同的隐藏方式。在动手之前,先说一下准备工作——把要隐藏得文件先用压缩工具(比如 7zip 或 WinRAR)压缩一下。
  压缩有如下几个好处:
优点1
如果你要隐藏的文件是文本格式或者 Office 格式,它内部的内容是明码的。如果里面包含敏感词,在通过网络传输时,会遭遇敏感词过滤。而压缩后的文件,原有的内容已经变得面目全非,可以规律敏感词过滤。
优点2
压缩之后,体积变小,有利于增加隐蔽性。因此,应尽量使用"最大压缩"的选项。
优点3
对于后面介绍的2种方法(尾部追加法、内容覆盖法),如果你隐藏的文件是压缩格式的,到时候提取信息会很简便——直接用压缩工具来解压,即可。

★尾部追加法

  先介绍最简单的一种方法。

◇技术原理

  顾名思义,"尾部追加法"就是把要隐藏的文件追加到图片尾部。这种方法不会破坏图片原有的任何数据,因此,图片看起来和原来一模一样。

◇隐藏信息的步骤

  隐藏的过程很简单,用 Windows 内置的文件拷贝命令,即可完成。假设你的图片文件叫 A.JPG,需要隐藏的压缩文件叫 B.ZIP,那你只需要执行如下命令,就可以把两个文件合并成一个新文件。
copy /b A.JPG + B.zip C.JPG
  执行完如上命令,即可得到一个新的图片文件 C.JPG。这个图片文件的大小是前两者的总和。你可以用各种看图工具来打开 C.JPG,不会看到什么异常。

◇提取信息的步骤

  由于你追加的是压缩文件,提取的时候就简单了——只要用压缩工具打开 C.JPG,就可以直接看到压缩包里面的内容了。

◇优点

1、
制作简单,一条 copy 命令就可以搞定;如果隐藏的是压缩文件,提取的过程也很简单。
2、
用看图工具看生成的新文件,还是跟原来一样。
3、
隐藏的文件,大小不受限制。比如,你可以在一张100K的图片尾部,追加200K的隐藏数据。

◇缺点

1、
由于隐藏的文件附加在尾部。当你把这个新的图片文件上传到某些贴图的网站,(假如这个网站对图片格式的校验比较严格)它有可能会发现图片尾部有多余的数据,并且会把这个多余的数据丢弃掉。
2、
追加后,图片的文件尺寸变大了。如果你追加的文件太大,容易被发现破绽。
比方说,一张640*480的 JPEG 图片,大小竟然有好几兆,对于有经验的IT技术人员,一下子就会觉得有猫腻。

★内容覆盖法

  说完尾部追加的办法,再来介绍内容覆盖的办法。

◇技术原理

  通常,图片文件都有包含2部分:文件头和数据区。而"内容覆盖法",就是把要隐藏的文件,直接覆盖到图片文件的数据区尾部。比方说,某图片有100K,其中文件头占1K,那么,数据区就是99K。也就是说,最多只能隐藏99K的文件。
  切记:覆盖的时候,千万不可破坏文件头。文件头一旦破坏,这个图片文件就不再是一个合法的图片文件了。
  使用这种方法,对图片文件的格式,是有讲究的——最好用 24位色的 BMP 格式。一来,BMP 格式本身比较简单,数据区随便覆盖,问题不大;二来,24位色的 BMP 相对其它的格式 BMP,文件尺寸更大,可以隐藏更多内容。

◇隐藏信息的步骤

  用这个招数来隐藏信息,稍微有点麻烦,需要借助一些小工具。对于这种简单的活计,俺通常用Python脚本来搞定。以下是俺写的一个简单 Python 脚本。你的电脑中如果有Python环境,可以直接拿这个脚本去用。
  事先声明:如下代码没有严格计算 BMP 的文件头尺寸,俺只是大致预留了 1024 字节,感觉应该够了。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

import sys

def embed(container_file, data_file, output_file) :
    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:"
            print sys.argv[0], "container data output"
    except Exception,err :
        print err

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  上述Python的代码,很好懂,有编程基础的同学,10分钟之内就可以用自己熟悉的语言重写一个类似的。
  另外,没学过 Python 的同学,如果有兴趣,可以看看俺之前写的系列帖子——为什么俺推荐Python?

◇提取信息的步骤

  和前一种方法类似。如果你覆盖的是压缩文件,提取的时候,可以用压缩工具打开图片,就可以直接看到压缩包里面的内容了。

◇优点

1、
图片的文件尺寸没变。
2、
虽然隐藏文件覆盖到数据区,破环了原图像的内容。但是从格式上来讲,该图片文件的格式还是合法的。
因此,你可以把这种图片上传到各种贴图的网站,技术上不会出问题。
3、
如果隐藏的是压缩文件,提取的过程很简单。

◇缺点

1、
由于隐藏的文件覆盖了数据区,因此,图片在显示的时候,会有一块区域变成灰蒙蒙的。
2、
隐藏文件的大小,有一定的限制——不能大于图片数据区的尺寸。
3、
对图片格式有一定要求。此处再啰嗦一下,建议用 24位色的 BMP 格式。

★隐写法

  最后,来介绍一种最复杂,但是也最隐蔽的方法——隐写术。

◇技术原理

  此方法会涉及较深奥的技术领域,俺也就知道个大概。通俗地说:如果把图片的某个像素的颜色,进行微小的调整,肉眼是看不出来的;因此,专门的软件,利用某些高深的算法,就可以在变化的像素中隐藏信息。
  有兴趣的同学,可以看"这里"的介绍;懂洋文的,还可以看更详细的介绍,在"这里"。

◇隐藏/提取信息的步骤

  使用这种方法,你需要用专门的工具来进行信息的隐藏和提取。在进行隐藏时,你除了指定图片文件和被隐藏的文件,还需要设置一个密码。隐写工具会把你的隐藏文件先加密,然后再进行隐写;提取的时候,需要用同一款隐写工具进行提取,并输入同样的密码,才能提取出来。
  假如图片文件落入攻击者手中,他必须同时知道2个信息(你用哪款隐写工具,你隐写时设置的密码),才有可能破解出隐含的信息。因此,安全性很高。

◇相关工具

  下面介绍几款工具,大伙儿可以根据自己喜好,挑选一个试试看。

名称 官网 界面 类型
Silent Eye 这里 图形界面 开源软件
Steg Hide 这里 命令行界面 开源软件
Ultima Steganography 这里 图形界面 商业软件

◇优点

1、
隐蔽性非常好。图片看上去几乎没变(其实是有极其轻微的变化,但是肉眼看不出)。并且,图片文件的大小也没变化。
即使是专业人士,也很难判断一张图片是否包含了隐写术的数据。

◇缺点

1、
隐藏信息和提取信息比较麻烦,需要使用专门的工具。
2、
只能隐藏较少的信息。
此方法能隐藏的信息量,和图片面积有关,和图片格式无关。比如一张1600*1200尺寸的,无论哪种格式,大约只能隐藏几KB的数据。

★结尾

  刚才介绍的几个招数,除了可以用于图片文件,也可以用在其它的多媒体文件中(比如:音频文件、视频文件)。有兴趣的网友,可以自个儿研究一下。

俺博客上,和本文相关的帖子(需FQ)
用图片传播FQ软件



版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:
http://program-think.blogspot.com/2011/06/use-image-hide-information.html

时间: 2024-10-06 14:08:06

【转】用图片隐藏信息的技术实现的相关文章

《javascript设计模式》读书笔记二(封装和隐藏信息)

1.为什么要封装和信息隐藏 做过编程的朋友们知道"耦合"这个词,其实封装的效果就是为了解耦,让类和类之间没有太多的联系,防止某一天修改某一类的时候,产生"多米骨诺牌效应". 我们可以把信息隐藏看成目的,把封装看成达到信息隐藏的技术.通过封装就可以把对象的内部数据表现形式和实现细节进行隐藏.就好比你会看电视,但是你不知道电视的内部结构一样.但是在javascript中没有任何内置的机制,所以我们还需做些处理,同样来模仿封装. 2.创建对象的方法 1)最简单的一种方法就

图片隐藏压缩包

图片更改扩展名变成压缩包 网上时常见到有的图片下载后,改下扩展名rar,就成了压缩包了,而且压缩包还能解压. 例如有一个文件123.txt需要隐藏. 将123.txt压缩成压缩包,得到123.rar. 照一张图片1.jpg. 在当前目录打开命令行窗口: copy /b 1.jpg + 123.rar 2.jpg 那么当前目录下就得到了2.jpg.满足上述要求. 具体原理不详. 将2.jpg按二进制打开后内容和1.jpg完全一样,至少我看到的一样.搜索也得不到123.rar的二进制内容. 猜测是因

如何判定伪原创内容之信息指纹技术

"内容为王,外链为皇"这句话,相信任何一个从事SEO工作的人都是知道的,由此可见,内容和外链对于网站的重要性.外链是提升我们网站关键词排名的关键,而内容是我们网站的基础. 站内内容的更新对于网站来说是非常重要的,内容讲究原创性是我们平时在进行内容建设时特别需要注意的地方,但是搜索引擎如何判定原创内容呢?今天徐州亿网将给大家说说搜索引擎的信息指纹技术. 首先给大家说说这个信息指纹技术,接触到这个概念还是在ZAC的一次培训中.信息指纹技术在百度百科中的解释是:就是提取一个信息的特征,通常是

减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

原文:减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术) 在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”,那么,这一篇博文将讲解  “ 将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片”. 一.为何选择将图片转成二进制并生成Base64编码,可以在网页中通过url查看

U+V2深度隐藏PE制作技术初探

所谓U+,习惯上是指用UltraISO软件把ISO文件写入U盘来制作启动盘的一种技术.第一代U+兼容性不太好,不推荐使用.目前,兼容性比较好的是第二代U+启动技术(USB-HDD+ V2/USB-ZIP+ v2),通常简称为U+V2,最新版 U+ 2.0可以创建启动分区并支持"低端隐藏"."高端隐藏"和"深度隐藏"启动分区.U+V2高端隐藏和深度隐藏启动分区解决了PE中低端隐藏时运行一键还原工具时隐藏的启动分区与可见区互换的问题,让U+技术达到了

Python网络爬虫之图片懒加载技术、selenium和PhantomJS

一.什么是图片懒加载? - 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agen

爬虫之图片懒加载技术、selenium和PhantomJS

图片懒加载 selenium phantomJs 谷歌无头浏览器 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmei

软件设计的哲学 第五章 隐藏信息

目录 5.1 信息隐藏 5.2 信息泄漏 5.3 时间分解 5.4示例:HTTP服务器 5.5 示例:类太多 5.6 示例:HTTP参数处理 5.7 示例:HTTP响应中的默认值 5.8 隐藏在类中的信息 5.9 不要过度隐藏 5.10 结论 第四章论述了模块的深度.本章以及随后的几章将讨论创建深度模块的技术. 5.1 信息隐藏 实现深度模块最重要的技术是信息隐藏.这种技术首先由David Parnas描述.基本思想是每个模块应该封装一些知识,这些知识表示设计决策.该知识嵌入到模块的实现中,但不

爬虫学习 08.Python网络爬虫之图片懒加载技术、selenium和PhantomJS

爬虫学习 08.Python网络爬虫之图片懒加载技术.selenium和PhantomJS 引入 今日概要 图片懒加载 selenium phantomJs 谷歌无头浏览器 知识点回顾 验证码处理流程 今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import