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

  • 相关阅读:
    P1045 [NOIP2003 普及组] 麦森数 python 题解
    Spring后处理器-BeanPostProcessor
    视频教程下载:用ChatGPT的 API 开发AI应用指南
    贪心算法-
    【无标题】
    使用单调队列解决 “滑动窗口最大值” 问题
    【PHP】自研框架QPHP,qphp框架使用
    BUUCTF---misc---[SWPU2019]我有一只马里奥
    【漏洞复现】WordPress插件wp-file-manager任意文件上传漏洞(CVE-2020-25213)
    Docker高级-4.可视化工具Portainer/容器监控之CAdvisor+InfluxDB+Granfana
  • 原文地址:https://blog.csdn.net/sxr__nc/article/details/127071178