上篇文章给大家简单讲了一下信息隐藏的概念,但概念再怎么简单讲也是枯燥无味。毛泽东同志也说过,实践出真知。只有实践过,才能理解如何利用信息隐藏技术隐藏信息和理解信息隐藏的原理。
上篇文章提到了一种常见的方式图像隐写,是利用LSB来进行隐写,LSB也就是最低有效位 (Least Significant Bit)。那什么又是最低有效位呢?这就有必要了解一下图片的组成原理。
首先来简单说一下图片的组成,图片中的像数一般是由三种颜色组成,即三原色,由这三种原色可以组成其他各种颜色,例如在PNG图片的储存中,每个颜色会有8bit。
LSB隐写就是修改了像数中的最低的1bit,在人眼看来是看不出来区别的,也把信息隐藏起来了。
红色通道最后一位被修改
譬如我们想把’A’隐藏进来的话,如这图,就可以把A转成16进制的0x61再转成二进制的01100001,再修改为红色通道的最低位为这些二进制串。
每个通道都修改最后一位,修改8次就能隐藏一个ASCii码
这里先挑选一张图片,和要隐藏的信息“dxctsk”。
原图
使用python将信息隐藏到原图里面,可得加工后的图片
处理后的图片
肉眼无法识别与原图的区别,使用工具查看隐写的信息
可以看到照片中隐含了一段信息,下面附上LSB隐写源码,供参考。
# -*- coding: UTF-8 -*-
from PIL import Image
def plus(str):
return str.zfill(8)
def get_key(strr):
#获取要隐藏的文件内容
tmp = strr
f= open(tmp,"rb")
str = ""
s = f.read()
for i in range(len(s)):
str = str+plus(bin((s[i])).replace('0b',''))
f.closed
return str
def mod(x,y):
return x%y;
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
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 = "D:\LSB\lena.png"
new = "D:\LSB\result.png"
enc = "D:\LSB\123.txt"
func(old,enc,new)
print ("图片隐写结束")
原文始发于微信公众号(SK安全实验室):信息隐藏实践—图片隐写
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论