前文介绍过PNG的文件格式,以及如何在不影响正常浏览的前提下在PNG文件中隐写payload。这次介绍另一种隐写技巧——LSB隐写
其实LSB隐写术已经有很多大佬发了文章介绍,我只是一个知识的搬运工,在这个过程中丰富下自我,资料很多,就不一一添加参考链接了
LSB隐写术其实就是最低有效位隐写术,这种方式存在的主要原理是借助图片文件在计算机的存储方式,众所周知,计算机只认识二进制数据,也就是01数据,因此不管再鲜艳的数据,再计算机看来其实就是一串串的01数据。在这其中还有一个三原色的东西。计算机显示出来的不同颜色的图片归功于三原色,但是同样的三原色在计算机眼中也只是二进制串。
三原色组成多种颜色形似,三种颜色存在形式:
R 255 11111111
G 255 11111111
B 255 11111111
得益于颜色在计算机中的存储形式,我们可以将要隐写的数据写入图片的每个8位二进制数据的最低位(为什么是最低位?因为蟹盖最低位的数据对颜色影响效果最低,基本不会影响浏览观看图片)。
python实现LSB隐写术:
from PIL import Image
def ReadFile(destFile):
f=open(destFile,"rb")
s=f.read()
binstr=""
#转换格式
for i in range(len(s)):
binstr=binstr+(bin(s[i]).replace("0b",""))
f.close()
return binstr
if __name__=="__main__":
destFile="C:\\Users\\0.png"
destpayload="C:\\Users\\1.txt"
binpayload=ReadFile(destpayload)
img=Image.open(destFile)
width, height=img.size
payloadLen=len(binpayload)
count=0
for i in range(width):
for j in range(height):
if count==payloadLen:
break
else:
sourceBit=img.getpixel((i,j))
#之后需要把每一位要隐藏的数据替换到RGB的每一个地位里边
r=sourceBit[0]
r=r-r%2+int(binpayload[count])
count=count+1
if count==payloadLen:
img.putpixel((i,j),(r,g,b))
break
g=sourceBit[1]
g=g-g%2+int(binpayload[count])
count=count+1
if count==payloadLen:
img.putpixel((i,j),(r,g,b))
break
b=sourceBit[2]
b=b-b%2+int(binpayload[count])
count=count+1
if count==payloadLen:
img.putpixel((i,j),(r,g,b))
break
if count%3==0:
img.putpixel((i,j),(r,g,b))
img.save("C:\\Users\\1.png"
这里提供基本思路:
1:读取加入隐写数据的图片文件
2:通过读取像素点的最低位把所有的隐写数据提取出来
3:提取出来的二进制数据再进行数据格式转换,转换为正常的payload
注意点
部分数据在转换为二进制数的时候会把最开始的0数据丢失,这种情况下会导致数据恢复的时候存在问题,所以在数据恢复的时候需要注意,或者在数据隐写的时候进行更加完整的编码