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

这篇具有很好参考价值的文章主要介绍了LSB信息隐藏——Python实现(完整解析版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

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



前言

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信息隐藏——Python实现(完整解析版)

Lsb——embded

1.用PIL库的Image读取图片像素信息
2.利用numpy库将读取的像素信息处理为矩阵
LSB信息隐藏——Python实现(完整解析版)

3.输入路径,读取待隐写的文件,将之前读取的图片一并拷贝
LSB信息隐藏——Python实现(完整解析版)

4.对每位字符进行ASCII处理,取到的二进制数由6位填充至8位
自定义函数cover_lsb进行lsb隐写操作
对于最低有效位LSB,用if判断进行替换选择二进制为0还是1
LSB信息隐藏——Python实现(完整解析版)
5.剩余未填充位进行补充填位,使得图像能够恢复
6.再使用处理后的新矩阵来生成嵌入图片

Lsb——extract

1.用PIL库的Image读取图片像素信息
2.利用numpy库将读取的像素信息处理为矩阵
LSB信息隐藏——Python实现(完整解析版)

3.提取过程中寻找最低位
LSB信息隐藏——Python实现(完整解析版)

4.用到lsb_decode来找寻最低位并返回
LSB信息隐藏——Python实现(完整解析版)

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

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

实验结果

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

1.隐写

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

进行人眼观察,嵌入信息后的图片与原图看不出明显差别
LSB信息隐藏——Python实现(完整解析版)

2.提取

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

提取的信息与原信息进行比对后,确认提取信息成功。
LSB信息隐藏——Python实现(完整解析版)

实验心得

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

完整代码

# -*- 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

到了这里,关于LSB信息隐藏——Python实现(完整解析版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【论文阅读】图像信息隐藏文章汇总(含代码)

    Large-capacity Image Steganography Based on Invertible Neural Networks CVPR2021;可逆网络ISN,大容量的实现是靠RGB通道的累加;无公开代码 Multitask Identity-Aware Image Steganography via Minimax Optimization IEEE Transactions on Image Processing2021;提出直接识别防止接收端泄密、其中恢复分支可选;主要涉及身份信息

    2024年04月09日
    浏览(53)
  • Python+OpenCV 实现图像位平面分层进行图像信息隐藏

     闲言:这篇博客回归了传统图像处理领域,主要是在研究生的数字图像处理课程上接触到了新的知识–图像位平面,觉得还挺有意思的,可以用来做信息隐藏,索性记录一下。因为拖延的缘故,到学期末才赶出来一篇,后续可能还会有一篇消除图像摩尔纹的trick介绍(如果

    2024年02月11日
    浏览(36)
  • 使用C#的窗体显示与隐藏动画效果方案 - 开源研究系列文章

    今天继续研究C#的WinForm的显示动画效果。 上次我们实现了无边框窗体的显示动画效果(见博文:基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 ),这次介绍的是未在任务栏托盘中窗体的显示隐藏动画效果的实现代码。 1、 项目目录; 下面是项目目录,由基本

    2024年02月14日
    浏览(36)
  • Python实现信息熵算法——附完整代码

    Python实现信息熵算法——附完整代码 信息熵是信息理论中的一个重要概念,用于描述信息的不确定性。在数据处理领域中,信息熵经常用来评估数据的复杂程度和统计特性。本文将介绍如何用Python实现信息熵算法,并提供附有完整源代码。 首先,我们需要了解信息熵的计算

    2024年02月13日
    浏览(39)
  • Python实现决策树算法:完整源码逐行解析

    决策树是一种常用的机器学习算法,它可以用来解决分类和回归问题。决策树的优点是易于理解和解释,可以处理数值和类别数据,可以处理缺失值和异常值,可以进行特征选择和剪枝等操作。决策树的缺点是容易过拟合,对噪声和不平衡数据敏感,可能不稳定等。 在这篇文

    2024年02月04日
    浏览(38)
  • python隐藏源码,生成pyd文件并调用的完整过程

    我们知道​ ​windows 系统有许多 DLL 后缀的文件,即动态链接库,在运行时链接到调用程序​​。在运行时链接到 DLL 之类的库的主要优点是,它可以促进代码重用,模块化体系结构和更快的程序启动。结果,DLL 在 Windows 操作系统周围提供了许多功能。​​pyd 这个 d 就是取自

    2024年02月04日
    浏览(51)
  • 【Python程序开发系列】利用git实现协同开发做开源贡献(完整过程)

    这是我的_ 第221篇 _原创文章。 写在前面 『数据杂坛』以 Python语言 为核心,垂直于 数据科学 领域,专注于(可戳👉) Python程序开发|数据采集|数据分析 |数据可视化| 特征工程| 机器学习 | 时序数据| 深度学习 | 人工智能 等技术栈交流学习,涵盖 数据挖掘 、 计算机视觉 、

    2024年03月24日
    浏览(45)
  • Vue3 + TypeScript + Uniapp 开发小程序【医疗小程序完整案例·一篇文章精通系列】

    当今的移动应用市场已经成为了一个日趋竞争激烈的领域,而开发一个既能在多个平台上运行,又能够高效、可维护的应用则成为了一个急需解决的问题。 在这个领域中,Vue3 + TypeScript + Uniapp 的组合已经成为了一种受欢迎的选择,特别是在开发小程序方面。Vue3 作为一个现代

    2024年02月09日
    浏览(43)
  • ACM论文LaTeX模板解析(四)| 文章顶部信息(Top matter))Part2

    本文收录于专栏:ACM 论文 LaTeX模板解析,本专栏将会围绕ACM 论文 LaTeX模板解析持续更新。欢迎点赞收藏+关注! 本文接着ACM论文LaTeX模板解析(三)| 文章顶部信息(Top matter))Part 1继续解析。 thanks :与 amsart 一样(也与标准 LATEX 不同),我们只允许在命令 title 和 autho

    2024年01月16日
    浏览(48)
  • DevOps系列文章 之 SnakeYAML解析与序列化YAML

    如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档 。 在DevOps平台系统中是基础的能力支持,不管是spring boot 的配置还是K8S 资源清单yaml 要在项目中使用SnakeYAML,需要添加Maven依赖项(可在此处找到最新版本) 该 YAML 类是API的入口点: 由于实现不

    2024年02月13日
    浏览(100)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包