Python案例做隐写?

wen 网络安全 46

用Python实现图像隐写术:从零搭建你的隐蔽通信工具

📖 目录导读

  1. 隐写术是什么?为什么用Python?
  2. 环境准备与核心库安装
  3. LSB隐写算法详解:把秘密藏进像素
  4. 文本信息嵌入PNG图片
  5. 从图片中提取隐藏信息
  6. 结合AES加密实现安全隐写
  7. 常见问题与避坑指南
  8. SEO优化问答集锦

隐写术是什么?为什么用Python?

隐写术(Steganography) 是一种将秘密信息隐藏在普通载体(如图片、音频、视频)中的技术,与加密不同,隐写的目标不是让内容无法读取,而是让第三方根本察觉不到信息的存在。

Python案例做隐写?

为什么选择Python?

  • 丰富的图像处理库(PIL/Pillow、OpenCV)
  • 简洁的位运算操作
  • 社区已有大量成熟案例和扩展包(如steganostegolib

核心思想:人眼对像素颜色微调不敏感,我们可以利用这一特性,在图片像素的最低有效位(LSB)中嵌入数据。


环境准备与核心库安装

运行以下命令安装必要工具:

pip install pillow numpy
# 可选加密扩展:
pip install pycryptodome

重要提醒:隐写后的图片应保存为无损格式(如PNG、BMP),JPEG有损压缩会破坏嵌入数据。


LSB隐写算法详解:把秘密藏进像素

RGB图像的每个像素由红、绿、蓝三个颜色通道组成,每个通道的取值范围0~255(即8位二进制)。
LSB方法:将每个通道的最低一位(即2⁰位)替换为秘密信息的一位。

  • 改变一个像素最低位,颜色偏差仅为 ±1,肉眼几乎无法分辨。
  • 一张100×100的图片可隐藏 100×100×3 = 30,000 位 ≈ 3.7KB 数据。

示例
原始像素R=200(11001000),秘密位=1 → 修改为201(11001001)
人类视觉:200和201的红色差异几乎不可察觉。


案例一:文本信息嵌入PNG图片

需求:将字符串"Hello Secret!"藏进cover.png,生成stego.png

from PIL import Image
import numpy as np
def encode_text(image_path, secret_text, output_path):
    # 打开图像并转为数组
    img = Image.open(image_path)
    arr = np.array(img)
    # 将文本转为二进制字符串(8位ASCII)
    binary_text = ''.join(format(ord(c), '08b') for c in secret_text)
    # 添加结束标记(8个0位)
    binary_text += '00000000'
    # 扁平化像素数组
    flat = arr.flatten()
    if len(binary_text) > len(flat):
        raise ValueError("图片太小,无法容纳该信息")
    # 替换每个像素的LSB
    for i in range(len(binary_text)):
        flat[i] = (flat[i] & 0xFE) | int(binary_text[i])
    # 恢复形状并保存
    new_arr = flat.reshape(arr.shape)
    Image.fromarray(new_arr).save(output_path)
    print(f"隐藏完成,输出到 {output_path}")
# 调用示例
encode_text('cover.png', 'Hello Secret!', 'stego_encoded.png')

关键点

  • flat[i] & 0xFE 将LSB归零
  • | int(binary_text[i]) 写入新位
  • 结束标记用于解码时判断信息结束

案例二:从图片中提取隐藏信息

def decode_text(image_path):
    img = Image.open(image_path)
    arr = np.array(img)
    flat = arr.flatten()
    bits = []
    for pixel in flat:
        bits.append(str(pixel & 1))  # 提取LSB
    # 每8位构成一个字节
    byte_list = [''.join(bits[i:i+8]) for i in range(0, len(bits), 8)]
    message = ''
    for byte in byte_list:
        char = chr(int(byte, 2))
        if char == '\x00':  # 遇到结束符停止
            break
        message += char
    return message
# 测试
msg = decode_text('stego_encoded.png')
print("提取信息:", msg)  # 输出:Hello Secret!

性能优化:对于大图片,建议使用numpy的位运算批量处理,避免逐像素Python循环。


案例三:结合AES加密实现安全隐写

单纯LSB隐写容易被简单检测工具发现,加密+隐写提供双重保障。

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
def encrypt_message(message, key):
    cipher = AES.new(key.encode(), AES.MODE_CBC)  # CBC模式
    ct = cipher.encrypt(pad(message.encode(), AES.block_size))
    # 存储iv+密文
    return base64.b64encode(cipher.iv + ct).decode()
def decrypt_message(encrypted, key):
    raw = base64.b64decode(encrypted)
    iv = raw[:16]
    ct = raw[16:]
    cipher = AES.new(key.encode(), AES.MODE_CBC, iv=iv)
    return unpad(cipher.decrypt(ct), AES.block_size).decode()
# 使用示例(需先有AES密钥)
key = '16byte_secretkey'  # 必须是16/24/32字节
secret = "核弹发射密码: 123456"
encrypted = encrypt_message(secret, key)
print("加密后:", encrypted)
# 将encrypted字符串作为隐写内容嵌入图片(需先转为二进制)
encode_text('cover.png', encrypted, 'stego_encrypted.png')
# 提取并解密
extracted = decode_text('stego_encrypted.png')
print("提取加密内容:", extracted)
decrypted = decrypt_message(extracted, key)
print("解密后:", decrypted)

安全提示

  • AES密钥不应硬编码在代码中
  • 实际应用中建议使用更长的密钥(32字节)
  • 考虑添加CRC校验对抗像素篡改

常见问题与避坑指南

Q1:JPEG图片为什么不能用?
JPEG压缩会改变像素值,破坏LSB数据,必须使用PNG/BMP等无损格式,或使用频域隐写算法(如DCT)适用于JPEG。

Q2:隐藏后图片大小为什么变了?
某些图像库在保存时会自动优化调色板或压缩,建议显式指定img.save('output.png', 'PNG', optimize=False)

Q3:如何抵抗统计检测?

  • 使用伪随机算法选择嵌入像素(如基于密钥的序列)
  • 限制修改比例(例如仅修改10%像素)
  • 结合纠错码提高鲁棒性

Q4:彩色与灰度图区别?
彩色图有3倍于灰度图的容量,但部分隐写工具只支持RGB模式,灰度图每个像素只有一个通道,算法更简单。


SEO优化问答集锦

Q:Python隐写术能隐藏多大文件?
A:容量公式:(图片宽度 × 高度 × 通道数) / 8 字节,例如800×600的RGB图可存储约180KB数据。

Q:如何检测图片是否被隐写?
A:使用RS分析法(Regular/Singular groups)检测LSB异常,入门级检测可用stegdetect工具,但加密后的隐写更难被检测。

Q:有没有更高级的Python隐写库?
A:推荐Stegano(支持LSB和DCT)、stegolib(含多种算法),以及imagehide(支持密码保护)。

Q:隐写术合法吗?
A:取决于用途,用于学术研究、安全审计是合法的;用于窃取数据或隐藏非法内容则违法,请遵守本地法律。

Q:移动端能用Python实现隐写吗?
A:可以使用Pillow的Android版本(通过kivy部署),或改用Android原生Java/Kotlin实现,Java的Steganography库更成熟。

抱歉,评论功能暂时关闭!