LSB隐写(最低有效位的隐写),是指通过改变图片中像素的最低位来实现信息的隐藏的。这种隐写方式需要图片是无压缩的位图,因此一般用于bmp和png图片。
这里有需要注意的是图片的色彩格式,常见的格式有 RGB,灰度,和CMYK。
对于RGB三原色格式来说,一个像素是由3个字节构成的,因此一个像素可以实现3位的信息隐藏。对于灰度格式,一个像素是由一个字节构成的,只能隐藏1位的信息。而对于CMKY,一个像素是由4个字节构成的。
那么如何判断一张图片是哪一种色彩模式呢?我们可以借助pyhon中PIL库来实现(仅支持到python2.7,后面创建了兼容python3.x的叫作pillow)。借助Image对象的mode属性来实现。网上对于rgb隐写有很多,下面给出一个对灰度图片隐写的例子来看看。
这张黑白图片叫作胜利之吻,下载下来是一张bmp的图片,感兴趣的可以去了解它的历史。题目的名字叫作最低位的亲吻,应该就和lsb隐写有关了。
下面给出提取信息的代码(pthon 2.7):
from PIL import Image
#得到Image对象
img = Image.open('1.bmp')
print img.mode #打印的结果为L,代表的是灰度图片
width,height = img.size #size属性返回的是一个元组,代表了宽和高各多少像素
for i in range(0,width):
for j in range(0,height):
#根据(i,j)得到对应的像素点,对于rgb模式来说会得到一个三元组,
#而对本例子中的灰度模式,打印的结果是一个整数,因为它只有一个字节
dot = img.getpixel((i,j))
print "原像素为",dot #可以发现结果是一个0~255的数
if dot&0x1 == 0:
#按位与操作提取出每个像素(一字节)最低位二进制,因为一位二进制
#要么为0,要么为1,可以通过黑(0)白(255)的效果来分辨
img.putpixel((x,y),0)
else:
img.putpixel((x,y),255)
image.show()
结果会得到一张二维码,即可得到flag.