信息隐藏-空域隐藏-python-LSB
16lz
2021-01-22
LSB 中文名字全称为最低有效位。
常见的信息隐藏图片格式一般为png或者bmp这类无损压缩的图片且是8位图或者24位图,8位图是使用我们的调色板
来保存颜色值,可以正好代表2的8次方256种颜色。8位即占一个字节,24位图及占3字节,我们用r,g,b来表示。
对于这些字节的最后一位我们无论其是0或者1,这于这张照片的显示来说,我们从肉眼是分辨不出来的(实际上,最后3位我们都可以进行改变且我们同样从肉眼看不出其变化,甚至最后5位,6位的改变我们都可以看出图片的大致样子,也就是说最低有效位,我们隐藏的信息是可以放到每个像素字节的后3位,不仅仅是最后一位)
下面给出8位bmp格式图片的lsb隐藏及提取代码
-----------------------------------------------------------------------------------------------------------------------------------------
隐藏代码:
from PIL import Imageimport binasciifrom operator import mod#提取隐藏的图片的每位像素信息def puthide(): hide = Image.open(r"F:xinxi\lsb\hide.bmp")#将路径换了,这是我们需要隐藏的图片 c,d=hide.size #print hide.getpixel((0,1)) m='' for i in range(c): for j in range(d): #print hide.getpixel((i,j)) #获取字节(这里是8位图)变为8位二进制连接起来 m=m+str(bin(hide.getpixel((i,j))).lstrip('0b')).zfill(8) return mif __name__=='__main__': s=puthide() num=0 image=Image.open("F:xinxi\lsb\lena.bmp")#这里是在读取将要隐藏信息的图片载体 a,b=image.size if a*b<len(s):#我们这里只把字节最后一位用来隐藏 print "the picture is too big" for i in range(a): for j in range(b): if(num==len(s)): break #获取每一像素的字节(返回的是对于int型 如字节对应00000011 返回的就是3) a=image.getpixel((i,j)) a=a-mod(a,2)+int(s[num])#将最后一位进行改变 image.putpixel((i,j),a)#重新把字节最后一位已经插入信息插回像素对应位置 num+=1 image.save(r"F:xinxi\lsb\water.bmp")#保存
提取代码:
from PIL import Imageimport binasciifrom operator import modif __name__=='__main__': #这里需要注意实际上我是知道我隐藏的那张图片规格的,如果不知道,我是无法正确还原,因为我不知道 #具体图像像素如何分布 img=Image.new("L",(267,107))#新建一张和我隐藏图片一样大的图片 hideimage = Image.open("F:xinxi\lsb\water.bmp")#载入已经隐藏信息的图片 c,d=img.size a,b=hideimage.size num=0 m="" s=[] for q in range(a): for p in range(b): #将隐藏信息的图片每像素的字节最后一位提取 m=m+str(mod(hideimage.getpixel((q,p)),2)) num+=1 #每8位就进行一次计算,算出其对应8位二进制对应得10进制数字 if(num==8): m="0b"+m s.append(eval(m))#进行计算,并保存至一个list里面 num=0 m="" count=0 print len(s) for i in range(c): for j in range(d): if(count==len(s)): break #循环将每一个数字重新插回新建的图片中对元素图片进行还原 img.putpixel((i,j),s[count]) count+=1 img.save(r"F:xinxi\lsb\back.bmp")#保存图片
上面代码需要结合自己想要隐藏的图片信息进行相应改动(要缩进好),道理是一样的。
LSB是最基本空间域隐藏方法,实际过程中可以结合比如将需要隐藏的图片进行预先处理,同时将信息不用从头至尾,从上至下来来隐藏等操作来进行更好的隐藏。
更多相关文章
- python 3.3 爬虫之爬取图片
- 使用python将图片转换为字符图片
- python使用多进程爬取图片
- 怎样用Python3 写一个爬图片的程序?
- wxPython 显示一张图片
- 学习Python爬虫(五):爬取图片
- 【Python】python3实现网页爬虫下载图片
- 如何发送一个字节(或字节)来测试在我的应用程序中监听的套接字?
- 嵌入式linux 字节对齐 导致输出Alignment trap