网络信息安全-LSB图像隐写与检测的设计实现

news2024/11/15 19:30:07

任务目标:

本选题需要学习经典的图像信息隐藏算法,包括基于空域的隐写算法和数字水印算法。 接着你将使用某种编程语言实现这些算法,实现在图片中嵌入一些信息,例如字符串和一些 文件。除此之外,还需要尝试一些基础的隐写检测方法,用于分析图像是否被嵌入了隐藏信 息。最后,将这些算法封装成多个模块,并设计一个友好的 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.1  LSB的简化实现过程

如图2.2.3.2所展示的,之所以使用最低比特位是因为最低比特位所携带的信息比较少,基本上是噪声,所以不太会影响得到整体图像的呈现,并且用肉眼不会看得出极小的细微差距。

标图2.2.3.2 位图像呈现题

 LSB替换隐写按照嵌入位置选取方法的方法可以分为两种:连续嵌入法和随机间隔法 ,之间的区别如图2.2.3.3所示。

标图2.2.3.3 隐写的种类题

 

改进的LSB方法

注意,对整数加减1都能反转最低比特位

标题隐写算法的改进

 

所以需要修改的时候可以根据随机数随机选择+1或-1,使得双向转移提取方只需要提取最低比特位即可,无需知道修改操作;LSB matching 改进非常的简单,但使得对LSB替换方法的检测方法全都失效,采用+1和-1修改还能够同时先择是否扰动次低比特位,这成为后来双层嵌入的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吴恩达《机器学习》——Logistic多分类与神经网络

Logistic多分类与神经网络1. MINIST数据集与Logistic多分类MINIST简介数据集可视化Logistic如何实现多分类?One-Hot向量Python实现2. 神经网络(Neural Network, NN)神经网络前馈传播Python实现3. 基于PyTorch框架的网络搭建数据集、源文件可以在Github项目中获得 链…

使用CMake构建静态库和动态库

使用CMake构建静态库和动态库一、准备工作二、动态库的构建2.1 工程改造2.2 编译动态库2.3 更多的说明三、静态库的构建3.1 错误的尝试3.2 新的构建指令四、动态库的版本号五、安装动态库和头文件一、准备工作 本机演示环境为: 主机windows11 vscode 虚拟机安装的…

人工智能在药物研发和生物技术中的应用:回顾与展望

人工智能(Artificial intelligence, AI)的出现正在重新塑造整个制药和生物技术行业的发展。几乎所有大大小小的生命科学和药物发现机构,都对采用人工智能驱动的发现平台表现出浓厚的兴趣,希望通过AI来简化研发工作,减少发现时间和成本&#x…

【C++基础】10:STL(二)

CppSTL(二) OVERVIEWCppSTL(二)一、函数对象1.函数对象:(1)概述:(2)简单使用:2.谓词:(1)一元谓词:…

LVGL学习笔记10 - 按钮Button

目录 1. Check型按钮 2. 修改样式 2.1 设置背景 2.1.1 颜色 2.1.2 透明度 2.1.3 渐变色 2.1.4 渐变色起始位置设置 2.2 修改边界 2.2.1 宽度 2.2.2 颜色 2.2.3 透明度 2.2.4 指定边 2.3 修改边框 2.4 修改阴影 2.4.1 宽度 2.4.2 透明度 2.4.3 偏移坐标 2.3.…

PHP代码审计系列(五)

PHP代码审计系列&#xff08;五&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 数字验证正则绕过 源码如下 <?phperror_reporting(0); $flag flag{test}; if ("POST" $_SERVER[…

数值优化之凸集

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 凸集的定义 2 凸集的运算 1 凸集的定义 集合中任意两点连线形成的线段属于这个集合&#xff0c;这个集合是凸集。 注意&#xff1a;是否是凸集&#xff0c;集合的边界是否属于这个集合很重要 这涉及到构造最小凸包的问题…

行锁功过:怎么减少行锁对性能的影响?

在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,今天我们就来讲讲 MySQL 的行锁。 MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上…

Java中的四种引用类型

1.对象引用介绍 从 JDK1.2 版本开始&#xff0c;把对象的引用分为四种级别&#xff0c;从而使程序更加灵活的控制对象的生命周期。这四种级别由高到低依次为&#xff1a;强引用、软引用、弱引用和虚引用。 用表格整理之后&#xff0c;各个引用类型的区别如下&#xff1a; 2.强…

BOM编程:location对象

document 对象和window对象的location的区别 document对象的位置获取步骤是返回这个相关的全局对象的位置对象&#xff0c;如果这是完全活动的&#xff0c;否则为空。 Window对象的位置获取步骤是返回它的位置对象。每个Window对象都与创建Window对象时分配的Location对象的唯…

Spark01:Spark工作原理

1. Spark执行数据计算的整个流程 首先通过Spark客户端提交任务到Spark集群&#xff0c;然后Spark任务在执行的时候会读取数据源HDFS中的数据&#xff0c;将数据加载到内存中&#xff0c;转化为RDD&#xff0c;然后针对RDD调用一些高阶函数对数据进行处理&#xff0c;中间可以调…

ElementUI——案例1用户管理(基于SpringBoot)

1.前期准备 备注&#xff1a;主要涉及组件container组件&#xff0c;导航菜单组件&#xff0c;router路由组件&#xff0c;carousel 走马灯组件&#xff0c;Image组件&#xff0c;Table表格组件 #1.在项目开发目录使用脚手架新建vue项目&#xff08;需要提前安装好node和webp…

无字母数字webshell提高

前言 元旦快乐 -- 转眼就到了2023年 新的一年继续努力 在p神博客中看到一个 通过上传临时文件进行rce&#xff0c;便想着写一篇文章&#xff0c;记录一下这个小trick。太强了 比如给你下面这么一串代码。正如文章标题 无字母数字&#xff0c;如果匹配到字母和数字&#xf…

【Vuex快速入门】vuex基础知识与安装配置

vuex快速入门——什么是vuex&#xff1f;创作背景vuex基础知识一、vuex是什么&#xff1f;二、vuex的组成三、为什么使用vuex&#xff1f;四、什么时候使用vuex&#xff1f;vuex的安装配置一、直接下载 / CDN引用二、npm安装vuex三、yarn安装四、自己构建更多内容可参考Vuex官方…

[从零开始]用python制作识图翻译器·二

AlsoEasy-RecognitionTranslator需求分析系统分析功能拆解工程语言选择技术可行性分析具体实现需求分析 见上篇[从零开始]用python制作识图翻译器一 上篇分析了该产品的需求以及市场上的可行性&#xff08;没有被吊打的竞品&#xff09;。而本篇将着重于分析如何实现。 系统分析…

gateway基本配置

目录 1、gateway简介 2、gateway核心概念 3、路由 4、断言 5、过滤器 5.1、过滤器介绍 5.2、内置局部过滤器与使用 5.3、内置全局过滤器 5.4、自定义全局过滤器 5.4.1、黑名单校验 5.4.2、模拟登录校验 6、一个简单的gateway配置实例 1、gateway简介 路由转发 执行…

Linear Regression with PyTorch 用PyTorch实现线性回归

文章目录4、Linear Regression with PyTorch 用PyTorch实现线性回归4.1 Prepare dataset 准备数据集4.2 Design Model 设计模型4.2.1 __call__() 作用4.3 Construct Loss and Optimizer 构造损失和优化器4.4 Training Cycle 训练周期4.5 Test Model 测试模型4.6 Different Opti…

redis缓存淘汰策略

定时删除 Redis不可能时时刻刻遍历所有被设置了生存时间的key&#xff0c;来检测数据是否已经到达过期时间&#xff0c;然后对它进行删除。 立即删除能保证内存中数据的最大新鲜度&#xff0c;因为它保证过期键值会在过期后马上被删除&#xff0c;其所占用的内存也会随之释放。…

zookeeper学习笔记2(小D课堂)

zookeeper数据模型&#xff1a; 我们的zookeeper是以节点的形式存在的&#xff0c;这样的形式和数据结构中的树的形式很像。同时也很像我们的linux的结构&#xff0c;例如linux的/user/local目录下可以有我们的/usr/local/tomcat目录。这样的节点形式。 我们的zookeeper中的每…

算法练习-常用查找算法复现

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.1 Last edited: 2023.1.1 目录 算法练习-常用查找算法复现&#xff08;PS&#xff1a;1 -- 3自己写的&#xff0c;4、5懒得写了&#xf…