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

news2024/11/24 20:03:07

关于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 sys

def 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 = 0
    for 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:
                    break
            if count%3==1:
                count+=1
                b=b+str((mod(int(pixel[1]),2)))
                if count ==lenth:
                    break
            if count%3==2: 
                count+=1
                b=b+str((mod(int(pixel[2]),2)))
                if count ==lenth:
                    break
        if count == lenth:
            break

    with 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 string

def 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+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c)) 
                break
            b =b-mod(b,2)+int(key[count])
            count+=1 
            if count == keylen:
                im.putpixel((w,h),(a,b,c)) 
                break
            c= c-mod(c,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            if 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的隐写大概就是这样的,真心希望各位看完有所收获!

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

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

相关文章

OPCUA从入门到精通看这里就够了

本文将会从以下几个方面介绍 1.OPCUA是什么 2.OPCUA常用的工具有那些 3.OPCUA的官网 4.使用opcua常用的方法和功能介绍 5.根据官网自己封装了一个opcuaclient类&#xff0c;并说明每个方法的用处 6.根据4中的opcuaclient类自己写了demo 本文所有用到的资料在此下载包括U…

Android平台音视频推送选RTMP还是GB28181?

技术背景 早在2015年&#xff0c;我们发布了RTMP直播推送模块&#xff0c;那时候音视频直播这块场景需求&#xff0c;还不像现在这么普遍&#xff0c;我们做这块的初衷&#xff0c;主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑&#xff0…

信息系统建设和服务能力评估证书CS

信息系统建设和服务能力评估体系CS简介 简介&#xff1a;本标准&#xff08;团标T/CITIF 001-2019&#xff09;是信息系统建设和服务能力评估体系系列标准的第一个&#xff0c;提出了对信息系统建设和服务提供者的综合能力要求。 发证单位&#xff1a;中国电子信息行业联合会。…

整型,浮点型,大小字节知识细节一网打尽!

目录 一. 整型 2.11 C语言内置整型 2.12整型在内存如何存储&#xff1f; 2.12 原码&#xff0c;反码&#xff0c; 补码 2.13 当 整型遇上unsigned 2.1 unsigned 与 signed 解析 2.2 printf 输出 有无符号数解析 2.3 有关练习 二. 浮点型 2.51 浮点型与整型在存储上的…

视频会议产品对比分析

内网视频会议系统如何选择&#xff1f;有很多单位为了保密&#xff0c;只能使用内部网络&#xff0c;无法连接互联网&#xff0c;那些SaaS视频会议就无法使用。在内网的优秀视频会议也有很多可供选择&#xff0c;以下是几个常用的&#xff1a; 1. 宝利通&#xff1a;它支持多种…

港联证券|新产品“内卷”,史上最火光伏展能否带动光伏板块行情

在光伏成为“能源老大”之前&#xff0c;指数何时能够跑赢A股股主要股指&#xff0c;或是散户关注的重点。 时隔两年&#xff0c;SNEC上海光伏展如约举办。本届展会吸引了3000余家光伏公司参展&#xff0c;累计50万人涌进场馆&#xff0c;现场人群拥挤度丝毫不逊于过去两年资金…

Navicat连接Oracle时报错ORA-28547

错误信息 这是因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;网上这么说的&#xff0c;需要去官网下载支持的版本。 直接动手。 1. 先DBeaver的连接到oracle数据库&#xff08;为了查询版本&#xff09; 1.1 查询版本 SQL&#xff1a;select * from v$version;1.2 …

如何利用Linkage Mapper工具包评估栖息地碎片化程度详解(含实例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 Linkage Mapper工具包评估栖息地碎片化程度详解1. 介绍1.1 简介1.2 ArcGIS概述1.3 Linkage Mapper工具包简介

生态伙伴 | 携手深圳科创学院,持续推动项目落地与成长

01 大赛介绍 中国硬件创新创客大赛始于2015年&#xff0c;由深圳华秋电子有限公司主办&#xff0c;至今已经成功举办八届&#xff0c;赛事范围覆盖华南、华东、华北三大地区&#xff0c;超10个省市区域。 大赛影响了超过45万工程师群体&#xff0c;吸引了35000多名硬创先锋报…

分享Python采集66个焦点图,总有一款适合您

分享Python采集66个焦点图&#xff0c;总有一款适合您 Python采集的66个焦点图下载链接&#xff1a;https://pan.baidu.com/s/1nHoPaUp2Bqtrs5d7J-XdwA?pwd3yfb 提取码&#xff1a;3yfb jQuery SuperSlide插件自适应banner大图焦点图片轮播切换特效 jQuerySwiper仿魅族幻灯…

3.复制Centos虚拟机并且安装Ansible

在2.VirtualBox安装CentOS 7已经创建好了CentOS_template&#xff0c;按下面的步骤&#xff0c;从已经创建好的模版&#xff0c;分别复制出来3个虚拟机&#xff1a;ansible-controller和ansible-target1和ansible-target2。 注意这里的MAC地址设定&#xff0c;要选择&#xff…

用Tushare获取股票信息

Tushare数据Tushare为金融数据分析提供便捷、快速的接口&#xff0c;与投研和量化策略无缝对接https://tushare.pro/register?reg593541 o(≧口≦)o 先别看着链接就走了&#xff0c;敲黑板。 教大家如何基础使用日线行情获取接口数据&#xff0c;不会告诉你们我就是为了骗积分…

spring security oauth2.0-密码式password

密码式(password)授权模式 简介 如果你高度信任对方应用,密码式授权模式也是被允许的. 密码模式,顾名思义,就是使用账号密码的形式在授权服务器上获取授权令牌, 但是这种令牌是不支持刷新令牌的. 这种方式一般是不建议使用的,因为它的高风险性, 但是如果只是两家应用之间的…

算法工程师的主要职责(合集)

算法工程师的主要职责 算法工程师的主要职责1 1、环境建模 根据设计的机器人方案&#xff0c;构建机器人的运动学模型、观测模型等概率学模型; 2、slam算法研发 研究基于多线激光雷达的slam算法&#xff0c;包括特征提取、数据关联、闭环检测等相关算法的开发; 3、定位算法研发…

gd32f103vbt6 串口OTA升级-4-从rk3399的串口升级1

一、需求&#xff1a; 因客户需求&#xff0c;觉得升级单片机程序需要打开设备的盖子&#xff0c;&#xff08;抽出设备&#xff0c;拧螺丝&#xff0c;挺费事的&#xff09;。 那能不能把单片机也做到linux系统下升级呢&#xff1f; 答案当然是可行的。&#xff08;这里有个…

Shopee|Lazada电商平台api接口,接入获取商品评论|根据关键词取商品列表API说明示例

Shopee和Lazada是东南亚地区广受欢迎的电商平台。它们的模式非常类似&#xff0c;都是以C2C&#xff08;消费者到消费者&#xff09;、B2C&#xff08;企业到消费者&#xff09;和O2O&#xff08;线上到线下&#xff09;为主要销售模式。用户可以在平台上购买商品或者将自己的商…

如何在华为OD机试中获得满分?Java实现【组装新的数组】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

华为OD机试真题 Java 实现【查找重复代码】【2023Q1 100分】

一、题目描述 小明负责维护项目中的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。 重复代码查找方法: 以字符串形式给定两行代码,找出两行代码中的最长公共子串。 如果不存在公共子串,返回空。 二、输入描述 输入两行代码。 三、…

深眸科技|机器视觉应用优势显著赋能生产,技术崛起获发展前景

近年来&#xff0c;机器视觉已经逐渐渗透进工业制造领域的各个方面&#xff0c;并已经成为工业自动化和智能化的核心&#xff0c;无论是“中国制造2025”还是“工业4.0”都离不开机器视觉&#xff0c;机器视觉将为智能制造打开一个新的世界。 随着人工智能、云计算、5G等技术的…

Android静态库/动态库相关知识

以下皆是在ubuntu下面执行 --------------------查看动态库/静态库是多少位的------------------------ 查看动态库.so文件 直接使用file查看&#xff0c;即 file xxx.so 例子如下&#xff1a; 这里的librtmp-arm.so是arm 64位的 查看静态库.a文件 objdump -a xxx.a 例子…