当前位置: 首页 > news >正文

基于LSB实现文本、图片、压缩包的隐藏

关于LSB的相关介绍:

LSB全称为 Least Significant Bit(最低有效位),是一种基于图片最低有效位修改储存信息的隐写方法,在CTF杂项中经常会遇到,LSB属于空域算法中的一种,是将信息嵌入到图像点中像素位的最低位,以保证嵌入的信息是不可见的。

图片的图像像数一般都是由RGB三原色(红绿蓝)组成,每一种颜色占8位,取值为0x00~0xFF,就是256种,一共包含了256的3次方种颜色,即16777216种颜色,但是人类的眼睛只可以分辨大概1000万种不同的颜色,还有很多种细微的变化人类的眼睛是觉察不到的。

LSB隐写就是通过修改RGB颜色分量的最低位二进制(LSB),来进行信息的储存,人类的眼睛并不能感知到前后的变化,每个像数可以携带3bit的信息。

如何实现:

我们这里使用Python脚本来实现

from PIL import Image
import sysdef toasc(strr):return int(strr, 2)       #str1为所要提取的信息的长度(根据需要修改),str2为加密载体图片的路径,str3为提取文件的保存路径
def decode(str1,str2,str3): b="" im = Image.open(str2)lenth = int(str1)*8  width,height = im.size[0],im.size[1]count = 0for h in range(height): for w in range(width):#获得(w,h)点像素的值pixel = im.getpixel((w, h))#此处余3,依次从R、G、B三个颜色通道获得最低位的隐藏信息 if count%3==0:count+=1 b=b+str((mod(int(pixel[0]),2))) if count ==lenth:breakif count%3==1:count+=1b=b+str((mod(int(pixel[1]),2)))if count ==lenth:breakif count%3==2: count+=1b=b+str((mod(int(pixel[2]),2)))if count ==lenth:breakif count == lenth:breakwith open(str3,"w",encoding='utf-8') as f: for i in range(0,len(b),8):#以每8位为一组二进制,转换为十进制            stra = toasc(b[i:i+8]) #将转换后的十进制数视为ascii码,再转换为字符串写入到文件中#print((stra))f.write(chr(stra))print("sussess")def plus(string): #Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。return string.zfill(8)def get_key(strr):#获取要隐藏的文件内容with open(strr,"rb")  as f:s = f.read()string=""for i in range(len(s)):#逐个字节将要隐藏的文件内容转换为二进制,并拼接起来 #1.先用ord()函数将s的内容逐个转换为ascii码#2.使用bin()函数将十进制的ascii码转换为二进制#3.由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空#4.又由于ascii码转换二进制后是七位,而正常情况下每个字符由8位二进制组成,所以使用自定义函数plus将其填充为8位string=string+""+plus(bin(s[i]).replace('0b',''))#print(string) return stringdef mod(x,y):return x%y#str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径 
def encode(str1,str2,str3): im = Image.open(str1) #获取图片的宽和高width,height= im.size[0],im.size[1]print("width:"+str(width))print("height:"+str(height))count = 0#获取需要隐藏的信息 key = get_key(str2) keylen = len(key)for h in range(height):for w in range(width):pixel = im.getpixel((w,h))a=pixel[0]b=pixel[1]c=pixel[2]if count == keylen:break#下面的操作是将信息隐藏进去 #分别将每个像素点的RGB值余2,这样可以去掉最低位的值#再从需要隐藏的信息中取出一位,转换为整型#两值相加,就把信息隐藏起来了a= a-mod(a,2)+int(key[count])count+=1if count == keylen:im.putpixel((w,h),(a,b,c)) breakb =b-mod(b,2)+int(key[count])count+=1 if count == keylen:im.putpixel((w,h),(a,b,c)) breakc= c-mod(c,2)+int(key[count])count+=1if count == keylen:im.putpixel((w,h),(a,b,c))breakif count % 3 == 0:im.putpixel((w,h),(a,b,c))im.save(str3)if __name__ == '__main__':if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2:print ('Usage: python test.py <cmd> [arg...] [opts...]')print ('  cmds:')print ('    encode image + flag -> image(encoded)')print ('    decode length + image(encoded) -> flag')sys.exit(1)cmd = sys.argv[1]if cmd != 'encode' and cmd != 'decode':print('wrong input')sys.exit(1)str1 = sys.argv[2]str2 = sys.argv[3]str3 = sys.argv[4]if cmd != 'encode' and cmd != 'decode':print ('Wrong cmd %s' % cmd)sys.exit(1)elif cmd=='encode':encode(str1,str2,str3)elif cmd=='decode':decode(str1,str2,str3)

常见的三种LSB隐写方式:

我们依次尝试文本文件、图片文件、压缩包文件 

1、将文本藏在图片里

这是我们要隐藏的文本

用法:python  脚本名  encode 用来隐藏的图片名 要隐藏的文件名 输出的图片名

 输出的图片肉眼上和原图没有任何区别

 使用Stegsolve打开文件

 将RGB都勾在0,点击Preview

在开头就发现了我们隐写的文本内容,这是因为文本隐写隐藏在图片最开始的地方

但是正因为隐藏在图片最开始的地方,这就造成了LSB隐写的鲁棒性

我们对图片开头进行攻击

另存为后再次打开,发现我们隐写的内容不见了或者变了

 这就是LSB隐写的鲁棒性,如果我们攻击图片的其他地方,就不会对开头隐写的内容造成影响。

 

除了使用Stegsolve,我们也可以直接使用上面的脚本来提取隐写的内容

用法:python  脚本名  decode  字节数  含有隐写内容的图片名  输出的文件名

由于secret.txt的字节数其实我们是不知道的,可以慢慢尝试,为了保证输出完整内容一般输大一点

比如这里这个secret.txt它是22个字节

我们依次尝试10、20、30看看输出的内容

 可以看到,如果字节数小了,会导致我们获取的内容不完整,而太大了,虽然保证了完整性,但是也会多出一些额外的字符,这就需要我们自己慢慢尝试和调整了。

 

2、将图片藏在图片里

和上面是一个道理,只是将文本名换成了要隐藏的图片名(比如flag.png)

同样的地方同样的操作

 

由开头可以看出是png格式,点击Save Bin ,我们便提取出了隐写在图片中的另一张图片

3、将压缩包藏在图片里

 

至此,关于如何实现LSB的隐写大概就是这样的,真心希望各位看完有所收获!

相关文章:

基于LSB实现文本、图片、压缩包的隐藏

关于LSB的相关介绍&#xff1a; LSB全称为 Least Significant Bit&#xff08;最低有效位&#xff09;&#xff0c;是一种基于图片最低有效位修改储存信息的隐写方法&#xff0c;在CTF杂项中经常会遇到&#xff0c;LSB属于空域算法中的一种&#xff0c;是将信息嵌入到图像点中…...

(万字长文)Linux——IO之重定向+缓冲区 +重定向 +缓冲区原理实现 +带重定向的简易版shell+标准输出标准错误

索引 文件描述符分配规则重定向 缓冲区1.什么是缓冲区2.缓冲区在哪里 重定向源码模拟实现缓冲区原理带重定向的简易版Xshell标准输入和标准错误 文件描述符分配规则 文件描述符的分配规则 从头遍历数组fd_array[],找到一个最小的&#xff0c;没有被使用的下标&#xff0c;分配…...

面试:js 延迟加载方式

相关知识点&#xff1a; js 延迟加载&#xff0c;也就是等页面加载完成之后再加载 JavaScript 文件。 js 延迟加载有助于提高页面加载速度 一般有以下几种方式&#xff1a; defer 属性 async 属性 动态创建 DOM 方式 使用 setTimeout 延迟方法 让 JS 最后加载 js 的加载…...

将Oracle数据文件导入SQL Server的方法

审计过程中&#xff0c;采集的业务数据有Oracle备份数据&#xff0c;备份文件的后缀名为.dmp。如何将*.dmp文件导入审计人员熟悉的SQL Server中呢&#xff1f;以下是现场审计数据导入方法介绍。 一、将*.dmp文件导入oracle数据库 *.dmp文件为Oracle数据库备份文件&#xff0c;因…...

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序 题目1题目2题目3题目4题目5题目6总结 题目1 将下面的程序编译、连接&#xff0c;用 Debug 加载、跟踪&#xff0c;然后回答问题 assume cs:code, ds:data, ss:stack data segmentdw 0123h,0456h,0789h,0abch,0def…...

剑指offer -- 二维数组中的查找

二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 暴力查找法: 是一种简单直接的解决方法&#xff0c;可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素&#xff0c;逐个与目标值进行比较。 具体步骤如下&#xff1a; 从数组的第一行第一列开始&#xff0c;…...

3. 自然语言处理NLP:具体用途(近义词类比词;情感分类;机器翻译)

一、求近义词和类比词 1. 近义词 方法一&#xff1a;在嵌入模型后&#xff0c;可以根据两个词向量的余弦相似度表示词与词之间在语义上的相似度。 方法二&#xff1a;KNN&#xff08;K近邻&#xff09; 2. 类比词 使用预训练词向量求词与词之间的类比关系。eg&#xff1a;man&a…...

Hibernate的FlushMode

一、Session中FlushMode的设置&#xff1a; 在事务开启前设置FlushMode属性&#xff0c;方法: // session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)。Service public class TestService {Logger log LoggerFactory.getLogger(getClass());AutowiredEntityM…...

二线程序员的出路

最近长沙不太平。去年被动离职一拨人之后&#xff0c;HR一直强调降本增效&#xff0c;人人自危&#xff0c;挤走一拨人&#xff0c;反正会有大量内卷失败的一线程序员进来填坑。当然留就有人走&#xff0c;前同事除了几个出去搞培训创业&#xff08;后面解散了&#xff09;的之…...

MKS SERVO4257D 闭环步进电机_系列2 菜单说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…...

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

在本文中&#xff0c;我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂&#xff0c;这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置&#xff0c;所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…...

黑马学生入职B站1年,晒出21K月薪:我想跳槽华为

现在的Z时代&#xff0c;嘴上说着不要&#xff0c;身体却很诚实。 前两天&#xff0c;黑马发布了《2022年度互联网平均薪资出炉&#xff01;高到离谱&#xff01;》&#xff0c;信息传输、软件和信息技术服务业薪资遥遥领先&#xff01;Z时代举头望着天花板&#xff0c;故作潇…...

一文看懂GPT风口,都有哪些创业机会?

新时代的淘金者&#xff0c;低附加价值的创业要谨慎&#xff0c;高附加价值、低技术门槛创业也要谨慎&#xff0c;主干道边上的创业也要谨慎。不少朋友看完不淡定了&#xff0c;干什么都谨慎&#xff0c;回家躺平好了&#xff0c;我有个朋友&#xff0c;靠ChatGPT&#xff0c;半…...

chatgpt赋能python:Python中的不确定尾数问题

Python中的不确定尾数问题 Python作为一种高级编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等众多领域。然而&#xff0c;Python在处理浮点数时会出现一些不确定尾数的问题&#xff0c;给程序员和数据分析员带来不少麻烦。本篇文章将介绍Python中不确定尾数的…...

杜绝开源依赖风险,许可证扫描让高效合规「两不误」

目录 开源许可证及其常见类型 开源许可证扫描是软件研发过程中&#xff0c;不可或缺的工具 极狐GitLab 开源许可证扫描的优势与应用 Step 1&#xff1a;启用及设置许可证策略 Step 2&#xff1a;自动创建策略文件存放项目 Step 3&#xff1a;查看许可证合规情况 Step 4&…...

【sop】含储能及sop的多时段配网优化模型

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了含sop的配电网优化模型&#xff0c;链接含sop的配电网优化,很多同学在咨询如何增加储能约束&#xff0c;并进行多时段的优化&#xff0c;本次拓展该部分功能&#xff0c;在原代码的基础上增加储能模…...

nodjs使用阿里云镜像安装

要使用阿里云镜像来安装 npm 包&#xff0c;你需要按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你已经安装了 Node.js 和 npm。你可以在终端&#xff08;或命令提示符&#xff09;中输入以下命令来验证它们的安装&#xff1a; node -v npm -v如果显示了 Node.js 和…...

C++ Primer Plus 第二章习题

目录 复习题 1.C程序的模块叫什么&#xff1f; 2.#include 预处理器编译指令的用处&#xff1f; 3.using namespace std; 该语句是干什么用的&#xff1f; 4.什么语句可以打印一个语句"hello,world"&#xff0c;然后重新换行&#xff1f; 5.什么语句可以用来创…...

两分钟学会 制作自己的浏览器 —— 并将 ChatGPT 接入

前期回顾 分享24个强大的HTML属性 —— 建议每位前端工程师都应该掌握_0.活在风浪里的博客-CSDN博客2分享4个HTML5 属性&#xff0c;开发必备https://blog.csdn.net/m0_57904695/article/details/130465836?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发…...

HEVC中,mvd怎么写进码流的?

文章目录 Motion vector difference syntax 标准文档描述语义解释设计意义 Motion vector difference syntax 标准文档描述 语义解释 MvdL1[ x0 ][ y0 ][ compIdx ] L1列表的mvd x0,y0 表示亮度快左上角坐标 compIdx 0表示水平 compIdx 0表示垂直 mvd_l1_zero_flag&#xff1a…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...