• 隐写术----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数据丢失,这种情况下会导致数据恢复的时候存在问题,所以在数据恢复的时候需要注意,或者在数据隐写的时候进行更加完整的编码

  • 相关阅读:
    【Linux】感性认识冯诺依曼体系结构和操作系统
    没有弹性盒,如何玩转移动端?
    DOM文档对象模型
    番外篇 | 利用华为2023最新Gold-YOLO中的Gatherand-Distribute对特征融合模块进行改进
    Spark基础:Kafka分布式消息系统
    MyBatis-Plus——条件构造器——QueryWrapper查询条件封装
    C++ :输出 Hello, World
    大兴机场引入明道云,打造敏态应用开发平台
    动态权重之多任务不平衡论文 (一)
    十二烷基硫酸钠(SDS)将Fe3O4磁性纳米粒子定量地修饰到多壁碳纳米管|化学试剂
  • 原文地址:https://blog.csdn.net/sxr__nc/article/details/127071178