StegaPy 是一个基于 Python 的图像隐写与数字水印工具。隐写术(Steganography)将秘密信息藏匿于普通载体图像之中,使其在视觉上与原图无异;数字水印则通过在图像中嵌入不可见标记,用于版权归属验证。
本项目参考 OpenStego 进行 Python 重写,复现了原版核心算法,并引入插件化架构、随机散布隐写、Web 交互界面与命令行接口等扩展。
- 插件化架构:LSB、RandomLSB、DWT-Dugad 三种算法通过统一接口接入,可灵活扩展新算法
- 随机散布隐写(RandomLSB):以密码学伪随机序列打乱位写入顺序,有效抵抗针对顺序 LSB 的卡方统计攻击
- AES 加密 + Gzip 压缩:支持 AES-128/256 对载荷加密,Gzip 自适应压缩显著扩大有效荷载空间
- Web 可视化界面:基于 Streamlit 的交互式界面,支持拖拽上传与隐写前后图像差异对比
- 命令行接口(CLI):覆盖数据嵌入/提取与水印全流程,适合脚本自动化与批量处理
- 跨平台部署:支持本地直接运行、conda / pip 环境,以及 Docker 容器化一键启动
Conda(推荐)
conda env create -f environment.yml
conda activate StegaPypip
pip install -r requirements.txtstreamlit run app.py启动后在浏览器访问 http://localhost:8501。
交互模式:无参数启动,菜单引导操作,文件路径支持 Tab 补全。
python cli.py脚本模式:带参数直接执行,适合自动化调用。
# 隐写嵌入
python cli.py embed -i cover.png -m message.txt -o stego.png
python cli.py embed -i cover.png -m message.txt -o stego.png --algo randlsb -p <密码># 数据提取(--algo 须与嵌入时一致)
python cli.py extract -i stego.png -o output/ --algo lsb
python cli.py extract -i stego.png -o output/ --algo randlsb -p <密码># 数字水印:生成签名 → 嵌入 → 验证
python cli.py wm generate-sig -o sig.bin -p <密码>
python cli.py wm embed -i cover.png -s sig.bin -o stego.png -p <密码>
python cli.py wm verify -i stego.png -s sig.bin -p <密码>完整参数说明:python cli.py --help 或 python cli.py embed --help
docker-compose up -d # 构建并后台启动
docker-compose ps # 查看状态
docker-compose down # 停止并移除首次启动会自动构建镜像,需要数分钟,完成后访问
http://localhost:8501。
容器内使用 CLI:docker-compose 已将项目目录挂载至容器 /app。
# Web 容器运行时直接进入执行
docker exec stegapy python cli.py embed \
-i /app/cover.png -m /app/message.txt -o /app/stego.png
# 不依赖 Web 容器的单次运行
docker run --rm -v $(pwd):/app stegapy \
python cli.py embed -i /app/cover.png -m /app/message.txt -o /app/stego.png路径均使用容器内路径(
/app/...),输出文件写回挂载目录,宿主机可直接访问。
项目提供完整的端到端测试,覆盖 Python API 与 CLI 两层:
# 运行全部测试
pytest tests/test_e2e.py -v
# 只跑某一类
pytest tests/test_e2e.py -v -k "LSB"
pytest tests/test_e2e.py -v -k "CLI"测试覆盖范围:LSB / RandomLSB / DWT-Dugad 完整嵌入提取往返、AES 加密、PSNR 图像质量断言、密码错误异常、CLI 全子命令。
-k "LSB" 过滤结果:
-k "CLI" 过滤结果:
StegaPy/
├── StegaPy/ # 核心包
│ ├── StegaPy.py # 主调度类(压缩/加密/插件调用)
│ ├── config.py # 全局配置
│ ├── plugin_manager.py # 插件注册与查找
│ ├── plugin/ # 算法插件(LSB、RandomLSB、DWT-Dugad)
│ └── util/ # 工具类(图像处理、AES 加密、DWT 变换等)
├── app.py # Streamlit Web 应用
├── cli.py # 命令行接口(无参数 = 交互模式,带参数 = 脚本模式)
├── tests/ # 端到端测试(pytest)
├── data/ # 测试用载体图像与示例文本
├── Dockerfile
├── docker-compose.yml
└── requirements.txt
本项目采用 GNU 通用公共许可证 v2.0 (GPL-2.0),详见 LICENSE。
本项目参考 OpenStego 进行重写,感谢原项目作者:
- Samir Vaidya (@syvaidya)
- 张泽龙 (@superzhangzl)
数字水印算法参考:Peter Meerwald, Digital Image Watermarking in the Wavelet Transfer Domain, University of Salzburg, 2001.
如有问题或建议,欢迎通过 GitHub Issues 反馈。
本项目仅供学习与合法用途,请勿用于任何违法活动。