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

LSB隐写原理解析

背景知识:8位二进制表示颜色

RGB 中的每个通道(红、绿、蓝)都是一个 0~255 的整数(即 8位):

255 = 11111111
128 = 10000000
17 = 00010001

最低位(最右边一位)叫做 LSB(Least Significant Bit),改动它对人眼几乎不可见。

一、LSB隐写的本质

图像中每个像素的颜色由RGB三个通道组成,每个通道是一个 0~255(8位) 的整数:

数字 二进制(8位)
218 11011010
150 10010110
149 10010101

每个颜色的最后一位(最低有效位,即 LSB)可以轻微改变,而不会被人眼察觉。比如:

  • 11011010(LSB是0) 改成 11011011(LSB是1)
  • 10010110(LSB是0) 改成 10010111(LSB是1)

我们就可以用这些最低位来“编码”我们要隐藏的秘密数据的二进制位。

Step 1:LSB 隐写编码脚本(encode_lsb.py)

from PIL import Image
import numpy as np# 加载原图
image = Image.open('pic/test.png')
print(image)
print(image.size)data = np.array(image)
print(data)
print(data.shape)
flat_data = data.ravel()  # 拉平成一维数组
print(flat_data)
original_data = flat_data.copy()
#
# print(original_data)
# # 要嵌入的消息
message = "hello" #替换为你的webshell
binary_str = ''.join([format(ord(c), '08b') for c in message])  # 转二进制串
#
# print(binary_str)
print("[原始信息]", message)
print("[二进制表示]", binary_str)
#
# # 进行 LSB 修改
for i in range(len(binary_str)):flat_data[i] = (flat_data[i] & 0xFE) | int(binary_str[i])  # 保留高7位 + 替换 LSB# # 打印len(binary_str)位像素变化
print("\n[像素变化演示] 答应替换的那些个通道值:前后值对比:")
for i in range(len(binary_str)):old = format(original_data[i], '08b')new = format(flat_data[i], '08b')print(f"第{i+1}个像素通道: 原={old} 新={new}")# # 保存新图
# new_data = flat_data.reshape(data.shape)
# new_image = Image.fromarray(new_data.astype(np.uint8))
# new_image.save('pic/encoded.png')
# print("\n隐写图像已保存为: pic/encoded.png")

操作拆解

flat_data[i] = (flat_data[i] & 0xFE) | int(binary_str[i])
我们拆成两部分看:

第一步:flat_data[i] & 0xFE (0xFE 是 11111110的十六进制)
这个操作是:把原来的最低位清零(不变其他7位)

flat_data[i] = 137 # => 二进制: 10001001
执行:
flat_data[i] & 0xFE

= 10001001 & 11111110
= 10001000 # 清掉最低位

第二步:| int(binary_str[i])

这一步是:

把新的 LSB(二进制字符串中一个 0 或 1)写进去
假设 binary_str[i] = "1":
10001000 | 00000001 = 10001001
所以最终写入了新 LSB。

最终效果:

把原来的 flat_data[i](一个像素通道值)变成:
保留高 7 位 + 替换最低位为 binary_str[i]

Step 2:LSB 解码脚本(decode_lsb.py)

from PIL import Image
import numpy as np# 读取隐写图
image = Image.open('pic/encoded.png')
data = np.array(image).ravel()# 读取前 5 个字符(5x8=40 位)
bits = ''
for i in range(40):bits += str(data[i] & 1)  # 取最低位# 每8位还原为字符
message = ''
for i in range(0, len(bits), 8):byte = bits[i:i+8]message += chr(int(byte, 2))print("\n[解码结果]:", message)

dct隐写 待续......

PNG 的结构大致是这样的:

89 50 4E 47 0D 0A 1A 0A      ← PNG 头部(8 字节)
[chunk1]                    ← IHDR
[chunk2]                    ← IDAT
[chunk3]                    ← IEND

每个 chunk(数据块)结构如下:

| 长度 (4B) | 类型 (4B) | 数据 (N字节) | CRC (4B) |

▶ CRC 在哪?

PNG 的每个 chunk(如 IHDR, IDAT)后面都带一个 CRC-32
作用是验证:chunk_type + chunk_data 的完整性
改动 PNG 的内容(即使是一个比特),CRC 就不合法

所以你如果:

  • 对 PNG 做 LSB 隐写(修改像素的最低位)
  • 再保存为 PNG 格式
  • 如果用 Pillow、OpenCV 会自动重写 PNG → 自动计算 CRC
所以一般不会造成 CRC 错误(你看不到它错),但:

如果你只在二进制层修改 .png 文件(不解码重写):
不更新 CRC → 显示失败 / 打不开
文件校验失败

LSB 隐写 ➝ 攻击媒介的可能性

1. 实时摄像头采集帧图

  • 摄像头每秒采集若干张图像,缓存在内存中
  • 若在此阶段做 帧图的 LSB 隐写,可以藏入二进制 payload

2. 嵌入内容(payload)类型:

类型 可实现目标
shellcode 被载入后可执行任意代码(需配合漏洞)
EXE 字节流 结合诱导用户“导出/运行”
JS/宏代码 针对浏览器播放器 / 办公组件攻击
文本指令 被分析工具提取并执行(例如 FFmpeg 插件、AI 模型)

如何实现这种攻击?

这类攻击 不会靠播放器“自动执行”,而是依赖后续触发链条。

一种典型路径

摄像头 ➝ 每帧 PNG LSB 隐写 ➝ 合成为 MP4 ➝ 用户下载查看 ➝
AI/图像模型或插件提取帧 ➝ 解析 LSB ➝ 自动读取指令 ➝ 触发恶意行为

实例:真实案例类型(或可行性)

攻击方式 说明
隐写 ZIP / EXE 到帧中 LSB 中藏完整 zip/exe,通过提取帧+解码还原
AI 模型训练数据污染攻击 摄像头采集图像嵌入 adversarial token,影响模型行为
伪装为正常视频诱导手动操作 比如用户提取帧、运行脚本不知情地执行 payload
播放器直接执行 MP4 内 LSB 数据 不可行。MP4 播放器不读取 LSB,无自动执行能力

常用隐写技术中的执行触发方式:

技术 自动触发? 备注
PNG LSB 需脚本提取、运行
MP4 元数据 可能 可写入 shell/script,但需利用播放器漏洞
FFmpeg 编码字段 可能 如某些字幕流 / metadata 被脚本解析
http://www.aitangshan.cn/news/703.html

相关文章:

  • 利用Active Directory进行攻击防御 - 实战技术与工具解析
  • 数据结构《课程导入 绪论》教案
  • Windows11正式版如何修改开机音乐的问题
  • 深度技术win10专业版电脑出现假死的问题
  • Spring boot SseEmitter 推送数据客户端乱码
  • Apache SeaTunnel 新定位!迈向多模态数据集成的统一工具
  • [完结22章]LLM应用全流程开发 全新技术+多案例实战+私有化部署
  • IP地址转换
  • Springboot+vue3 MinIO文件前端直传例子
  • 【刷题笔记】日照集训 Day3
  • GAS_Aura-The Gameplay Ability System
  • 深度解析10BASE-T1S PLCA的多节点通信效率
  • ESP32 + PCA9685(16通道 PWM 扩展模块)来驱动多个 9g 舵机
  • k8s 新版创建完 serviceaccount 后-- 不再生成 对应的--token
  • 验证码厂商对比及选型
  • debian更换NVIDIA 官方驱动
  • 经纬恒润推动汽车软件安全新生态,打造全流程质量协同新范式
  • 2025杭电多校第七场 矩形框选、伤害冷却比 个人题解 - CUC
  • 7 月 SeaTunnel 社区狂飙:新特性、强优化、贡献者满分输出
  • 在K8S中,假设一家基于整体架构的公司处理许多产品。现在,随着公司在当今规模化行业中的发展,其整体架构开始引起问题,如何看待公司从单一服务转向微服务并部署其服务容器?
  • GAS_Aura-Post Process Highlight
  • Host startup hook
  • 育儿计划
  • 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义处理方式
  • docker run 后报错/bin/bash: /bin/bash: cannot execute binary file
  • Proteus 9.0 SP2 安装使用图文指南 | EDA电路仿真软件
  • Claude Code使用指南
  • C++ 去除字符串中的控制字符
  • 芯片安全标准驱动库,筑牢芯片功能安全基石
  • windows实现键盘记录