返回信息流信息隐藏技术只在信息安全课上听过,以前从来没有用过真的软件。假期学习了Python语言,发现这个语言的标准库非常强大,很容易可以完成很多高级的功能(图像处理还是需要第三方的扩展库)。于是,花了一点时间练习一下,实现这个技术。
我的思路就是老师讲的常用方法:将信息隐藏在一幅图片(位图)的每个像素每种颜色的低比特中。由于人的眼睛对微小的颜色变化不敏感,直接观察图片是无法看出其中的信息的。
具体实现:图像中,每个像素分成红绿蓝三种颜色,每个颜色的强度用8比特存储,一个像素就是24比特。我在这24比特中隐藏8比特的信息:红色和蓝色分别3比特,绿色2比特(因为人眼对绿色比较敏感),都用最低比特位。数据从图像左上角开始,逐行存储。前4个像素储存被隐藏的数据的长度(这也就限制了被隐藏的数据不能超过2的32次方字节,但是世界上真的有那么大的图片吗?),然后每个比特按被隐藏数据的顺序逐字节存储。解码时相反,先获得信息长度,再提取数据。
这个脚本是用Python语言做的,Linux系统一般会自带解释器。需要python-imaging库(也叫PIL,Python Imaging Library)。Windows可以去www.python.org下载Python,去www.pythonware.com下载PIL。
初学者的作品,欢迎拍砖。
使用方法(设程序名为infohide.py):
当前目录有lena.tif,data.txt
隐藏信息:
./infohide.py -e lena.tif data.txt hidden.png
提取信息:
./infohide.py -d hidden.png output.txt
一些限制:
输入图像格式,很多,只要PIL认识都行,如gif,jpg,png,tiff等
输出格式是PNG,因为需要无损的格式,否则隐藏的信息会有损失
算法可能不好,速度有点慢。
附带一张Lena的照片用来作实验。
附件(768.1KB) lena_std.tif
代码:
#!/usr/bin/python
import sys
import Image
usage="""USAGE:
encode: infohide.py -e source_image secret_data output_image_with_data
decode: infohide.py -d image_with_data output_data
"""
def encode(imgFileName,dataFileName,outFileName):
"""Hide file (dataFileName) into image (imgFileName),
write output to outFileName."""
try:
dataContent=open(dataFileName,"rb").read()
except IOError:
print "Cannot open data file",dataFileName,"!"
exit()
try:
img=Image.open(imgFileName).convert(mode="RGB")
except IOError:
print "Cannot open image file",imgFileName,"!"
exit()
# Since one pixel hides one byte, image may not be big enough.
if len(dataContent) > img.size[0]*img.size[1] - 4:
print "Image too small to hold data!"
exit()
# Convert data into low-bits of each pixel.
# Each pixel has R,G,B color, each 8 bits.
dataPixTable=[(val>>5,(val>>3)&3,val&7) \
for val in [ord(x) for x in dataContent]]
# Insert the length of data before all data.
# This length is recorded in 4 bytes (4 pixels).
dataPixTable[:0]=[(val>>5,(val>>3)&3,val&7) \
for val in [(len(dataContent)>>(8*x))&255 for x in range(4)]]
# Convert image into a list of (R,G,B) tuples.
imgData=list(img.getdata())[:len(dataPixTable)]
# Write data into image low-bits
for i,dpix in enumerate(dataPixTable):
imgData[i]=(imgData[i][0]&(~7)|dpix[0],
imgData[i][1]&(~3)|dpix[1],
imgData[i][2]&(~7)|dpix[2])
# Write into image and write output file.
img.putdata(imgData)
img.save(outFileName,"PNG")
def decode(imgFileName,outFileName):
"""Restore hidden data from imgFileName,
write into outFileName."""
try:
img=Image.open(imgFileName)
except IOError:
print "Cannot open source image",imgFileName,"!"
exit()
imgData=list(img.getdata())
# Find out the length of hidden data.
lenDecode=[((a&7)<<5)|((b&3)<<3)|(c&7) for (a,b,c) in imgData[:4]]
dataLen=sum([x<<(8*ind) for (ind,x) in enumerate(lenDecode)])
if dataLen > len(imgData)-4:
print "This image may not hide any data!"
exit()
# Extract data
dataDecode=[((a&7)<<5)|((b&3)<<3)|(c&7) \
for (a,b,c) in imgData[4:dataLen+4]]
data="".join([chr(x) for x in dataDecode])
open(outFileName,"wb").write(data)
if len(sys.argv) == 1:
print usage
exit()
elif sys.argv[1]=="-e" and len(sys.argv)==5:
encode(sys.argv[2],sys.argv[3],sys.argv[4])
elif sys.argv[1]=="-d" and len(sys.argv)==4:
decode(sys.argv[2],sys.argv[3])
else:
print usage
exit()
这是一条镜像帖。来源:北邮人论坛 / security / #15948同步于 2008/2/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
来show一下我的信息隐藏脚本
wks
2008/2/17镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
支持原创,加精!
【 在 wks (cloverprince) 的大作中提到: 】
: 信息隐藏技术只在信息安全课上听过,以前从来没有用过真的软件。假期学习了Python语言,发现这个语言的标准库非常强大,很容易可以完成很多高级的功能(图像处理还是需要第三方的扩展库)。于是,花了一点时间练习一下,实现这个技术。
: 我的思路就是老师讲的常用方法:将信息隐藏在一幅图片(位图)的每个像素每种颜色的低比特中。由于人的眼睛对微小的颜色变化不敏感,直接观察图片是无法看出其中的信息的。
: 具体实现:图像中,每个像素分成红绿蓝三种颜色,每个颜色的强度用8比特存储,一个像素就是24比特。我在这24比特中隐藏8比特的信息:红色和蓝色分别3比特,绿色2比特(因为人眼对绿色比较敏感),都用最低比特位。数据从图像左上角开始,逐行存储。前4个像素储存被隐藏�
: ...................
还是matlab的imread()看着比较爽。。。。。。
你们老师没给你讲这种隐藏方法,加大了最低bit信息的随机性,可以通过卡方分析的方法(RS算法)预测隐藏的信息量了?
继续写个RS检测算法吧~~~
晕,卡方检验和RS分析是不同的算法
【 在 BookMoth 的大作中提到: 】
: 还是matlab的imread()看着比较爽。。。。。。
: 你们老师没给你讲这种隐藏方法,加大了最低bit信息的随机性,可以通过卡方分析的方法(RS算法)预测隐藏的信息量了?
: 继续写个RS检测算法吧~~~