LSB信息隐藏——Python实现(完整解析版)

news2024/11/26 12:34:10

系列文章目录

仿射密码实验-Python实现
仿射密码实验——Python实现(完整解析版)
DES密码实验-C语言实现
MD5密码实验——Python实现(完整解析版)


文章目录

  • 系列文章目录
  • 前言
  • 实验方法
  • 实验环境
  • 实验内容
  • 实验步骤
    • 1.LSB原理
    • 2.确定设计模块
      • Lsb——embded
      • Lsb——extract
  • 实验结果
  • 实验心得
  • 完整代码


前言

1)了解图像平面位
2)掌握LSB信息隐藏的实现


实验方法

根据给出的LSB算法的描述,用所熟悉的语言,完成实验内容并简要描述实验操作步骤。

实验环境

计算机语言:Python
开发环境:Pycharm

实验内容

根据LSB算法完成LSB信息隐藏的实现。包括:信息嵌入、信息取出。

实验步骤

1.LSB原理

每个像素点的颜色RGB可以用十进制0~255的数值表示。LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而且每一个像素位点携带了一位信息,那么就可以利用八个字节的最低位存储一个比特信息,而该比特信息则可以转化为ASCII字符,从而达到隐写信息的目的。

2.确定设计模块

1.lsb_embed
2.lsb_extract
3.main函数(主程序)

项目架构:

Pic:存放图片
Txt:存放待嵌入信息和提取后信息
LSB-main:运行程序文件
在这里插入图片描述

Lsb——embded

1.用PIL库的Image读取图片像素信息
2.利用numpy库将读取的像素信息处理为矩阵
在这里插入图片描述

3.输入路径,读取待隐写的文件,将之前读取的图片一并拷贝
在这里插入图片描述

4.对每位字符进行ASCII处理,取到的二进制数由6位填充至8位
自定义函数cover_lsb进行lsb隐写操作
对于最低有效位LSB,用if判断进行替换选择二进制为0还是1
在这里插入图片描述
5.剩余未填充位进行补充填位,使得图像能够恢复
6.再使用处理后的新矩阵来生成嵌入图片

Lsb——extract

1.用PIL库的Image读取图片像素信息
2.利用numpy库将读取的像素信息处理为矩阵
在这里插入图片描述

3.提取过程中寻找最低位
在这里插入图片描述

4.用到lsb_decode来找寻最低位并返回
在这里插入图片描述

5.得到的数据进行二进制转ASCII的操作

实验结果

开启程序
在这里插入图片描述

1.隐写

在这里插入图片描述

进行人眼观察,嵌入信息后的图片与原图看不出明显差别
在这里插入图片描述

2.提取

在这里插入图片描述
在这里插入图片描述

提取的信息与原信息进行比对后,确认提取信息成功。
在这里插入图片描述

实验心得

本次实验做了关于LSB信息隐藏的实现,接触到了LSB作为一种隐写术的优缺点,比如它的原理十分简单,可以通过一些脚本快速实现嵌入信息,且嵌入后的图片psnr值得到保证的情况下就不容易被人眼看出,实现数据隐写;但同时它的鲁棒性不佳,相对于数字水印,容易通过工具如stegsolve进行分析得出或者脚本程序进行信息提取。
对于本次实验的代码,在提取部分是通过原始信息的长度来确定遍历的次数,在实际过程中一般是不知道提取信息的长度,这时候就需要尽量将遍历长度设置大一些,这样就算超过原始信息长度也可以通过无意义字符进行排除,从而获取最后的有效信息。

完整代码

# -*- coding: utf-8 -*-
# @Time    : 2022/10/17 14:38
# @Author  : 4v1d
# @File    : LSB-main.py
# @Software: PyCharm
import numpy as np
import PIL.Image as Image



def lsb_embed(pic_src,file_src):
    # 读取图片的像素信息
    picture = Image.open('{}'.format(pic_src))
    pic_data = np.array(picture)

    # 读取要隐写的文件
    with open('{}'.format(file_src), encoding="utf-8") as file:
        secrets = file.read()

    # 将图片拷贝一份,作为最终的图片数据
    im_data = np.array(picture.copy()).ravel().tolist()

    def cover_lsb(bin_index, data):
        '''
        :param bin_index:  当前字符的ascii的二进制
        :param data: 取出数组像素的八个数值
        :return: LSB隐写后的字符
        '''
        res = []
        for i in range(8):
            data_i_bin = bin(data[i])[2:].zfill(8)
            if bin_index[i] == '0':
                data_i_bin = data_i_bin[0:7] + '0'
            elif bin_index[i] == '1':
                data_i_bin = data_i_bin[0:7] + '1'
            res.append(int(data_i_bin, 2))
        return res

    pic_idx = 0
    # 采用LSB隐写技术,横向取数据,每次取9个数据,改变8个像素最低位
    res_data = []
    for i in range(len(secrets)):
        # 拿到隐写文件的字符ascii数值, 并转换为二进制,填充成八位
        index = ord(secrets[i])
        bin_index = bin(index)[2:].zfill(8)
        # 对数据进行LSB隐写,替换操作
        res = cover_lsb(bin_index, im_data[pic_idx * 8: (pic_idx + 1) * 8])
        pic_idx += 1
        res_data += res
    # 对剩余未填充的数据进行补充填充,防止图像无法恢复
    res_data += im_data[pic_idx * 8:]

    # 将新生成的文件进行格式转换并保存,此处一定保存为压缩的png文件
    new_im_data = np.array(res_data).astype(np.uint8).reshape((pic_data.shape))
    res_im = Image.fromarray(new_im_data)
    res_im.save('./pic/res_encode.png')
    print("在pic中已生成res_encode.png")

def lsb_extract(pic_src,file_src):
    # 打开隐写文件
    picture = Image.open('{}'.format(pic_src))
    pic_datas = np.array(picture).ravel().tolist()

    with open('{}'.format(file_src), encoding="utf-8") as file:
        secrets = file.read()

    str_len = len(secrets)
    # print('字符的长度为:', str_len)

    # 将图片拷贝一份,作为最终的图片数据
    im_data = np.array(picture.copy()).ravel().tolist()

    def lsb_decode(data):
        '''
        :param bin_index:  当前字符的ascii的二进制
        :param data: 取出数组像素的八个数值
        :return: LSB隐写后的字符
        '''
        str = ''
        for i in range(len(data)):
            print(bin(data[i])[2:])
            data_i_bin = bin(data[i])[2:][-1]
            str += data_i_bin
        return str

    pic_idx = 0
    # 采用LSB隐写技术,横向取数据,每次取9个数据,改变8个像素最低位
    res_data = []

    for i in range(str_len):
        # 拿到第i个数据,转换成二进制
        data = im_data[i * 8: (i + 1) * 8]
        data_int = lsb_decode(data)
        # 找到最低位
        res_data.append(int(data_int, 2))

    # 将二进制数据转换成ASCII
    str_data = ''
    for i in res_data:
        temp = chr(i)
        str_data += temp
    print("提取成功,输出下列解密结果")
    print(str_data)
    with open('./txt/secret_out.txt', 'w',encoding="utf-8") as file:
        file.write(str_data)
    print('已保存在txt/secret_out.txt中')


if __name__ == '__main__':
    title = """
.____       ___________________            __                .__   
|    |     /   _____/\______   \         _/  |_  ____   ____ |  |  
|    |     \_____  \  |    |  _/  ______ \   __\/  _ \ /  _ \|  |  
|    |___  /        \ |    |   \ /_____/  |  | (  <_> |  <_> )  |__
|_______ \/_______  / |______  /          |__|  \____/ \____/|____/
        \/        \/         \/                                    
    """
    print(title)
    print("当前目录下pic文件夹中存放图片,txt文件夹存放待加密信息和解密信息")
    while True:
        choice = input("请输入数字选择功能:1.隐写 2.提取 3.退出 :")
        if choice=='1':
            img_src = input('请输入图片路径:')
            file_src = input('请输入文件路径:')
            lsb_embed(img_src,file_src)
        elif choice=='2':
            img_src = input('请输入图片路径:')
            file_src = input('请输入文件路径:')
            lsb_embed(img_src,file_src)
            lsb_extract(img_src,file_src)
        else:
            print("感谢使用,请自行到相应文件夹查看结果")
            break

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

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

相关文章

performance_schema 初相识 配置详解 应用

千金良方&#xff1a;MySQL性能优化金字塔法则 第4章 performance_schema初相识 第5章 performance_schema配置详解 第6章 performance_schema应用示例荟萃 简介 1、实时监控Server性能监控和诊断的工具 2、它提供了丰富的性能指标和事件&#xff0c;可以帮助你深入了解 MyS…

2023年6月PMP®项目管理认证招生简章

PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。国内众多企业已把PMP认证定为项目经理人必须取得的重要资质。 【PMP认证收益】 1、能力的提升&#xff08;领导力&#xff0c;执行力&#xff0c;创新能力&#xff0c…

python 编译安装指定版本 for linux

python环境是linux中必备的&#xff0c;部分发行版会自带python&#xff0c;有时候需要安装手动安装 注意&#xff1a;如果需要多个版本并存&#xff0c;建议使用conda环境&#xff0c;如果自己配置多版本&#xff0c;需要用多个软链接 conda环境&#xff0c;可以参考&#x…

【CSS Zoro 01】说在前面 CSS概念 CSS语法 CSS选择器 元素 id 类 组合 通用 分组 属性 后代 子元素 相邻兄弟

CSS 说在前面概念语法 syntaxCSS选择器 说在前面 最近挺喜欢看One Piece的&#xff0c;并且发现前端三剑客如果对应上Sanji&#xff0c;Zoro和Luffy的话会很有趣&#xff0c;所以说非常想在博客里面对应上小彩蛋&#xff0c;即使会损失一些SEO&#xff0c;但是这样做对我来说很…

算法修炼之筑基篇——筑基一层(解决01背包问题)

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法修炼之练气篇​​​​​ ✨博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了&#xff0c;下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期…

raise AssertionError(“Torch not compiled with CUDA enabled“)

1、运行代码可知&#xff0c;当前cuda不可用。 import torch print(torch.cuda.is_available()) # False 2、打开power shell or cmd&#xff0c;输入nvidia-smi命令&#xff0c;检查当前英伟达显卡信息。 可知当前驱动版本512.78&#xff0c;支持的cuda最高版本为11.6&…

时间序列教程 六、深度学习与时间序列分析结合

一、深度学习方法 与传统的时间序列预测模型相比,神经网络有以下几个好处: 1、自动学习如何将趋势、季节性和自相关等系列特征纳入预测。 2、能够捕捉非常复杂的模式。 3、可以同时建模许多相关的系列,而不是单独处理每个系列。 但是神经网络有一些劣势: 1、模型的构建可能…

PyCharm开发工具的安装与使用

PyCharm集成开发工具(IDE),是当下全球python开发者&#xff0c;使用最频繁的工具软件。绝大多数的python程序&#xff0c;都是在PyCharm工具内完成的开发。 1.先进行下载并安装它 下载官网地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows 宝子…

SpringBoot自定义拦截器实现权限过滤功能(基于责任链模式)

前段时间写过一篇关于自定义拦截器实现权限过滤的文章&#xff0c;当时是用了自定义mybatis拦截器实现的&#xff1a;SpringBoot自定义Mybatis拦截器实现扩展功能(比如数据权限控制)。最近学习设计模式发现可以用责任链模式实现权限过滤&#xff0c;因此本篇采用责任链模式设计…

Docker(概述、安装、配置、镜像操作)

一、docker是什么&#xff1f; docker是一种go语言开发的应用容器引擎&#xff0c;运行容器里的应用。docker是用来管理容器和镜像的一种工具。 容器引擎&#xff1a;docker、rocket、podman、containerd 容器与虚拟机的区别 容器&#xff1a;所有容器共享宿主机内核。使用…

【手撕Spring源码】AOP

文章目录 AOP 实现之 ajc 编译器AOP 实现之 agent 类加载AOP 实现之 proxyJDK代理CGLIB代理JDK动态代理进阶CGLIB代理进阶MethodProxy JDK 和 CGLIB 在 Spring 中的统一切点匹配从 Aspect 到 Advisor通知转换调用链执行静态通知调用动态通知调用 AOP 底层实现方式之一是代理&am…

Java/Compose Desktop项目中进行python调用

写在前面 开发compose desktop项目爬网站时遇到验证码处理不方便需要借助python庞大的处理能力&#xff0c;这时需要再项目中调用python去执行获取结果&#xff0c;这里记录一下使用过程。 本次开发记录基于&#xff1a;python 3.9&#xff0c;compose 1.3 java17 工具&#x…

2年测试我迷茫了,软件测试大佬都会哪些技能?我的测试进阶之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

【MCS-51单片机汇编语言】期末复习总结④——求定时器初值(题型四)

文章目录 重要公式T~机器~ 12 / ∫~晶振~(2^n^ - X) * T~机器~ T~定时~ 工作方式寄存器TMOD常考题型例题1题解方式0方式1 关于定时器的常考题目为已知晶振 ∫ 、定时时间&#xff0c;求定时器初值。 重要公式 T机器 12 / ∫晶振 (2n - X) * T机器 T定时 其中n为定时器位数…

线性代数2:矩阵(1)

目录 矩阵&#xff1a; 矩阵的定义&#xff1a; 0矩阵 方阵 同型矩阵&#xff1a; 矩阵相等的判定条件 矩阵的三则运算&#xff1a; 乘法的适用条件 矩阵与常数的乘法&#xff1a; 矩阵的乘法&#xff1a; 矩阵的乘法法则&#xff1a; Note1&#xff1a; Note2&…

【数据库】表数据delete了,表文件大小不变

背景 在本周的时候&#xff0c;接到了短信数据空间报警短信&#xff0c;提示的是磁盘空间占用80以上&#xff0c;而这个数据库总体的存储量一共100G&#xff0c;商量之后决定在不升配置的前提下&#xff0c;删除一些不需要的数据表。比如针对A表删除1000W数据。但是和DBA沟通后…

FAST-LIO2论文阅读

目录 迭代扩展卡尔曼滤波增量式kd-tree&#xff08;ikd-tree&#xff09;增量式维护示意图ikd-tree基本结构与构建ikd-tree的增量更新&#xff08;Incremental Updates&#xff09;逐点插入与地图下采样使用lazy labels的盒式删除属性更新 ikd-tree重平衡平衡准则重建及并行重建…

SMTP简单邮件传输协议(C/C++ 发送电子邮件)

SMTP是用于通过Internet发送电子邮件的协议。电子邮件客户端&#xff08;如Microsoft Outlook或macOS Mail应用程序&#xff09;使用SMTP连接到邮件服务器并发送电子邮件。邮件服务器还使用SMTP将邮件从一个邮件服务器交换到另一个。它不用于从服务器下载电子邮件&#xff1b;相…

jmeter安装及使用

jmeter安装及使用 一、说明二、安装2.1 目录结构 三、使用3.1 运行jmeter3.2 设置语言3.3 设置线程组3.3.1 设置压测请求3.3.2 设置汇总报告3.3.3 设置结果树 3.4 开始压测 四、导出执行报告4.1 保存配置4.2 执行命令4.3 生成报告常见问题 一、说明 最近需要对项目接口进行压测…

vue简单实现一个类似微信左右滑动更多功能

1、需求背景 产品需要在购物车加一个左右滑动更多的功能&#xff0c;由于是PC端&#xff0c;大致扫描了下使用的UI库&#xff0c;貌似没有单独提供此类组件&#xff0c;反正有时间&#xff0c;就自己造一个轮子试试 2、先看效果 大致有一个橡皮筋的效果&#xff0c;可能没那…