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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
没有积分的私聊我 看到消息百分百发给你 1、算法核心: 1、读取图片A,获得其RGB三个通道数据并转换成三个矩阵a1,a2,a3。 2、读取文件B,将其转换成比特流b。 3、遍历b,得到比特b1,b2,b3,b4,b5,b6等等,将b1代替a1第一个元素的最低位,将b2代替a2第一个元素的最低位,将b3代替a3第一个元素的最低位,将b4代替a1第二个元素的最低位,以此类推。 2、具体实现: 1、隐写: 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用java NIO读取被嵌入的文件,将其转换为byte数组,需要特别指出的是原生方法得到是byte类型的数组,但是算法实现需要更加精细的操作,所以还需要对得到的byte数组进行进一步的转换封装,将其转换成形如10101的数组。例如,读取文件得到byte数组的第一个元素为63,需将63转换为00111111数组。并且保存好文件的长度。 3、按照算法,遍历形如10101的数组 1、如果遍历到的值为0,将矩阵对应的矩阵元素与0xfe进行与运算,将最低位置为0 2、如果遍历到的值为1,将矩阵对应的矩阵元素与0x01进行或运算,将最低位置为1 4、将步骤3得到的经过经过隐写的矩阵写为一张新的图片。 3、读取 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用隐写步骤3得到的文件长度,遍历图片的像素矩阵,需要特别指出的是因为后续步骤还需要进行进一步的转化,所以这一步是将得到的“100100......”序列每八位封装为一个数组,最终得到一些数组集合,每个数组包含八位二进制序列。 3、将步骤2得到的数组进行转换,例如00111111应该转换为byte类型数值为63的数字,10111111转换为-63。这一步会得到一个byte类型的数组。 4、将步骤3得到的byte类型数组写入文件,需要指出的是写入的文件形式应该和隐写模块步骤二中读入的文件形式一致。 3、程序使用方法 1、安装Java8 2、使用命令行进入jar文件所在目录下,使用命令 java -jar 2016115130.jar 3、安装提示输入嵌入和被嵌入的文件名字,注意路径问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值