隐写术----LSB隐写

0x00 前言

前文介绍过PNG的文件格式,以及如何在不影响正常浏览的前提下在PNG文件中隐写payload。这次介绍另一种隐写技巧——LSB隐写
其实LSB隐写术已经有很多大佬发了文章介绍,我只是一个知识的搬运工,在这个过程中丰富下自我,资料很多,就不一一添加参考链接了

0x01所谓LSB隐写术

LSB隐写术其实就是最低有效位隐写术,这种方式存在的主要原理是借助图片文件在计算机的存储方式,众所周知,计算机只认识二进制数据,也就是01数据,因此不管再鲜艳的数据,再计算机看来其实就是一串串的01数据。在这其中还有一个三原色的东西。计算机显示出来的不同颜色的图片归功于三原色,但是同样的三原色在计算机眼中也只是二进制串。
  三原色组成多种颜色形似,三种颜色存在形式:

R    255    11111111
G    255    11111111
B    255    11111111

得益于颜色在计算机中的存储形式,我们可以将要隐写的数据写入图片的每个8位二进制数据的最低位(为什么是最低位?因为蟹盖最低位的数据对颜色影响效果最低,基本不会影响浏览观看图片)。

0x02LSB隐写术实现

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"

0x03payload数据提取

这里提供基本思路:
1:读取加入隐写数据的图片文件
2:通过读取像素点的最低位把所有的隐写数据提取出来
3:提取出来的二进制数据再进行数据格式转换,转换为正常的payload

注意点
部分数据在转换为二进制数的时候会把最开始的0数据丢失,这种情况下会导致数据恢复的时候存在问题,所以在数据恢复的时候需要注意,或者在数据隐写的时候进行更加完整的编码

你可能感兴趣的:(隐写术,隐写术,LSB隐写)