图片隐藏信息

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

分类: 信息安全   13070人阅读  评论(10)  收藏  举报

目录(?)[+]

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

★图片隐藏信息的用途


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

◇规避敏感词过滤


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

◇规避肉眼审查


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

◇传递加密信息


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

★准备工作——先压缩


  下面,俺会介绍几种不同的隐藏方式。在动手之前,先说一下准备工作——把要隐藏得文件先用压缩工具(比如 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的数据。

★结尾


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

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

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

查看评论
7楼  Jump2cn 2011-10-21 09:00发表 [回复]
博主所说的隐写术更正式的称呼应该是“Data hiding in image”,刚好这学期我有上这门课。从名字上看,似乎还有很多隐藏方向。
我们教的都是用灰度图片来做。灰度的图片数值都是0~255,也就是8个位,通过修改低位(LSB)来隐藏数据。其实博主所说的肉眼不可见不太准确 ,应该是肉眼不可识别隐藏信息,如前面所说,如果修改的位太多,像素的差异会很明显(失真)。基于这个理念衍生了很多算法,主要是藏入方法的改进,调整藏入后像素值的改进,嗯,应该还有其他方向(木有认真听课..)。
不过Data hiding in image已经有方法(SPAM)可以检测出来,SPAM好像是使用数学统计的方法来侦测修改,对各种隐藏算法的侦测命中率非常高。通过SPAM数据进行libsvm训练得到的命中率基本都在90%~100%。藏入的数据量越多命中率越高。
嗯,还学上这门课,就这么多吧。
Re:  program_think 2011-11-03 09:42发表 [回复]
回复Worms1303:这位同学的评论很专业 :)
6楼  blogdevteam 2011-07-28 16:15发表 [回复]
尊敬的博客专家:
您好!
CSDN新版博客专家实行实名制原则,目前您还没有提供实名等信息,请您在2011年8月4日前在http://surveies.csdn.net/survey/comein/222填写您的实名等信息并提交,或将信息发送至:blog@csdn.net。谢谢~
5楼  ruckfull 2011-06-29 23:46发表 [回复]
我实验了copy的办法 为什么用压缩软件看不到隐藏的信息啊 球指点下 刚接触这个 有点白了[e07]
4楼  laolaolihui 2011-06-22 09:23发表 [回复]
感谢。学习了。。。
3楼  kds622 2011-06-03 15:29发表 [回复]
作为新人,表示很神奇
2楼  littlehedgehog 2011-06-02 23:46发表 [回复]
貌似 墙外不能评论啊
Re:  program_think 2011-06-03 00:04发表 [回复]
可以评论,而且支持匿名评论。
你大概因为翻墙碰到啥问题,所以无法评论吧。
1楼  littlehedgehog 2011-06-02 23:46发表 [回复]
比方说,某图片有100K,其中文件头占1K,那么,数据区就是99K。也就是说,最多只能隐藏9K的文件.
第一反应是 100K - 1K = 9K? 不会吧 难道说有啥高深的算法?
Re:  program_think 2011-06-03 00:01发表 [回复]
回复很迅速啊 :)
俺少敲了一个“9”,已经更正。
抱歉!
Python可以用于将信息隐藏图片,这被称为“隐写术”。以下是一种将文本信息隐藏图片的方法: 1. 打开图片文件并读取其像素值。 2. 将文本信息转换为二进制形式。 3. 将二进制文本信息分配给像素值的RGB通道。 4. 保存修改后的像素值并将其写入新的图片文件。 以下是一个简单的Python代码示例: ```python from PIL import Image def hide_text_in_image(image_path, secret_message): # Open the image file image = Image.open(image_path) # Convert the secret message to binary binary_secret_message = ''.join(format(ord(x), '08b') for x in secret_message) # Get the pixel values of the image pixels = list(image.getdata()) # Loop through the pixel values and assign the binary secret message to the RGB channels new_pixels = [] secret_message_index = 0 for pixel in pixels: # If we've assigned all of the secret message, just add the original pixel value if secret_message_index >= len(binary_secret_message): new_pixels.append(pixel) continue # Assign the secret message to the R, G, and B channels r, g, b = pixel new_r = format(r, '08b')[:-2] + binary_secret_message[secret_message_index] new_g = format(g, '08b')[:-2] + binary_secret_message[secret_message_index+1] new_b = format(b, '08b')[:-2] + binary_secret_message[secret_message_index+2] new_pixel = (int(new_r, 2), int(new_g, 2), int(new_b, 2)) new_pixels.append(new_pixel) secret_message_index += 3 # Create a new image with the modified pixel values new_image = Image.new(image.mode, image.size) new_image.putdata(new_pixels) # Save the new image with the secret message hidden in it new_image.save('hidden_message.png') ``` 此代码将在指定的图像文件隐藏指定的文本消息,并将结果保存到名为“hidden_message.png”的新文件。要提取隐藏的消息,可以使用类似的方法读取像素值,并提取文本消息的二进制表示形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值