tgaloppo/stegasaurus
GitHub: tgaloppo/stegasaurus
一个使用 STC 和随机化 Huffman 编码的无签名图像隐写工具,可将加密载荷自适应地嵌入图像纹理丰富区域。
Stars: 0 | Forks: 0
# Stegasaurus
Stegasaurus 是一个隐写术工具,用于将加密的消息 payload 嵌入到图像中。它使用 Syndrome-Trellis Codes 和局部方差成本函数将消息隐藏在纹理复杂的区域中。此外,还应用了随机化 Huffman 编码以实现无签名嵌入:Stegasaurus 不使用固定的标记或头部元素。Stegasaurus 完全使用 Julia 编写。
## 示例
| 原图 | 嵌入后 | 差异 |
| :---: | :---: | :---: |
|  |  |  |
| *空* | *包含演讲* | *差异* |
上面的“嵌入后”图像包含了 JFK 1962 年在莱斯大学的演讲全文。演讲文本为 12178 字节,未压缩的图像大小约为 936 kbytes。payload 占用了约 10.2% 的可用容量,并需要修改约 3.8% 的图像字节,实现了几乎每字节修改包含 2.7 个消息比特。差异图像突出显示了隐藏信息的像素,清楚地展示了 syndrome-trellis codes 和逆方差成本函数如何将数据隐藏在图像中纹理最丰富的区域。要恢复演讲内容,请运行提取命令:
```
$ julia --project=. src/stegasaurus.jl extract assets/moon-embedded.png
Password: stegasaurus
```
## 技术规格
Stegasaurus 由以下算法组件构成:
### Syndrome-Trellis Codes (STC)
Stegasaurus 使用 Syndrome-Trellis Codes 来寻找消息 payload 的最低成本嵌入。虽然目前不具备自适应性,但生成多项式可在源码级别进行配置。
### 成本函数
使用的成本函数是以每个像素为中心的 5x5 像素块的逆局部方差。其目标是优先选择高变化区域的像素。
### 置换
在嵌入之前,像素会通过 Fisher-Yates 洗牌算法使用加密安全的 PRNG (AES-256-CTR) 重新排序。这在空间上分散了像素,为 STC 过程提供了更多机会,同时为编码增加了一层随机性。
### Payload 加密
在编码之前,对 payload 应用 AES-256-CBC 加密。
### Huffman 编码 / 无签名嵌入
使用 257 个符号生成随机化 Huffman 编码。第 257 个符号用作消息结束标记,以便在解码时识别消息是否完成。这使得消息在嵌入时不需要针对长度、起始位置或结束位置使用固定标记。随机化是通过加密安全的 PRNG (AES-256-CTR) 实现的,并有效地在 257 个符号的字母表上创建了一个凯撒密码。重要的是,Huffman 编码并非用于压缩目的;其唯一目的是允许无签名嵌入。
### LSB 匹配
Stegasaurus 使用 LSB 匹配($\pm 1$),随机递增或递减像素值以匹配所需状态。这避免了在直方图或卡方分析中极易被检测到的非对称配对。
## 已知弱点
当前的实现从密码本身派生出一个 salt 值;这意味着如果多次使用相同的密码,将重复相同的 Huffman 编码和置换。强烈建议每次嵌入时使用唯一的密码。
## 安装
Stegasaurus 是使用 Julia 1.12.6 编写的。克隆仓库并实例化环境以下载所需的加密和图像处理依赖项。
```
git clone https://github.com/tgaloppo/stegasaurus.git
cd stegasaurus
julia --project=. -e 'using Pkg; Pkg.instantiate()'
```
## 用法
### 嵌入
将消息 "Hello World!" 嵌入到图像 "test.jpg" 中,并生成图像 "hello.png":
```
julia --project=. src/stegasaurus.jl embed -m "Hello World!" test.jpg hello.png
```
将文件 "secret_recipe.txt" 嵌入到图像 "test.jpg" 中,并生成图像 "recipe.png":
```
julia --project=. src/stegasaurus.jl embed -f secret_recipe.txt test.jpg recipe.png
```
**重要提示**:您**必须**使用具有**无损**压缩的输出图像格式。使用非无损压缩将损坏嵌入内容。
### 提取
将文件 "secret.png" 中嵌入的 payload 提取到文件 "output.txt" 中:
```
julia --project=. src/stegasaurus.jl extract secret.png output.txt
```
仅在**提取**期间,如果未指定输出文件,输出将打印到 stdout。
如果未找到消息或密码不正确,该工具将仅报告未找到消息。
标签:Fisher-Yates洗牌算法, Julia, meg, STC, Stegasaurus, Syndrome-Trellis Codes, Syndrome-格码, 信息安全, 信息隐藏, 内容自适应隐写, 加密载荷, 动态Huffman编码, 图像处理, 图像隐写, 密码学, 局部方差, 开源, 成本函数, 手动系统调用, 数据隐藏, 文本嵌入, 无签名隐写, 网络安全, 网络安全, 随机Huffman编码, 隐写术, 隐私保护, 隐私保护