python图片隐写_机窝安全--LSB图片隐写

人类能说识别大概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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值