tgaloppo/stegasaurus

GitHub: tgaloppo/stegasaurus

一个使用 STC 和随机化 Huffman 编码的无签名图像隐写工具,可将加密载荷自适应地嵌入图像纹理丰富区域。

Stars: 0 | Forks: 0

# Stegasaurus Stegasaurus 是一个隐写术工具,用于将加密的消息 payload 嵌入到图像中。它使用 Syndrome-Trellis Codes 和局部方差成本函数将消息隐藏在纹理复杂的区域中。此外,还应用了随机化 Huffman 编码以实现无签名嵌入:Stegasaurus 不使用固定的标记或头部元素。Stegasaurus 完全使用 Julia 编写。 ## 示例 | 原图 | 嵌入后 | 差异 | | :---: | :---: | :---: | | ![Original](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ebf6d3a1db072036.png) | ![Embedded](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/07f7d3e27c072037.png) | ![Difference](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ecbd10a906072038.png) | | *空* | *包含演讲* | *差异* | 上面的“嵌入后”图像包含了 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编码, 隐写术, 隐私保护, 隐私保护