任务目标:
本选题需要学习经典的图像信息隐藏算法,包括基于空域的隐写算法和数字水印算法。 接着你将使用某种编程语言实现这些算法,实现在图片中嵌入一些信息,例如字符串和一些 文件。除此之外,还需要尝试一些基础的隐写检测方法,用于分析图像是否被嵌入了隐藏信 息。最后,将这些算法封装成多个模块,并设计一个友好的 GUI 界面,使用户能方便地进行使用。
任务要求:
1、学习信息隐藏的概念,掌握基本的图像隐写算法;
2、实现 LSB 隐写、DCT 隐写和 F5 隐写,其中 LSB 隐写必须实现,其他两种隐写算法至少选择一个实现,学有余力可以实现其他更好的算法;
3、掌握并实现任意一种 LSB 隐写检测方法,例如基于值对现象的检测方法;
4、设计一个 GUI 界面集成这些功能,可以实现字符串或文件的隐写和读取;
5、还有时间的情况下,实现图片嵌入盲水印的功能。
演示须知:
本次实例使用Pycharm开发
python版本为3.6
特色
1,通过大量调研,学习掌握了信息隐藏的概念,掌握基本的图像隐写算法;
2,实现了基于LSB的隐写术,其他隐写算法实现了原理阐释;
3,设计出了两种LSB隐写检测方法:灰度图像值对法,二次随机隐写检测;
4,实现了图像对于水印的加注以及还原水印图像的演示开发
5,功能性模块的演示部分使用了GUI实现。
不足
对于隐写术的理解我们理解的不是很深刻,并且对于Python以及Matlab的开发能力不足,只作教学演示,没有办法投入现实应用。
演示结果:
LSB隐写结果:
如图4.1所示,使用LSB隐写后携带消息比特串后其图像不可由肉眼看出差异。
使用值对直方图检测隐写
如图4.2.2所示,我们利用LSB隐写所引发的统计的不对称性,通过值对的直方图可以清晰的看出,在经过LSB隐写处理后,图像的值对会出现一种类似于削峰的状态,即相邻的值对的值会趋于一致的情况,以此来检测图像是否被隐写过。
代码部分:
实现LSB的隐写完整代码:
from PIL import Image
def mod(x, y):
return x % y
def bin_ord(flag):
string = ""
with open(flag) as f:
txt = f.read()
for i in range(len(txt)):
string = string + bin(ord(txt[i])).replace('0b', '').zfill(8)
return string
def hide(pic, flag, new_pic):
count = 0
im = Image.open(pic)
width = im.size[0]
height = im.size[1]
string = bin_ord(flag)
for h in range(height):
for w in range(width):
pixel = im.getpixel((w, h))
x = pixel[0]
y = pixel[1]
z = pixel[2]
if count == len(string):
break
x = x - mod(x, 2) + int(string[count])
im.putpixel((w, h), (x, y, z))
count = count + 1
if count == len(string):
break
y = y - mod(y, 2) + int(string[count])
im.putpixel((w, h), (x, y, z))
count = count + 1
if count == len(string):
break
z = z - mod(z, 2) + int(string[count])
im.putpixel((w, h), (x, y, z))
count = count + 1
im.save(new_pic)
pic = r"C:\Users\81394\Desktop\test.png"
flag = r"C:\Users\81394\Desktop\flag.txt"
new_pic = r"C:\Users\81394\Desktop\new.png"
hide(pic, flag, new_pic)
实现LSB隐写信息提取的完整代码:
from PIL import Image
def mod(x, y):
return x % y
def extract(pic, lenth, hide):
binary = ""
string = ""
count = 0
im = Image.open(pic)
width = im.size[0]
height = im.size[1]
for h in range(height):
for w in range(width):
pixel = im.getpixel((w, h))
x = pixel[0]
y = pixel[1]
z = pixel[2]
if count == lenth:
break
binary = binary + str(mod(x, 2))
count = count + 1
if count == lenth:
break
binary = binary + str(mod(y, 2))
count = count + 1
if count == lenth:
break
binary = binary + str(mod(z, 2))
count = count + 1
with open(hide, "w", encoding="UTF-8") as f:
for i in range(0, len(binary), 8):
string = string + chr(int(binary[i:i + 8], 2))
f.write(string)
pic = r"C:\Users\81394\Desktop\new.png"
lenth = 200
hide = r"C:\Users\81394\Desktop\hide.txt"
extract(pic, lenth, hide)
值对直方图隐写检测设计完整代码:
# encoding = utf-8
import cv2
import matplotlib.pyplot as plt
def get_gary_value(path):
img = cv2.imread(path, 0)
pixel_value = []
gary_index = []
for i in range(256):
pixel_value.append(0)
gary_index.append(i)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
pixel_value[img[i][j]] = pixel_value[img[i][j]] + 1
return pixel_value, gary_index
def draw_histogram(value1, value2, index, title1, title2):
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
p1 = plt.figure(figsize=(20, 30))
ax1 = p1.add_subplot(2, 1, 1)
plt.bar(index, value1)
plt.title(title1)
ax2 = p1.add_subplot(2, 1, 2)
plt.bar(index, value2)
plt.title(title2)
plt.show()
def r(my_value):
ans = 0
k2 = []
index = []
for i in range(1, 128):
h2i_star = (my_value[2 * i] + my_value[2 * i + 1]) / 2
tmp = pow((my_value[2 * i] - h2i_star), 2) / h2i_star
k2.append(tmp)
index.append(i)
ans = ans + tmp
print(ans)
return k2, index
if __name__ == '__main__':
img_path1 = './image/original.png'
img_path2 = './image/steg.png'
value_1, index1 = get_gary_value(img_path1)
value_2, index2 = get_gary_value(img_path2)
draw_histogram(value_1, value_2, index1, img_path1, img_path2)
plt.show()
隐写技术的分析
隐写技术概述
图像隐写术是关于信息隐藏,即不让计划的接收者之外的任何人知道信息的传递事件(而不只是信息的内容)的一门技巧与科学。它是用户将特定的信息隐藏在载体中,在信息传输中,监控者虽然知道用户有信息在传输信道中传输,但是无法察觉载体中隐藏特定的信息。但是,它又和图像加解密技术不同,图像加解密技术是用户利用数学或物理手段,对电子信息在传输过程中和载体中进行保护,以防止特定信息泄露的技术。
隐写术与加密的区别
隐写术隐藏 | 密码方法加密 | |
数据形式 | 媒体数据 | 密文 |
应用目的 | 保护数据传递和存储的行为不被发现 | 保护数据不被对手得到 |
安全性 | 抗检测能力 | 可证明安全性 |
对抗手段 | 隐写分析检测 | 密码分析 |
LSB隐写技术
LSB算法概念
LSB(Least Significant Bit)隐写算法,中文译名为最低有效位,是指一个二进制数字中的最低位。LSB隐写算法的基本思想是用待嵌入的隐私信息取代载体图像数据的LSB,构成载密图像。又因为LSB对图像的外部特征影响很小,所以人难以用肉眼看出载密图像的变化。然而,人眼不仅对LSB位不可感知,对比LSB位更高的某些位同样不可感知,这就意味着这些更高的位同样可以用嵌入隐秘信息。
LSB隐写算法流程
LSB隐写算法主要应用于将秘密信息嵌入到载体图像像素值的最低有效位(也称最不显著位),改变这一位置对载体图像的品质影响。
基于BMP图像实现LSB隐写的流程,如图3-1所示:
(1). 首先遍历BMP图像中的每个像素点,将图像中RGB值存在数组中;
(2). 然后将隐秘信息转换为二进制,并且插入每个RGB值的最后一位中,将RGB的数值转换为BMP图像,通过传输信道传输;
(3). 监控者察觉有信息传输接收者,监控者拦截信息查看传输信息中是由可疑信息,然而通过LSB算法进写的图像隐写后的载体图像,在内存等方面和原图像比几乎无差别,所以监控者不会怀疑,则信息继续传输;
(4). 最后接收者接收到载体图像后,通过LSB提取算法进行提取后得到隐秘信息。
LSB隐写的特点
1,抗检测能力越好,即被检测正确的正确率越低,则表示越安全;
2,隐写对数据的修改幅度跟数量远小于数字水印、可逆隐藏等方法
3,与其他类型信息隐藏方法相比,隐写术主要的特点是以对抗检测为目的,嵌入信息容量相对较大。
LSB隐写原理
最低比特位(Least Significant Bit)替换:
将媒体内容数据的最低比特位替换为需要嵌入的消息比特串
如图2.2.3.2所展示的,之所以使用最低比特位是因为最低比特位所携带的信息比较少,基本上是噪声,所以不太会影响得到整体图像的呈现,并且用肉眼不会看得出极小的细微差距。
LSB替换隐写按照嵌入位置选取方法的方法可以分为两种:连续嵌入法和随机间隔法 ,之间的区别如图2.2.3.3所示。
改进的LSB方法
注意,对整数加减1都能反转最低比特位
所以需要修改的时候可以根据随机数随机选择+1或-1,使得双向转移提取方只需要提取最低比特位即可,无需知道修改操作;LSB matching 改进非常的简单,但使得对LSB替换方法的检测方法全都失效,采用+1和-1修改还能够同时先择是否扰动次低比特位,这成为后来双层嵌入的基础。