python实现BMP图像位图法隐藏信息

news2025/1/18 10:47:46

内容安全实验信息隐藏技术

使用位图法修改BMP图像隐藏信息

我们先了解一下BMP图像的信息

bmp图像文件头和图像信息表 

 

 

位图法隐藏和传递信息

(1)本机首先将要隐藏和传递的原始信息记录下来         abc                   

(2)对原始信息进行编码转换,如果要传输中文,打开汉字Unicode编码表,按照对应规则将它们转换为十六进制代码,再转换为二进制代码;如果要传输英文,打开ASCII码对照表,按照对应规则将它们转换为十六进制代码,再转换为二进制代码。

61 62 63 H

请将转换完成的信息代码(二进制代码)记录在这里 0110 0001 0110 0010 0110 0011

原始信息长度是    3      个字符,这个长度的二进制值是   0000 0011      

原始信息文字类型(即文件标识符英文为00中文为01)     00     

其二进制值是    0000 0000      

(3)将原始信息长度代码和文字类型代码追加至原始信息中,然后利用位图法修改BMP图像对应的位,完成信息嵌入工作,具体操作如下:

使用UltraEdit打开图片pic1,找到图像数据区的开始位置。利用位图法修改BMP图像,将转换后的信息长度代码和信息代码嵌入到BMP图片中,并观察图像视觉上是否有变化。

0070开始是图像数据区,从这里插入隐藏数据。

要隐藏的数据为0000 0000 0000 0011 0110 0001 0110 0010 0110 0011  40位2进制

位图法修改BMP图像隐藏信息算法原理

设要隐藏的数据是 0 (一位)

图像的数据区的数据是 02 = 0000 0010

我们对图像的数据 0000 0010 进行奇偶校验 ,有1个1,为奇。可以设置其为1

我们要隐藏的数据为0,我们需要修改图像的数据 (0000 0010)使得它的奇偶校验为偶即0

我们修改最后一位,把它置为相反的值为0000 0011 这样奇偶校验就为偶了,与我们要隐藏的信息一致。

最后16进制的值为 03 我们把原来图像的02改成03

位图法隐藏python算法

#要隐藏的数据为0000 0000 0000 0011 0110 0001 0110 0010 0110 0011
#源数据 original 放置 70h和c0h数据
original="020500010500010500000400000400000400000400010200010200010200010200010100010100000100000100000100000100000100000100000102000100000400000400000300000300000300000300000400000400010500010500010500"
grouped = [original[i:i+2] for i in range(0, len(original), 2)]
print(grouped[0])

hint="0000000000000011011000010110001001100011"
print(hint)
RE=[]

def parity_check(data):
    # 计算数据中1的个数
    count = 0
    for bit in data:
        if bit == '1':
            count += 1

    # 判断奇偶性
    if count % 2 == 0:
        return 0 #偶校验
    else:
        return 1 #奇校验

def hex_to_binary(hex_string):
    binary_string = bin(int(hex_string, 16))[2:]
    return binary_string.zfill(len(hex_string) * 4)

def invert_lowest_bit(binary_string):
    binary_list = list(binary_string)  # 将二进制字符串转换为列表
    binary_list[-1] = '1' if binary_list[-1] == '0' else '0'  # 取反最低比特位
    inverted_binary = "".join(binary_list)  # 将列表转换回二进制字符串
    return inverted_binary

def binary_to_hex(binary_string):
    hex_string = format(int(binary_string, 2), '0' + str(len(binary_string) // 4) + 'X')
    return hex_string

for i in range(0,len(hint)):
    print("要隐藏的二进制hint[i]:",hint[i])
    hex_num = grouped[i]
    print("原数据的值",hex_num)
    binary_num = hex_to_binary(hex_num)
    print("转换为2进制",binary_num)
    result = parity_check(binary_num)
    print("奇偶校验结果:",result)
    if int(result)==int(hint[i]):
        print("奇偶相同不用改变",result,hint[i])
        print("隐藏信息后十六进制:",hex_num)
        RE.append(hex_num)
    else:
        print("奇偶不相同改变最后一位", result, hint[i])
        inverted_num = invert_lowest_bit(binary_num) #改变最后一位
        print("改变奇偶后二进制",inverted_num)
        result2 = parity_check(inverted_num)
        if int(result2)==int(hint[i]):
            print("奇偶相同不用改变",result2,hint[i])
            hex_num = binary_to_hex(inverted_num)
            print("改变奇偶后十六进制:",hex_num)
            RE.append(hex_num)  # 将 hex_num 添加到 RE 列表中

print(RE)
RE2=[]
hint2 = ""
def extract_information(RE):#提取信息函数
    global hint2  # 声明hint2为全局变量
    for i in range(0,len(RE)):
        binary_num = hex_to_binary(RE[i])
        RE2.append(binary_num)
        result=parity_check(binary_num)
        hint2=hint2+str(result)

    return hint2

hint2=extract_information(RE)
print(RE2)
print("提取信息值hint2:",hint2)
print("对比隐藏信息值hint",hint)

 得到隐藏信息后的十六进制串:

['03', '05', '00', '00', '05', '00', '00', '05', '00', '00', '05', '00', '00', '05', '01', '01', '05', '01', '01', '05', '00', '00', '03', '01', '00', '02', '01', '00', '03', '00', '01', '03', '00', '01', '01', '00', '00', '00', '01', '01']

修改后的图像 

图像对比

隐藏信息前:

隐藏信息后:

可以看出没有什么明显的差异 ,信息隐藏成功

信息提取代码

def extract_information(RE):#提取信息函数
    global hint2  # 声明hint2为全局变量
    for i in range(0,len(RE)):
        binary_num = hex_to_binary(RE[i])
        RE2.append(binary_num)
        result=parity_check(binary_num)
        hint2=hint2+str(result)

    return hint2

参考文献:

http://t.csdnimg.cn/t35Tf

http://t.csdnimg.cn/ZyeYb

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

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

相关文章

【康耐视国产案例】AI视觉相机创新 加速商超物流数智化转型

连锁商超/零售店正面临着因消费者购物习惯改变等挑战,迎来了以新兴技术崛起而催生的数字化物流体系转型需求。物流行业与AI机器视觉的深度融合,解决了传统机器视觉识别速度慢、环境要求高、定制化部署耗时过多等痛点,大大提高了物流供应链的效…

ai虚拟主播自动切换的实现

前段时间,看到b站突然冒出很多ai主播,输入数字切换小姐姐.感觉挺有趣.思考了以下决定手动实现一下. 然后就陷入长达5天的踩坑中 由于是自建的webrtc服务器,很自然的想直接收流转发,这也是最优的方案, 然而实际上遇到许多不是很友好的bug, 然后再想使用rtp转发,依然不理想. 最后…

思科防火墙 网线连接的端口还是down 已配置 端口还是down

环境: 思科防火墙fpr-2100 isco Firepower 2100 系列防火墙是思科系统(Cisco Systems)推出的一款中端网络安全和防火墙设备。这一系列的产品主要针对中到大型企业的需求,提供高性能的威胁防护和网络流量管理功能。 问题描述&am…

基于百度智能体平台快速搭建Java学习助手

文章目录 前言什么是文新智能体平台?Java学习助手智能体搭建智能体效果智能体入口文新智能体体验感受 前言 一个Java初学者在学习Java时可能不知道从哪下手,一个工作了3年的Java开发遇到瓶颈期不知如何提升自己,此时,如果有一个老…

CMake的原理与使用方法

一.为什么需要CMake,什么是CMake 1.由于各种make工具遵循不同的规范和标准,所执行的Makefile格式也不同,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),…

2024年上半年系统架构设计师——案例第四题——智能汽车相关

写在前面 趁着还记得请,留个纪念。MongoDB的概念完全没记,综合下来只好选这个了。 这题基本上是有自动驾驶背景知识的人的福音,也是第一次考的和现代热点前沿技术相关的内容,而不是考些老嵌入式架构的(上一次看到的还…

单片机串口接收负数的处理方法

dp80中有很多外设处理相关的都是有符号数据。 如dpm计算的结果,插入dpm后有时候会得到0xFFFFFFFE-2(从调试界面也可以看到)。

如何在Windows 10上更改默认系统字体,这里有详细步骤

Windows 10的默认系统字体Segoe UI看起来相当不错。但是,如果你有更好的替代品,你可以更改Windows 10 PC上的默认系统字体。我们将向你展示如何执行此操作。 如何使用注册表编辑器更改默认系统字体 在撰写本文时,“设置”和“控制面板”都没有更改默认系统字体的选项。这意…

信息素养大赛晋级复赛,你们都刷题库了吗?

2024年全国青少年信息素养大赛初赛成绩之前发布了,今天同学们可以查询是否晋级信息素养大赛复赛了,复赛应该会难度比较大,7月复赛,8月全国总决赛,据6547网题库获悉,今年初赛的人数近22万人。 查询方式&…

QT打包成exe文件运行(非安装包)

在QT Creator里面构建那里,点击Release构建完会生成类似这样的文件夹 文件生成的路径在项目概要里面 在该文件里面可以看到release文件夹,release进去后就可以看到有个exe文件,但是还需要导入一些三方库,目前点击会出现类似的错误…

解决bind error: Address already in use

是端口复用问题 产生原因 程序突然退出系统但是没有释放端口 问题解决 首先通过 //显示进程信息 ps -la //杀死相关进程 kill -9 xxxx然后添加socket设置 int on1; if(setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){perror("setsockopt")…

【主动均衡和被动均衡】

文章目录 1.被动均衡2.主动均衡1.被动均衡 被动均衡一般通过电阻放电的方式,对电压较高的电池进行放电,以热量形式释放电量,为其他电池争取更多充电时间。这样整个系统的电量受制于容量最少的电池。充电过程中,锂电池一般有一个充电上限保护电压值,当某一串电池达到此电压…

三十二篇:转化决策为行动:探索决策支持系统的深层价值

转化决策为行动&#xff1a;探索决策支持系统的深层价值 1. DSS的精髓&#xff1a;定义与核心功能 1.1 定义与作用 在现代商业的快速演变中&#xff0c;决策支持系统&#xff08;Decision Support Systems, DSS&#xff09;已成为企业获得竞争优势的重要工具。DSS是一种利用先…

golang语言的gofly快速开发框架如何设置多样的主题说明

本节教大家如何用gofly快速开发框架后台内置设置参数&#xff0c;配置出合适项目的布局及样式、主题色&#xff0c;让你您的项目在交互上加分&#xff0c;也是能帮你在交付项目时更容易得到客户认可&#xff0c;你的软件使用客户他们一般都是不都技术的&#xff0c;所以当他们拿…

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

http协议及httpd安装组成

文章目录 一、http协议http协议通信过程http相关技术网站访问量HTTP工作机制HTTP协议版本HTTP请求访问的完整过程HTTP报文头部响应报文 二、httpd安装组成apache介绍和特点工作模式&#xff08; MPM multi-processing module &#xff09;Http相关文件Http编译安装httpd常见配置…

SqlServer还原系统库步骤及问题解决

还原master 需要切换到binn目录 Cd C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn 关闭服务 用单用户模式启动 SQL Server 默认实例 sqlservr.exe -m 直接单用户登录 恢复master备份文件 RESTORE DATABASE master FROM DISK E:\dbbak\txic_ke…

【SpringMVC】_设置响应状态码与Header

目录 1. 设置响应状态码 2. 设置响应Header 2.1 设置Content-Type 2.1.1 不使用RequestMapping的produce属性 2.1.2 使用RequestMapping的produce属性 2.2 设置/新增其他Header 1. 设置响应状态码 Spring是基于servlet实现的&#xff0c;设置HTTP响应的状态码可以通过se…

精武杯复现(服务器部分)

起镜像连ssh 这里是raid5重组&#xff0c;123组成一个数据盘&#xff0c;4是系统盘&#xff0c;仿真的时候记得全选 第一步就是先配网&#xff0c;在etc/sysconfig/network-script里边&#xff0c;cat ifcfg-ens33 发现是dhcp&#xff0c;并且没有启动 直接ifup ifcfg-ens3…