标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-2592] 作者: future 发表于: [2020-02-28]
本文共 [553] 位读者顶过
LSB图片隐写
简介
LSB全称为 least significant bit,是最低有效位的意思。Lsb图片隐写是基于lsb算法的一种图片隐写术。
从图片格式上说
一般来说图片有BMP、JPG、BNG等格式,BMP、PNG是无损压缩的图片,而JPG是有损压缩的图片,所以一般使用BNG或BMP进行信息隐藏。一般BMP是没有压缩过的图片,所以会比较大。
从图片像素上说
人类能说识别大概1000万中颜色,而BMP等的三原色有从0x00~0xFF,也就是有256的3次方,大概是1600多万,也就是说人类大概有600万颜色无法识别,但是机器并不是通过像素识别,而是通过该像素点的数值大小识别,所以在人类眼中一样的,在机器那不一样。一个像素点占8位,每位有3个颜色,每个像素点能隐藏3个信息。 [出自:jiwo.org]
所以低有效位的数据改变在人眼看来是一样的,所以在最后一位隐藏数据是一个有效的方法
LSB图片隐写的检测工具zsteg安装说明连接如下
示例攻防世界-misc-打野
一个蔡徐坤的.bmp文件
binwalk无果winhex无果
搜一下说是zsteg是一个可以检测png和bmp文件中隐藏数据的工具
网上找到的python实现LSB隐写
# -*- coding: UTF-8 -*-
from PIL import Image
def plus(str):
#Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
return str.zfill(8)
def get_key(strr):
#获取要隐藏的文件内容
tmp = strr
f = file(tmp,"rb")
str = ""
s = f.read()
for i in range(len(s)):
#逐个字节将要隐藏的文件内容转换为二进制,并拼接起来
#1.先用ord()函数将s的内容逐个转换为ascii码
#2.使用bin()函数将十进制的ascii码转换为二进制
#3.由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空
#4.又由于ascii码转换二进制后是七位,而正常情况下每个字符由8位二进制组成,所以使用自定义函数plus将其填充为8位
str = str+plus(bin(ord(s[i])).replace('0b',''))
#print str
f.closed
return str
def mod(x,y):
return x%y;
#str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
def func(str1,str2,str3):
im = Image.open(str1)
#获取图片的宽和高
width = im.size[0]
print "width:"+str(width)+"\n"
height = im.size[1]
print "height:"+str(height)+"\n"
count = 0
#获取需要隐藏的信息
key = get_key(str2)
keylen = len(key)
for h in range(0,height):
for w in range(0,width):
pixel = im.getpixel((w,h))
a=pixel[0]
b=pixel[1]
c=pixel[2]
if count == keylen:
break
#下面的操作是将信息隐藏进去
#分别将每个像素点的RGB值余2,这样可以去掉最低位的值
#再从需要隐藏的信息中取出一位,转换为整型
#两值相加,就把信息隐藏起来了
a= a-mod(a,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
b =b-mod(b,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
c= c-mod(c,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
if count % 3 == 0:
im.putpixel((w,h),(a,b,c))
im.save(str3)
#原图
old = "E:\Users\\test.png"
#处理后输出的图片路径
new = "E:\Users\\LSBencode.png"
#需要隐藏的信息
enc = "E:\Users\\flag.txt"
func(old,enc,new)
|