ElCruncharino/neostego
GitHub: ElCruncharino/neostego
一款基于 OpenStego 的现代隐写术与水印工具,提供内容自适应数据隐藏和鲁棒盲水印功能,支持图像与音频载体。
Stars: 0 | Forks: 0
# NeoStego
NeoStego 是一款隐写术应用程序,提供两项功能:
1. 数据隐藏:可以在图像文件中隐藏任何数据。
2. 水印:使用不可见签名对图像文件添加水印。可用于检测未经授权的文件复制。
## 关于此 fork
NeoStego 是由 Samir Vaidya 开发的 [OpenStego](https://www.openstego.com) 的下游分支,它提供了
现代化的桌面体验和全新的 Android 应用。磁盘上的隐写格式保持不变,
因此由以前版本的 OpenStego 创建的文件仍然完全可读,并且未加密的输出
与上游 OpenStego 保持兼容(回归测试会强制执行此操作)。
此分支中的更改:
- 通过 [FlatLaf](https://www.formdev.com/flatlaf/) 外观体验实现了现代化、跨平台的 UI,
带有可选的浅色和深色主题(在多次运行之间保持记忆)。
- 原生操作系统文件对话框(Windows 资源管理器 / 原生桌面选择器),用于打开
和保存文件,此外还支持将文件拖放到字段中,以及密码字段上的显示按钮。
- 对新加密数据使用更强的加密:采用带有随机盐和高
迭代次数的 PBKDF2-HMAC-SHA256,结合 AES-GCM 认证加密。旧版本
加密的数据仍会自动解密。因此,上游原版
OpenStego 无法读取新加密的输出;在需要互操作性时,请传递 `--legacyencrypt` (CLI) 以写入原始格式。
- 更具抗检测性的数据隐藏算法:`RandomLSBMatch` 使用 LSB 匹配 (±1)
代替 LSB 替换,这消除了 RS / 样本对 /
卡方隐写分析(例如 StegExpose)所依赖的结构伪影,同时仍可被正常的提取器读取。
- 内容自适应算法:`Adaptive` 将 HILL 代价函数与 Syndrome-Trellis
Codes (STC) 相结合,将 ±1 的变化集中在纹理丰富且难以建模的区域,并最大限度地减少
总嵌入失真。它是 Android 应用中的默认算法。在对 1,000 张
BOSSbase 1.01 图像以约 0.4 bpp 进行的基准测试中,StegExpose 标记了 0.3% 的 `Adaptive` 隐写图像 —
与纯净载体对照组相同,而普通 LSB 替换的比例为 99.5%。这提高了抵御
现代(包括基于 CNN 的)隐写分析的门槛;但这并不能使嵌入变得完全无法检测。
- 现代且鲁棒的水印算法:`DWTSVD` 是数字水印的默认算法。与
传统的扩频 DWT 插件(Dugad/Kim/Xie)不同,后者仅通过相关性来*检测*
密码键控模式的存在,`DWTSVD` 嵌入了一个实际的多位 payload,
可以**盲**恢复(无需原始图像)并在常见的处理中存活下来。它对亮度
的 level-1 DWT 近似 (LL) 子带的 8×8 块的
最大奇异值进行量化 (QIM),使用 Reed–Solomon 纠错保护 payload,并使用密码派生密钥对代码位进行加扰和
重复平铺。QIM 步长与
全局增益线性参考(块间的平均奇异值 μ)成正比 — 这是一种 Rational Dither
Modulation 思想 — 因此全局的**亮度/曝光**变化会同时缩放信号和
量化区间,从而保留水印。在默认强度下,它以
~40 dB PSNR 嵌入,并在 JPEG 重新压缩(低至 Q50)、
加噪、模糊、重采样和全局亮度缩放下清晰地恢复水印(对 7 个载体进行的基准测试
在所有这些处理中检测率为 100%,且零位错误)。传统的 DWT 插件仍然可以通过
命令行使用。可复现的鲁棒性基准测试位于
[`benchmark/watermark`](benchmark/watermark)。它还容忍**小幅度的纯裁剪**(在不重新缩放的情况下修剪适度的边框,这是一种常见的“裁剪边缘并重新保存”的编辑方式):提取过程会搜索
较小的网格相位和块原点偏移以重新同步块网格,并且代码位
通过绝对的、与大小无关的键控映射进行平铺,以便在裁剪后存活下来的块仍然可以解码
(裁剪鲁棒性是盲水印已知的弱点)。至于其他非神经盲方案,大幅度的
**对比度**变化只能得到部分处理(对比度是围绕均值的仿射偏移,
μ-归一化无法完全抵消),而较大的几何去同步(大幅裁剪、裁剪
**外加**重新缩放、大幅旋转/缩放到不同尺寸)仍然超出范围。
- **音频数据隐藏。** 一种新的 `WavLSB` 算法将数据隐藏在未压缩的 **WAV** 载体的每个
整数 PCM 样本的最低有效位中。输出是
格式相同的 WAV,仍然可以正常播放,并且压缩/加密的工作方式与图像
算法完全一样。有损/压缩音频(MP3、AAC、Ogg)本质上无法携带 LSB 数据。
- **更多载体格式和保真度。** 可以读取 **WebP** 载体(输出保持为无损 PNG)。
载体内嵌的 **ICC 颜色配置文件**现在会带入到数据隐藏和水印的
输出中,水印到 JPEG 的 Alpha 图像将被扁平化而不是报错,JPEG 输出质量
是可选的(`--quality` / 滑块),并且单个文件名可以包含 `;` 列表分隔符。
过大的 payload 会因明确的容量/堆内存消息而失败,而不是抛出 `OutOfMemoryError`。
- 命令行解析由 [picocli](https://picocli.info/) 处理;插件 SPI 不再依赖于
任何命令行类型。
- 构建和运行时更新至 Java 21,Gradle、依赖项和 CI 均已刷新,且没有 Gradle
弃用警告。
- 重构为 Gradle 模块,以便隐写术/加密逻辑可以在桌面之外重用:
- `core` — 平台无关的算法、加密和插件 SPI(无 AWT/Swing)。
- `desktop` — Swing GUI 和命令行界面。
- `android` — 基于 `core` 构建的 Kotlin/Jetpack Compose Android 应用(隐藏/提取 + 加密)。
## 构建
桌面应用程序和 CLI 发行版:
```
./gradlew clean :desktop:dist (Linux / macOS)
gradlew clean :desktop:dist (Windows)
```
Android 调试 APK(需要 Android SDK;在 `local.properties` 中将其路径设置为 `sdk.dir=...`):
```
./gradlew :android:assembleDebug
```
## 用法
### 对于 GUI:
如果您使用了安装程序,请使用 OpenStego 的菜单快捷方式。对于 zip 下载,请使用附带的批处理文件或 shell 脚本来启动 GUI。
```
neostego.bat (Windows)
```
```
./neostego.sh (Linux / MacOS)
```
### 对于命令行界面:
请参阅[在线文档](https://www.openstego.com/cmdline.html)。
## 开发
Fork 该代码仓库,在本地克隆它并执行以下命令以完全构建它:
```
gradlew clean dist (Windows)
```
```
./gradlew clean dist (Linux / MacOS)
```
*注意:* 只有在 Windows 环境上执行构建时才会生成 Windows 安装程序。它需要安装 [Inno Setup](https://jrsoftware.org/isdl.php),并且 `iscc.exe` 必须在 `PATH` 中。如果您不想生成 Windows 安装程序,可以使用以下命令跳过该步骤:
```
./gradlew clean dist -x distWin
```
## 限制
- **无损保存和分享。** 隐藏的数据存在于载体的最低有效位中,因此
输出必须保持为无损格式 — 图像使用 PNG,音频使用未压缩的 WAV。
将隐写文件重新编码为 JPEG、MP3 — 或任何其他有损格式,包括某些聊天应用
在发送“照片”时应用的自动重压缩 — 都会破坏隐藏的数据。请将
文件作为文档分享,而不是作为照片。
- **容量需要成比例的较大载体。** 数据隐藏将 payload 存储在载体的
样本中(大约每 ~3 个图像像素或每 8 个音频样本存储一个 payload 字节),因此大文件
需要大载体;过大的 payload 会快速失败并给出明确的提示,而不是崩溃。
- **透明度被保留,但未被使用。** 具有 Alpha 通道的图像在整个
嵌入/提取往返过程中会保留它;数据仅隐藏在 RGB 通道中,从不在 Alpha 中。完全
透明的像素仍然在它们(不可见的)颜色值中携带数据。
- **容量因算法而异。** 内容自适应算法以容量换取安全性,
可容纳的数据少于普通 LSB;一旦选择了载体图像,应用程序就会显示可用容量。
## 作者
- 原版 OpenStego:Samir Vaidya (samir [at] openstego.com)
- 此 fork:Nick Haghiri
## 主页
https://www.openstego.com(原项目)
## 许可证
这是 OpenStego 的修改版本,在 **GNU General Public License,
version 2** 下分发(参见 ```LICENSE``` 文件)。为了符合 GPL:保留了原始的版权声明,
此分支中更改的文件带有修改声明,并且此分支
完整的对应源代码即为本代码仓库的内容。
## 致谢
本产品中传统的扩频 DWT 水印插件(Dugad/Kim/Xie)基于 Peter Meerwald 提供的代码。请参阅他关于[水印](http://www.cosy.sbg.ac.at/~pmeerw/Watermarking/)的优秀论文:Peter Meerwald, Digital Image Watermarking in the Wavelet Transfer Domain, Master's Thesis, Department of Scientific Computing, University of Salzburg, Austria, January 2001。默认的 `DWTSVD` 水印是一种混合的 DWT–SVD 方案,对最大奇异值使用 QIM,这是一种成熟的鲁棒盲方法(参见例如 Kang, Zhao, Lin & Chen, *Multimedia Tools and Applications* 77, 2018,以及随后的 DWT–SVD–QIM 评估)。
### 隐写术和隐写分析算法
如果没有
Jessica Fridrich 的 [Binghamton University DDE Lab](https://dde.binghamton.edu/download/stego_algorithms/)
及其合作者发表的基础研究,NeoStego 中现代的数据隐藏和隐写分析功能就不会存在,他们的论文和参考实现定义了这个领域。DDE Lab 自己的
源代码由他们发布,仅供**研究和非营利使用**(DDE Lab 保留版权)。
相应的 NeoStego 插件是**根据发表的论文独立编写的干净 room 实现** — 它们实现了
下文所述的*方法*;未使用或派生任何 DDE Lab 源代码。引用:
- **`Adaptive`(内容自适应空间嵌入)** 实现:
- **HILL** 代价函数 — B. Li, M. Wang, J. Huang & X. Li, "A new cost function for spatial image steganography," *IEEE ICIP*, 2014; 以及
- 用于最小失真编码的 **Syndrome-Trellis Codes (STC)** — T. Filler, J. Judas & J. Fridrich, "Minimizing additive distortion in steganography using syndrome-trellis codes," *IEEE TIFS*, 2011。
- **`SI-UNIWARD` / `JpegUniward`(JPEG 域自适应嵌入)** 实现 **UNIWARD** — V. Holub, J. Fridrich & T. Denemark, "Universal distortion function for steganography in an arbitrary domain," *EURASIP Journal on Information Security*, 2014。
- **隐写分析基准测试套件**(`benchmark/`)重新实现了(仅用于评估)**DCTR** 特征(V. Holub & J. Fridrich, *IEEE TIFS*, 2015)、**SRM** 富模型和 **FLD 集成**(J. Fridrich & J. Kodovsky, *IEEE TIFS*, 2012/2013),以及 **SRNet** 检测器(M. Boroumand, M. Chen & J. Fridrich, *IEEE TIFS*, 2019)。
衷心感谢这些研究人员向社区公开了他们的研究成果。
标签:Android, DSL, JS文件枚举, 后台面板检测, 图像处理, 域名枚举, 密码学, 手动系统调用, 数字水印, 桌面应用, 隐写术