基于空间域的信息隐藏关键技术研究

实践题目:基于空间域的信息隐藏关键技术研究

目标是实现对320x240的灰度图像(样本自选,不能是lena图像)进行信息隐藏设计,应用空间域信息隐藏方法(例如LSB替换方法等)进行实验测试。对上述技术和方法进行实验、结果分析、比较等,特别是对其健壮性(抗攻击)进行分析。

实验报告要求

  1. 调研和算法说明,算法框图等;
  2. 有matlab仿真实验,有实验图形和实验结果分析,健壮性分析等;
  3. 5页以内的word文档。

方法种类

  • LSB算法9(原始算法
  • 伪随机置换
  • 利用奇偶校验位
  • 基于调色板的图像
  • 基于量化编码的隐藏信息
  • 在二值图像中隐藏信息

LSB(Least Significant Bits)算法

  • 嵌入过程描述:选择一个载体元素的子集{j1, j2, j3…jm},其中共有L(m)个元素,用以隐藏秘密信息的L(m)个比特,然后再这个子集上执行替换操作,把最低比特位用秘密信息来替换。
  • 提取过程描述:找到嵌入信息的伪装元素自己{j1,j2,j3…jm},从这些伪装对象中抽出最低比特位,排列之后组成秘密信息m。
  • 载体位置的选择
    • 从第一个元素开始嵌入,秘密信息嵌入完成后,后面未嵌入信息的载体嵌入伪随机序列
    • 从第一个元素开始嵌入,秘密信息重复嵌入,直至载体结束。
    • 发送方与攻击方一起使用一个伪装密钥k作为伪随机数发生器的种子,生成一个共同的伪随机序列,把这个伪随机序列与索引结合生成隐藏信息的载体子集,并将秘密信息嵌入载体。

j 1 = k 1 j_1 = k_1

j i = j i 1 + k i , i > = 2 j_i = j_{i-1} + k_i,i>=2

伪随机置换

该算法描述的是当索引产生碰撞时的解决方法(如果对伪随机数发生器的输出不加任何限制的话,同一索引值可能出现多次,称这种情况为碰撞):

  • 为了防止发生碰撞,发送端可以使用一个集合B用以记录所有已经使用过的载体索引值
  • 当再次出现同样的索引值时,则放弃这个索引值,选择下一个元素。

最低比特位隐藏信息优缺点

优点:

  • 算法简单,容易实现
  • 隐藏容量较大,大部分都是私钥隐藏方法或者无密钥隐藏方法。

缺点:

  • 安全性不高,如果伪装对象被叠加上一些噪声(人为干扰或者信道噪声),或者为了适应传输信道,对图像和声音进行了有损压缩,或者是攻击者有意的破坏等,都可以擦除隐藏的信息,使得接收者无法正确恢复出秘密信息。

利用奇偶校验位

  1. 将载体分成几个不重叠的区域,在一个载体区域中存储一个比特信息。
  2. 计算每个区域最低比特的奇偶校验位
  3. 并选择一个载体元素的最低比特位存放这个区域的奇偶校验位
  4. 嵌入信息时,在奇偶校验位上存放秘密信息。
  5. 如果秘密信息与奇偶校验位不匹配,则将该区域所有元素的最低比特位进行翻转,导致奇偶校验位与秘密信息相同。

基于调色板的图像

背景:

  • 图像的表示方法有两种,一种实在图像矩阵中直接存放像素的实际数据;另一种是基于调色板的图像。
  • 基于调色板的图像由两部分构成,一部分是调色板数据,它定义了n种颜色的索引对,每个索引对应的颜色值;另一部分是实际图像数据,它保存每一个像素的调色板索引,并不保存实际的颜色值。
  • 当图像仅使用了一小部分颜色值时,这种方法可以大大减小文件的尺寸。

对于基于调色板的图像,LSB的隐藏信息有两种方法:

  • 一种是对调色板的颜色向量LSB的修改。
  • 另一种是对图像数据(索引数据)的LSB修改。

基于量化编码的信息隐藏

  • 事先建立一个伪装密钥的表,表中为每一个茶凉分配了一个比特
  • 通过改变载体信号之间的差分信号来隐藏信息
    • 计算对应的差分信号
    • 如果匹配,则差分信号不变
    • 如果不匹配,则查表将最接近的差分信号替换

在二值图像中隐藏信息

  1. 首先将一个二值图像分为m个矩形图像区域
  2. 如果其中黑色像素的个数大于一半,则嵌入0,否则嵌入1
  3. 当需要嵌入的比特与所选区域的黑白像素比例不一致时,需要对像素进行调整
  4. 设定ɑ,当所选像素块一种颜色的百分比大于50%+3*ɑ时,视作无效块。

另一种算法描述:

  1. 在二值图像中,连续像素具有同种颜色的概率很高。
  2. 因此对相同颜色的像素块进行计数。
  3. 若嵌入信息为0,则使其个数为奇数,1则相反。
  4. 通过更改游程长度来嵌入秘密信息

LSB算法的实现部分

使用LSB算法嵌入秘密信息

  • 嵌入的秘密信息:“the image is beautiful”
  • 原始图片名:“test.bmp”
  • 原始图片规格:320x240
  • 原始图片通道数:单通道(即灰度图)

在这里插入图片描述

from PIL import Image

### init
img_name = "test.bmp"

### 将flag值规格化,即先转ascii码,再转二进制,再八位对齐,前面补零
def flag_to_binary(flag):
    strr = ""
    for i in range(len(flag)):
        strr += str(bin(ord(flag[i])).replace('0b','').zfill(8))
    print(strr)
    return strr

### LSB算法的实现
def save_lsb_info(src, info, des):
    img = Image.open(src)
    img = img.convert('L')
    img.show()
    width, height = img.size
    key = flag_to_binary(info)
    num = 0
    for h in range(height):
        for w in range(width):
            value = img.getpixel((w,h))
            if num == len(key):
                break
            value = value - value%2 + int(key[num])
            num += 1
    img.save(des + "test_lsb.bmp")

### 调用
if __name__=='__main__':
    save_lsb_info(img_name, "the image is beautiful", '')

LSB算法提取秘密信息

from PIL import Image
import re

### 将嵌入的二进制信息提取出来
def take_lsb(src):
    info = ""
    img = Image.open(src)
    width, high = img.size
    for h in range(high):
        for w in range(width):
            value = img.getpixel((w, h))
            #print(R, G, B)
            info += str(value % 2)
    #print(info)
    return info
### 将提取出来的二进制信息先转十进制,再转ascii码
def decode_info(info):
    flag = re.findall('.{8}', info)
    secret = ""
    for i in range(len(flag)):
        #print(flag[i])
        ten = int(flag[i], 2)
        #print(ten)
        asc = chr(ten)
        #print(asc)
        secret += asc
    return secret
### LSB算法后没有加噪的图片
img_name = "test_lsb.bmp"
flag = take_lsb(img_name)
info = decode_info(flag)
print(info[0:22])

输出结果为嵌入的秘密信息

鲁棒性分析

给图片进行加噪处理

分别进行四种方式加噪处理

  • 加高斯噪声
  • 加盐噪声
  • 加胡椒噪声
  • 加椒盐噪声
import numpy as np
import cv2
import matplotlib.pyplot as plt
import skimage.util as ski
from PIL import Image

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

img = cv2.imread("test_lsb.bmp", cv2.IMREAD_GRAYSCALE)
img_1 = img.copy()
img_gaussian_001 = ski.random_noise(img_1, mode="gaussian", seed=None, clip=True, mean=0, var=0.05)
img_gaussian_001 *= 255

img_2 = img.copy()
img_salt = ski.random_noise(img_2, mode="salt", seed=None, clip=True, amount=0.1)
img_salt *= 255
img_3 = img.copy()
img_pepper = ski.random_noise(img_3, mode="pepper", seed=None, clip=True, amount=0.1)
img_pepper *= 255
img_4 = img.copy()
img_sp = ski.random_noise(img_4, mode="s&p", seed=None, clip=True, amount=0.1)
img_sp *= 255

plt.subplot(221)
plt.title("高斯噪声图像")
plt.imshow(img_gaussian_001, cmap='gray')
plt.subplot(222)
plt.title("加盐噪声图像")
plt.imshow(img_salt,cmap='gray')
plt.subplot(223)
plt.title("加胡椒噪声图像")
plt.imshow(img_pepper,cmap='gray')
plt.subplot(224)
plt.title("加椒盐噪声图像")
plt.imshow(img_sp,cmap='gray')
plt.show()

cv2.imwrite("img_gaussian_001.bmp", img_gaussian_001)
cv2.imwrite("img_salt.bmp", img_salt)
cv2.imwrite("img_pepper.bmp", img_pepper)
cv2.imwrite("img_sp.bmp", img_sp)

加噪图片显示如下

再使用上述提取算法提取信息

from PIL import Image
import re

### 将嵌入的二进制信息提取出来
def take_lsb(src):
    info = ""
    img = Image.open(src)
    width, high = img.size
    for h in range(high):
        for w in range(width):
            value = img.getpixel((w, h))
            #print(R, G, B)
            info += str(value % 2)
    #print(info)
    return info

### 将提取出来的二进制信息先转十进制,再转ascii码
def decode_info(info):
    flag = re.findall('.{8}', info)
    secret = ""
    for i in range(len(flag)):
        #print(flag[i])
        ten = int(flag[i], 2)
        #print(ten)
        asc = chr(ten)
        #print(asc)
        secret += asc
    return secret
### LSB算法后没有加噪的图片
img_name = "test_lsb.bmp"
flag = take_lsb(img_name)
info = decode_info(flag)
print(info[0:22])

### LSB算法后加高斯噪声的图片
img_name = "img_gaussian_001.bmp"
flag = take_lsb(img_name)
info = decode_info(flag)
print(info[0:22])
### LSB算法后加盐噪声的图片
img_name = "img_salt.bmp"
flag = take_lsb(img_name)
info = decode_info(flag)
print(info[0:22])
### LSB算法后加胡椒噪声的图片
img_name = "img_pepper.bmp"
flag = take_lsb(img_name)
info = decode_info(flag)
print(info[0:22])
### LSB算法后加椒盐噪声的图片
img_name = "img_sp.bmp"
flag = take_lsb(img_name)
info = decode_info(flag)
print(info[0:22])

结果分析

the image is beautiful
ݍ+¸6 2áj-v‰Y~d†I„QR
tèå imiçu is`bwautif÷n
the image ib bE!e4iful
thg hmame ès"bEautiFui
  • 经过高斯加噪生成的图片,LSB算法所嵌入的信息全部丢失;
  • 经过盐噪声,胡椒噪声,椒盐噪声生成的图片,LSB算法嵌入的信息丢失大半;
  • 可见,使用LSB算法所嵌入的信息极易被噪声干扰,导致信息隐藏的目的失效;
  • LSB算法鲁棒性不强,需要对其进行进一步改进,以抵御噪声干扰;
发布了267 篇原创文章 · 获赞 51 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/AcSuccess/article/details/103019226
今日推荐